浅谈VB60中的实用技巧.docx

上传人:b****5 文档编号:4178371 上传时间:2022-11-28 格式:DOCX 页数:65 大小:62.84KB
下载 相关 举报
浅谈VB60中的实用技巧.docx_第1页
第1页 / 共65页
浅谈VB60中的实用技巧.docx_第2页
第2页 / 共65页
浅谈VB60中的实用技巧.docx_第3页
第3页 / 共65页
浅谈VB60中的实用技巧.docx_第4页
第4页 / 共65页
浅谈VB60中的实用技巧.docx_第5页
第5页 / 共65页
点击查看更多>>
下载资源
资源描述

浅谈VB60中的实用技巧.docx

《浅谈VB60中的实用技巧.docx》由会员分享,可在线阅读,更多相关《浅谈VB60中的实用技巧.docx(65页珍藏版)》请在冰豆网上搜索。

浅谈VB60中的实用技巧.docx

浅谈VB60中的实用技巧

浅谈VB6.0中的实用技巧

VB6.0中文本框处理技巧

在VisualBasic中,文本框(TextBox)是最常用的控件,熟练运用文本框

是开发出高质量的应用程序的基础。

笔者在从事应用程序开发中,摸索出有关文

本框的应用技巧,写出来与VB爱好者共享。

1、设置只读文本框。

有些时候在窗口显示一段信息,但又不希望用户去改变它,怎样实现文本的

只读呢?

首先,我们可以利用标签框(label)的只读属性,以标签来代替文本

框以实现只读属性,但也可以用小程序实现真正的文本框的只读。

SubText1_KeyPress(keyasciiAsInteger)

keyascii=0

EndSub

或者也可以用sendkey方法使文本框失去焦点,如以下程序:

SubText1_KeyDown(KeyCodeAsInteger,ShiftAsInteger)

SendKeys"{tab}"

EndSub

2、限定文本框的输入内容和格式。

以下程序可以实现限定文本框只能输入数字:

SubText1_KeyPress(keyasciiAsInteger)

Ifkeyascii<48Orkeyascii>57Then

Beep

Beep

johny@

keyascii=0

EndIf

EndSub

若想限定文本框输入格式,可以使用VB的FORMAT函数,也可以使用专业版的

屏蔽控件(MaskedEdit),通过设定屏蔽控件的Mask属性可以对文本框的输入格式

作精确控制。

 

3、为TextBox创建快捷键。

VB规定,添加在窗体上的控件均在其Tabindex属性中记载其加载顺序,程序

运行时焦点按Tabindex属性规定的顺序在控件间跳转。

而为了简化操作,可VB中

为任何具有caption的属性的控制创建快捷键,这通过caption属性中在想作为

快捷键的字母前加&号实现。

但有一个问题值得注意,而类似文本框这样的控件无

caption这样的属性,这时可将标签与文本框同时使用。

为lable创建快捷键,

标签Tabindex属性设置比文本框小1,又因为label不能接收按点,焦点会自动

跳至文本框。

这相当于为文本框创建了快捷键。

具体步骤如下:

(1)首先绘制标签,再绘制文本框。

或随意绘制各种控制,将标签Tabindex

属性设置比文本框小1

(2)在标签的caption属性中使用“&”号设定快捷键

这样就相当于为文本框设定了快捷键,当你按下标签框的快捷键时,焦点就会跳

至文本框上。

 

4、在设计时实现文本框换行。

对于文本框,在设计时properties窗口不能输入换行符,但可以再程序执行时

用代码来换行,即使用ASCII字符的13和10,如下列小程序就可将两行文本放入文本框:

Subform_load()

NL=chr(13)+chr(10)

text1.text=“mynameis”&NL&“liuqiang”

Endsub

 

5、创建口令文本框。

创建口令文本框可用设置属性的方法,也可以通过调用WINDOWS的API应用函数接口

来实现。

首先,文本框的属性Passwordchar和maxlength可用来设置口令框。

