浅谈VB60中的实用技巧Word文件下载.docx
《浅谈VB60中的实用技巧Word文件下载.docx》由会员分享,可在线阅读,更多相关《浅谈VB60中的实用技巧Word文件下载.docx(65页珍藏版)》请在冰豆网上搜索。
但有一个问题值得注意,而类似文本框这样的控件无
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
CB_SETCURSEL,NewIndex,0&
CB_GETCURSEL,NewIndex,0&
EndFunction
调整Combo下拉部分的宽度
USER32"
_
(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
设置Combo下拉的宽度
PublicFunctionSetDropdownWidth(cboHwndAs_
Long,NewWidthPixelAsLong)AsBoolean
lRetVal=SendMessage(cboHwnd,_
CB_SETDROPPEDWIDTH,NewWidthPixel,0)
SetDropdownWidth=True
SetDropdownWidth=False
Combo的自动查询技术
DeclareFunctionSendMessageLib"
(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
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
Combo1.SelStart=iStart
iLeftOff=0
静态变量iLeftOff指定了字符长度。
自动选择Text的内容
在使用VFP的应用进行录入时,每进入一个录入框,就自动选择
该框中的所有内容。
利用以下的代码,也可实现类似的功能。
PrivateSubMyTextBox_GotFocus()
AutoSelectMyTextBox
SubAutoSelect(SelObjectAsControl)
SelObject.SelStart=0
IfTypeOfSelObjectIsMaskEdBoxThen
SelObject.SelLength=Len(SelObject.FormattedText)
IfTypeOfSelObjectIsTextBoxThen
SelObject.SelLength=Len(SelObject.Text)
捕捉MouseExit事件
MouseDown、MouseUp、MouseMove。
VB似乎提供了很好的Mouse事件。
但好象还缺少什么!
对!
还差MouseExit(鼠标移出)事件。
在VB中,我
们要捕捉MouseExit事件,必须用API函数:
PrivateDeclareFunctionSetCaptureLib"
(ByValhWndAsLong)
AsLongPrivateDeclareFunctionReleaseCaptureLib"
()AsLong
然后,我们可以在控件(以Picture1为例)的MouseMove事件上加上以下代码:
DimMouseExitAsBoolean
MouseOver=(0<
=X)And(X<
="
Picture1.Width)"
And(0<
Y)"
And(Y<
Picture1.Height)<
Br"
IfMouseExitThen
……..
SetCapturePicture1.hWnd
ReleaseCapture
如何让文本框输入完后,直接跳入下一行?
我们在编制程序的时候,特别是数据库软件,经常会遇到这样一个问题:
在文本框中输入完后,用户习惯性的按下回车键。
但是系统“嘀”的一声,
并没有象想象那样跳入下一行或者其他的什么。
那么能不能让程序在输入完
后干其他的事呢?
试一试下面的代码吧。
SubText1_keyPress(KeyAsciiAsInteger)
IfKeyAscii=13Then
SendKeys"
如何强制文件对话框再次读取正确的磁盘?
如果构造了一个以通用对话框为模型的简单对话框(通常应使用通用对话框
的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
其中①当驱动器发生更改时,改变目录路径;
②更改路径。
2、目录更改事件过程
SubDirlchange()
Filel.Path=Dirl.Path
该事件过程是对目录发生更改时,作出文件路径更改的响应。
3、文件列表单击事件
SubFilel-click()
Imagel.Picture=loadpicture(Filel.path+”\”+Filel.FileName)
单击任一图形文件名时,在image控件框上显示图像。
4、命令按钮控件
SubCommand1-click()
F1$=Filel.Path+”\”+FileName
End
SubCommand2-click()
F1$=””
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=”请输入”
PrivateSubGridl-KeyPress(KeyAsciiAsInteger)
Text1.StFocus
Textl.SelStart=0
IfKeyAscii<>EnterAscAndKeyAscii<>TabAscThen
SendKeysChr(KeyAscii)
EndIF
PrivateSubGridl-RowColChange()
Textl.Text=Grid1.Text
PrivateSubText1-KeyPress(KeyAsciiAsInteger)
IfKeyAscii=EnterAscThen
Grid1.SetFocus
KeyAscii=0
PrivateSubText1-LostFocus()
Grid1.Text=Text1.Text
如何使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)‘删除最后一个字符
Grid.Text=Grid.Text+Chr$(KeyAscii)
Endif
SubGrid-RowColChange()
Wgrid.Col%=Grid.Col
Wgrid.Row%=Grid.Row
这样就可以实现对网格的任意输入,可以输入字符、数字等等。
由于数字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