其中Passwordchar指定文本框显示的字符,如指定“*”,则在文本框内显示“*”,

Maxlength确定文本框中能输入几个字符。

超过Maxlength以后,文本框发出警告声,

不能接收更多的字符。

若使用WINDOWS应用函数接口,可用GetWindowLong、

SetWindowsLong和SendMessage等接口函数来实现,有兴趣的读者可查阅Windows

API函数手册或VB的联机帮助文件就可以了。

改变ListIndex而不发生Click事件

在修改Combo或Listview的ListIndex时,会发生Click事件,

下面的函数可以阻止该事件。

声明:

PrivateDeclareFunctionSendMessageLib_

"user32"Alias"SendMessageA"(ByVal_

hWndAsLong,ByValwMsgAsLong,ByVal_

wParamAsLong,lParamAsAny)AsLong

ConstCB_GETCURSEL=&H147

ConstCB_SETCURSEL=&H14E

ConstLB_SETCURSEL=&H186

ConstLB_GETCURSEL=&H188

函数:

PublicFunctionSetListIndex(lstAsControl,_

ByValNewIndexAsLong)AsLong

 

IfTypeOflstIsListBoxThen

CallSendMessage(lst.hWnd,_

LB_SETCURSEL,NewIndex,0&)

SetListIndex=SendMessage(lst.hWnd,_

LB_GETCURSEL,NewIndex,0&)

ElseIfTypeOflstIsComboBoxThen

CallSendMessage(lst.hWnd,_

CB_SETCURSEL,NewIndex,0&)

SetListIndex=SendMessage(lst.hWnd,_

CB_GETCURSEL,NewIndex,0&)

EndIf

EndFunction

调整Combo下拉部分的宽度

声明:

PrivateDeclareFunctionSendMessageLib_

"USER32"Alias"SendMessageA"_

(ByValhwndAsLong,ByValMsgAsLong,_

ByValwParamAsLong,ByVallParamAsLong)AsLong

PrivateConstCB_GETDROPPEDWIDTH=&H15F

PrivateConstCB_SETDROPPEDWIDTH=&H160

PrivateConstCB_ERR=-1

函数:

'取得Combo下拉的宽度

'可以利用该函数比例放大或缩小宽度

PublicFunctionGetDropdownWidth(cboHwndAsLong)AsLong

DimlRetValAsLong

lRetVal=SendMessage(cboHwnd,CB_GETDROPPEDWIDTH,0,0)

IflRetVal<>CB_ERRThen

GetDropdownWidth=lRetVal

'单位为pixels

Else

GetDropdownWidth=0

EndIf

EndFunction

'设置Combo下拉的宽度

'单位为pixels

PublicFunctionSetDropdownWidth(cboHwndAs_

Long,NewWidthPixelAsLong)AsBoolean

DimlRetValAsLong

lRetVal=SendMessage(cboHwnd,_

CB_SETDROPPEDWIDTH,NewWidthPixel,0)

IflRetVal<>CB_ERRThen

SetDropdownWidth=True

Else

SetDropdownWidth=False

EndIf

EndFunction

Combo的自动查询技术

DeclareFunctionSendMessageLib"user32"Alias"SendMessageA"

(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,

lParamAsAny)AsLong

PublicConstCB_FINDSTRING=&H14C

PrivateSubCombo1_Change()

DimiStartAsInteger

DimsStringAsString

StaticiLeftOffAsInteger

iStart=1

iStart=Combo1.SelStart

IfiLeftOff<>0Then

Combo1.SelStart=iLeftOff

iStart=iLeftOff

EndIf

sString=CStr(Left(Combo1.Text,iStart))

Combo1.ListIndex=SendMessage(Combo1.hwnd,_

B_FINDSTRING,-1,ByValCStr(Left(_

ombo1.Text,iStart)))

 

IfCombo1.ListIndex=-1Then

iLeftOff=Len(sString)

combo1.Text=sString

EndIf

Combo1.SelStart=iStart

iLeftOff=0

EndSub

静态变量iLeftOff指定了字符长度。

自动选择Text的内容

在使用VFP的应用进行录入时,每进入一个录入框,就自动选择

该框中的所有内容。

利用以下的代码,也可实现类似的功能。

PrivateSubMyTextBox_GotFocus()

AutoSelectMyTextBox

EndSub

 

SubAutoSelect(SelObjectAsControl)

SelObject.SelStart=0

IfTypeOfSelObjectIsMaskEdBoxThen

SelObject.SelLength=Len(SelObject.FormattedText)

Else

IfTypeOfSelObjectIsTextBoxThen

SelObject.SelLength=Len(SelObject.Text)

EndIf

EndIf

EndSub

捕捉MouseExit事件

MouseDown、MouseUp、MouseMove。

VB似乎提供了很好的Mouse事件。

但好象还缺少什么!

对!

还差MouseExit(鼠标移出)事件。

在VB中,我

们要捕捉MouseExit事件,必须用API函数:

PrivateDeclareFunctionSetCaptureLib"user32"(ByValhWndAsLong)

AsLongPrivateDeclareFunctionReleaseCaptureLib"user32"()AsLong

然后,我们可以在控件(以Picture1为例)的MouseMove事件上加上以下代码:

DimMouseExitAsBoolean

MouseOver=(0<=X)And(X<="Picture1.Width)"And(0<="Y)"And(Y<="Picture1.Height)IfMouseExitThen

……..

SetCapturePicture1.hWnd

Else

……..

ReleaseCapture

EndIf

如何让文本框输入完后,直接跳入下一行?

我们在编制程序的时候,特别是数据库软件,经常会遇到这样一个问题:

在文本框中输入完后,用户习惯性的按下回车键。

但是系统“嘀”的一声,

并没有象想象那样跳入下一行或者其他的什么。

那么能不能让程序在输入完

后干其他的事呢?

试一试下面的代码吧。

SubText1_keyPress(KeyAsciiAsInteger)

 

IfKeyAscii=13Then

SendKeys"{tab}"

EndIf

EndSub

如何强制文件对话框再次读取正确的磁盘?

如果构造了一个以通用对话框为模型的简单对话框(通常应使用通用对话框

的OCX),会发现再次选择软盘驱动器并不实际.再次读盘,改变到C盘,并再次选择

A盘.只是使它读新软盘中的目录.

为了解决这个问题,在一个按钮的代码段中加入以下代码:

drive1.refresh

dir1.refresh

file1.refresh

VB6.0的OPEN对话框控件图示功能扩充

VisualBasicForWindows(VB)提供了丰富的控件,但其提供的公用

对话框控件在打开文件时(例如*.Bmp和*.Pcx等)不能显示文件内容即图

像,本文给出了一个实例,可以模拟一些图形软件包在打开文件的同时显示图

像,模拟和扩充OPEN控件功能。

为模拟的扩充OPEN功能,下面给出了一个完整的VB程序,实现方法如下:

一、建立窗体

首先建立一个窗体(窗体名为OPNFILE),窗体上包含驱动器列表、目录

列表、文件列表、两个命令按钮(确认、取消)和显示影像的控件(picture或image),

下面是这6个控件的建立方法和有关属性的改变。

1、DirvelistBox驱动器列表控件

双击驱动器列表控件,在窗体上调准控件的位置,控件名称为“Drive1”。

2、DirlistBox目录列表控件

双击目录列表控件,在窗体上调准控件的位置,控件名称为“Dirl”

3、FilelistBox文件列表控件

双击文件列表控件,在窗体上调准控件的位置和尺寸,控件名称为“Filel”,

修改“Pattern”属性为“*.bmp,*.pcx”。

4、CommandButtom命令按钮控件

双击命令按钮控件,建立命令按钮,第一个取名为Command1,修改Caption

属性为“确认”,第二个取名为Command2,修改Caption属性为“取消”。

5、显示影像的控件

既可以选picture控件,也可选image控件显示图像,以image控件为例。

双击

image控件,调准矩形框的大小和位置,取名为imagel,设置strtch属性。

Strech=false时,图形以原尺寸显示。

二、事件过程的建立

1、驱动器更改事件过程

SubDrive-change()

①Dirl.Path=Drivel.Drive

②ChDrive.Path=Drivel.Drive

EndSub

其中①当驱动器发生更改时,改变目录路径;②更改路径。

2、目录更改事件过程

SubDirlchange()

Filel.Path=Dirl.Path

EndSub

该事件过程是对目录发生更改时,作出文件路径更改的响应。

3、文件列表单击事件

SubFilel-click()

Imagel.Picture=loadpicture(Filel.path+”\”+Filel.FileName)

EndSub

单击任一图形文件名时,在image控件框上显示图像。

4、命令按钮控件

SubCommand1-click()

F1$=Filel.Path+”\”+FileName

End

EndSub

SubCommand2-click()

F1$=””

EndSub

F1$为选择文件名称,供软件使用,若用户单击“取消”按钮,F1$为空串。

单击驱动器名可以改变驱动器,单击目录列表中某一目录可以更改目录,单击

某一图形文件可以显示图形,在文件列表中按“↑”或“↓”键,可以随着文件名

的变化,图像框中的图形也随之发生更改。

F1$可以供应用程序调用,其中包含驱动器名、目录和文件名。

VB6.0网格中输入数据

VISUALBASIC提供的网格控制(Grid)主要是用来直观地输出数据,但不能

输入数据,使用起来很不方便。

能不能向网格中输入数据呢?

笔者提出了两种解决

方法,供大家参考:

方法一:

改写网格的KeyPress事件,在每次有合法字符输入时,把Grid的Text项和输

入字符连接。

这种方法缺点是:

一代码较复杂,需要处理各种ASCII字符信息;

二是通过编程只能实现很少的编辑功能,如用退格键删除前一字符,用Del键删除

所有字符;三是这种方法不能输入汉字,使用起来受到很大的限制。

方法二:

利用一文本框作为缓冲,实现编辑功能。

当网格改变行列时,把网格当前行列

的内容传递给文本框;当网格中有ASCII字符产生时,把输入焦点设置为文本框,

并把输入的ASCII字符送给文本框;当编辑完文本框的内容时,按Enter键或TAB键,

把文本框的内容送给网格的当前行列,并把输入焦点设置为网格。

如下程序所示

(其中Textl为文本框,Labell为标签,Gridl为网格):

OptionExplicit

ConstEnterAsc=13

ConstTabAsc=9

PrivateSubForm-Load()

Labell.Caption=”请输入”

EndSub

PrivateSubGridl-KeyPress(KeyAsciiAsInteger)

Text1.StFocus

Textl.SelStart=0

IfKeyAscii<>EnterAscAndKeyAscii<>TabAscThen

SendKeysChr(KeyAscii)

EndIF

EndSub

PrivateSubGridl-RowColChange()

Textl.Text=Grid1.Text

EndSub

PrivateSubText1-KeyPress(KeyAsciiAsInteger)

IfKeyAscii=EnterAscThen

Grid1.SetFocus

KeyAscii=0

EndIf

EndSub

PrivateSubText1-LostFocus()

Grid1.Text=Text1.Text

EndSub

如何使VB的网格控件具有输入功能

我们在使用VisualBasicforWindows开发时,经常用到网格控件(Grid.vbx),

因为此控件可以用来作类似于电子表格形式的输出表,且编程简单,但在此网格控件

只有输出功能,而不能直接在网格上输入,这给使用者带来一些不便。

如何在执行时

向网络控件中输入数据,人们使用了一些方法,但大都使用一文本控件作中间转换,

即将欲输入的信息先输入到该文本控件,然后将文本控件的TEXT属性赋给网格的TEXT

属性,这种方法尽管解决了向网格输入数据问题,但增加了一文本框,对界面有些不

美观,修改部分数字不方便,且影响速度,那么,如何直接向网格输入数据呢?

本文将解决直接向网格输入数据问题,基本思想是:

使用网格控件KeyPress事件,

从键盘上接收所击键位的KeyAscii值,再由Chr$()或Chr()函数转换成字符,

然后读出网格单元的当前Text值与由键盘接收到的字符相加,组成新的字符串,再赋给

该单元的Text属性,即Grid.Text=Grid.Text+Chr$(KeyAscii)。

程序清单如下:

程序中定义了两个Form级变量WgridCol%和WgridRow%。

SubGrid-KeyPress(KeyAsciiasInteger)

Grid.Col=WgridCol%

Grid.Row=WgridRow%

ifKeyAscii=8Then`keyascii=8为退格删除键

ifGrid.Text<>””ThenGrid.Text=Mid$(Grid.Text,

1,Len(Grid.Text)-1)‘删除最后一个字符

Else

Grid.Text=Grid.Text+Chr$(KeyAscii)

Endif

EndSub

SubGrid-RowColChange()

Wgrid.Col%=Grid.Col

Wgrid.Row%=Grid.Row

EndSub

这样就可以实现对网格的任意输入,可以输入字符、数字等等。

由于数字0到9的

Ascii值为48到57,小数点Ascii的值为46,所以可以输入任意实数。

若您想防止用户

输入除数字、小数点以外的任何其他字符,可对来自于键盘的Ascii值进行判断,有条

件地接收,就实现了仅输入数值字符。

同理也可以限制只输入字母字符。

根据这种思想,也可以对VB中一切不具有输入功能,但具有KeyAscii或者KeyDown

事件的控件进行直接输入,如标签Label等。

防止文本控件中的部分滚动

大家知道,WindowsAPI的SendMessage函数可以用来向VisualBasic

控件中发送消息,例如向文本框控件上发送消息。

现介绍如何利用该函数防

止文本框控件中的部分文本滚动,即该控件中不能滚动的部分不能被用户看

见。

发送消息到文本框控件

VisualBasic中的文本框控件就是一个最小化的字处理程序。

当该文本

控件的MultiLine属性被设置为True的时候,则文本可以自动换行;当在文本

框控件中键入了许多文本时,控件中的文本会向上滚动。

这时文本就变得看不

到了,但这些文本实际上仍然在控件中——它们并没有被删除。

WindowsAPI的SendMessage函数可以用来防止文本框控件中的文本滚动

因而超出我们的视线。

当创建该文本框控件时,它的客户区域格式化为一个矩

形(该区域就是键入文本的地方),可以给该控件发送EM_SETRECTNP消息,对

该矩形区域进行限制,以在文本框的客户区域中指定一个特定区域。

在下面的样例程序中,我们希望文本控件的后一半原封不动地保持完整,

即不希望文本滚动而超出视线。

可以从文本框控件的Height属性中提取出它的

高度,并将该值除以2,得到该文本框控件后一半的坐标。

然后将该结果传递给

SendMessage函数,告诉EM_SETRECTNP防止该矩形区域滚动。

有些程序员可能会希望使用EM_SETRECT消息代替EM_SETRECTNP消息。

但是,

使用EM_SETRECT消息会停止Windows对该格式化矩形区域中的文本的重新绘制,

导致文本框控件中的文本会看不到。

 

样例程序

该程序显示了如何临时冻结一个文本框控件中的特定部分,该部分包含的文本

不能滚动,因而不会超出视线之外。

1.在VisualBasic中开始一个新的工程,采用缺省的方法建立Form1。

2.将如下常量和声明语句添加到Form1的通用声明部分中(注意该声明语句需

要书写在一行内):

PrivateDeclareFunctionSendMessageLib"User"

(ByValhWndAsInteger,ByValwMsgAsInteger,

ByValwParamAsIntege

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 交规考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1