VB编程的必备技巧.docx
《VB编程的必备技巧.docx》由会员分享,可在线阅读,更多相关《VB编程的必备技巧.docx(9页珍藏版)》请在冰豆网上搜索。
VB编程的必备技巧
VB编程的必备技巧
----对编程者来说,VB很容易上手,但要深入、灵活地驾驭它还要下一番功夫。
笔者在这里介绍几个较为典型的编程技巧,希望能对广大VB爱好者有所帮助。
----一.怎样创建自定义的光标
----1.当在设计一个应用程序时,VisualBasic允许程序员将许多控件的MousePointer属性设计成12个预先定义好的鼠标光标之一。
然而,有些程序员或许会希望显示一个预定义形状之外的光标。
本文说明如何创建一个不同的鼠标指针(光标),包括为一个没有MousePointer属性的控件创建光标。
----要在VisualBasic应用程序中将光标(鼠标指针)改变成个不同的形状,可以添加代码来改变希望监视的控件的MouseMove和DragOver事件。
----MouseMove事件所包含的代码用于触发该控件的Drag方法。
当鼠标在被选中的控件上移动的时候,轮流显示新的鼠标指针。
当鼠标指针离开该控件时,则DragOver事件被触发。
在VisualBasic程序中,可以重新复位此Drag属性,以便以前的鼠标指针能够被再次显示出来。
----2.下面的样例程序实现当鼠标指针移动到一个文件列表框控件上时,将其改变成不同的形状。
----首先采用缺省的方法建立Form1。
在Form1上添加一个文件列表框控件,采用缺省的方法建立File1。
将File1控件的DragIcon属性设置为所选择的.ICO文件。
----将如下代码添加到File1的MouseMove事件中:
PrivateSubFile1-MouseMove(ButtonAs
Integer,ShiftAsInteger,XAsSingle,YAsSingle)
File1.Drag1'iconon
EndSub
----将如下代码添加到Form1的DragOver事件中:
PrivateSubForm-DragOver(SourceAsControl,
XAsSingle,YAsSingle,StateAsInteger)
File1.Drag0′iconoff
EndSub
----按下F5功能键执行此程序。
得到的运行结果是:
将鼠标指针移动到该文件列表框控件上时,程序将把所选中的.ICO文件作为缺省的鼠标光标;将鼠标指针离开该控件时,光标则会自动恢复为缺省的形状。
----二.怎样在窗体上点鼠标右键产生一个弹出式选单(PopUpMenu)?
----大家都知道,在Windows95/98/2000的桌面和许多流行软件的视窗中,当我们点鼠标右键时,会在鼠标的当前位置弹出一个快捷选单。
许多爱好编程的朋友是不是也希望能在自己的程序里有类似的功能呢?
其实,这并不困难。
笔者经过一番努力,在VB下找出一个通用的方法,供大家分享。
----要实现上述功能,需分两个步骤:
----1.利用VB的选单编辑器(MenuEditor)编辑你希望弹出的选单及子选单,注意,要将选单的Visible属性设置为:
False。
----2.在窗体(Form1)的MouseDown事件中编写程序,来激发编辑好的选单,假设选单名为PopMenu,程序源码如下:
PrivateSubForm-MouseDown
(ButtonAsInteger,ShiftAsInteger,
XAsSingle,YAsSingle)
IfButton=vbRightButtonThen
PopMenu.Visible=True
PopupMenuPopMenu
EndIf
EndSub
----上述方法是针对窗体的,我们也可以针对任意控件,用鼠标右键点击控件时,也弹出一个快捷选单。
方法也很简单,只要把上述代码放到相应控件的MouseDown事件中,就可以了。
----三.怎样动态地在窗体上判断某区域内是否有控件存在?
----在笔者的一个小程序中,想在窗体的某个区域输出数据,这就要求在这个区域内不能有其他控件存在,那么,怎么才能知道在窗体的某个区域内,是否有控件存在呢?
----为了判断在窗体的某个区域中,是否含有控件,我们可以利用以下VB程序来实现:
FunctionGetControl(x1AsSingle,y1AsSingle,
x2asSingle,y2asSingle)AsControl
DimControlasControl
ForEachControlInForm1
WithControl
If(x1〈=.Left)And(x2〉=.Left)And_
(y1〈=.Top)And(y2〉=.Top)Or_
(x1〈=.Left+Width)And(x2〉=.Left+Width)And_
(y1〈=.Top)And(y2〉=.Top)Or_
(x1〈=.Left)And(x2〉=Left)And_
(y1〈=.Top+Height)And(y2〉=.Top+Height)Or_
(x1〈=.Left+Width)And(x2〉=.Left+Width)And_
(y1〈=.Top+Height)And(y2〉=.Top+Height)Then
SetGetControl=Control
ExitFunction
EndIfEndWith
Next
SetGetControl=Nothing
EndFunction
----注:
(x1,y1)和(x2,y2)分别为选定矩形区域的左上角和右下角点的坐标值。
----该程序通过计算窗体上所有控件的四个角的位置来判断控件是否与选定区域相交,并返回相交的控件。
----四.获取和修改计算机名字的方法
----在Win95/98/2000中,计算机有一个名字。
运行regedit,在"HKEY-LOCAL-MACHINE\System\CurrentControlSetcontrol\ComputerName\ComputerName"中将发现"ComputerName"="Default"(或其它字符串),在regedit下可以查看和修改这个名字。
我们还可在程序中通过Win32API提供的GetComputerName、SetComputerName这两个函数来查看和修改计算机的名字。
下面以VB为例来探讨如何编写一个可查看和修改计算机名字的程序。
----1.插入一个新模块,在其中添加如下代码:
′声明GetComputerName
DeclareFunctionGetComputerNameLib″kernel32″Alias″
GetComputerNameA″(ByvallpBufferAs
String,nSizeAsLong)AsLong
′声明SetComputerName
DeclareFunctionSetComputerNameLib″kernel32″Alias″
SetComputerNameA″(ByvallpComputerNameAsString)AsLong
′定义一个获取计算机名字的函数
PublicFunctionGetCName(CName)AsBoolean
DimsComputerNameAsString'计算机的名字
DimlComputerNameAsLong
'计算机名字的长度
DimlResultAsLong
'GetComputerName的返回值
DimRVAsBoolean
′GetCName返回值,若为TRUE则表示操作成功
lComputerNameLen=256
sComputerName=Space(lComputerNameLen)
lResult=GetComputerName(sComputerName,lCompputerNameLen)
IflResult〈〉0ThenCname=Left$(sComputerName,lComputerNameLen)
RV=True
ElseRV=False
EndIf
GetCName=RV
EndFunction
′定义一个修改计算机名字的函数
PublicFunctionSetCName(CName)AsBoolean
DimlResultAsLong
DimRVAsBoolean
lResult=SetComputerName(CName)
IflResult〈〉0Then
RV=True′修改成功
ElseRV=False
EndIf
SetCName=RV
EndFunction
----2.在窗体中添加一命令按钮Command1,双击该按钮并在其中添加如下代码:
SubCommand1-Click()
DIMCNASString
x=GetCName(CN)
Print″ThisComputerNameis:
″,CN
CN=″MYCOMPUTER″
x=SetCName(CN)
Print″NowtheComputernameis:
″,CN
EndSub
----OK,保存上述设置和代码,然后按F5运行该程序。
----五.给VB控件PictureBox加滚动条的方法
----用过PictureBox控件的朋友都知道,在其中我们可以加载图片。
当图片不是很大时,可能还不会有什么问题,但是,如果所加载的图片比PictureBox大时,我们只能看到图片的一部分,那么,怎么才能看到其他的部分呢?
为了解决上述问题,我们可以在图片框(PictureBox)内部加上水平和垂直滚动条,利用滚动条来显示看不到的图片。
具体方法如下:
----首先给工程(Project)添加一个OCX控件,单击选单上的工程(Project)选单项,在弹出的下拉选单中点击组件(Components),选中其中的"MicrosoftCommonDialogControl5.0",确定完成加载工作;然后画一个PictureBox,采用VB提供的默认名字Picture1,再在Picture1上面画一个PictureBox,默认名字为Picture2,注意别忘了设置:
Picture2.AutoSize=TRUE;接着,加上水平和垂直滚动条,默认名字分别为:
HScroll1,VScroll1;以后加载图形到Picture2上,就可以了;最后,在窗体中引入其它控件:
一个按钮(Command),默认名为Command1和一个"MicrosoftCommonDialogControl",默认名为CommonDialog1。
具体VB代码如下:
PrivateSubForm-Load()
Picture2.Left=0
Picture2.Top=0
Picture2.Width=Picture1.Width
Picture2.Height=Picture1.Height
VScroll1.Min=0
HScroll1.Min=0
HScroll1.Min=0
VScroll1.Max=Picture2.Height-Picture1.Height
HScroll1.Max=Picture2.Width-Picture1.Width
IfHScroll1.Max〈0ThenHScroll1.Enabled=False
IfVScroll1.Max〈0ThenVScroll1.Enabled=False
EndSub
PrivateSubCommand-Click()
OnErrorGoToErrExit
CommonDialog1.Filter=
"Bitmapfile(*.bmp)|*.bmp|AllFile(*.*)|*.*"
CommonDialog1.FilterIndex=1
CommonDialog1.ShowOpen
Picture2.Picture=LoadPicture(CommonDialog1.filename)
VScroll1.Min=0
HScroll1.Min=0
VScroll1.Max=Picture2.Height-Picture1.Height
HScroll1.Max=Picture2.Width-Picture1.Width
IfHScroll1.Max〈0ThenHScroll1.Enabled=False
IfVScroll1.Max〈0ThenVScroll1.Enabled=False
ErrExit:
EndSub
PrivateSubHScroll1-Change()
Picture2.Left=-HScroll1.Value
EndSub
PrivateSubVScroll1-Change()
Picture2.Top=-VScroll1.Value
EndSub
----该程序通过点击Command1按钮,在弹出的对话框中选择一个图形文件加载到Picture2中,利用水平和垂直滚动条就可以实现图片的滚动。
----六.用VB做聊天程序的方法
----所谓"聊天"是指两个程序能够发送数据给对方。
这个程序涉及到数据通讯的知识,仿佛很复杂,不过,由于VB给我们提供了一个Winsock控件,问题就变得很简单了。
----先编写"聊天(主机)"程序。
在窗体里添加Winsock控件,并设置其Protocol属性为1-SckUDPProtocol,其他属性为缺省值。
接着添加两个标签和两个文本框,设置两个标签的标题属性分别为"接收窗"和"发送窗";两个文本框的标题属性为空。
最后编写代码:
----1."聊天(主机)"
PrivateSubForm-Load()
′设置网络地址
Winsock1.LocalPort=1024
Winsock1.RemoteHost="202.96.6.1"
Winsock1.RemotePort=1999
EndSub
PrivateSubText1-Change()
′发送用户输入的内容
Winsock1.SendDataText1.Text
EndSub
PrivateSubWinsock1-DataArrival
(ByvalbytesTotalAsLong)
DimrecAsString
′接收对方数据并在文本框内显示
Winsock1.GetDatarec,vbString
Text2.Text=rec
EndSub
----2."聊天(副机)"
PrivateSubForm_Load()
′设置网络地址
Winsock1.LocalPort=1999
Winsock1.RemoteHost="202.96.6.1"
Winsock1.RemotePort=1024
----其他部分程序与(主机)相同。
最后将两个程序存盘,并编译成执行(.Exe)文件。
现在就可以使用这个程序进行对话了。
----七.文本框中文本的某一特定字符或字符串同时高亮显示的方法
----由于普通TextBox控件不支持不连续字符串的同时高亮显示,所以我们选择RichTextBox控件。
单击工程(Project)选单项,在弹出的下拉选单中单击组件(Components)选单项,从弹出的对话框中选择MicrosoftRichTextboxControl5.0复选框,确定加载RichTextBox控件。
----新建(New)一个工程,在窗体(Form)上添加一个RichTextBox控件和两个Command(按钮)控件,都采用系统默认的Name属性值;设置RichTextBox的Text属性值为空,Command1和Command2的Caption属性值分别设为"输入文本"和"选择字符串"。
最后,添加如下VB代码:
PrivateSubCommand1-Click()
DimstrAsString
DimTextAsString
str=″输入文本″
Text=InputBox(str)
RichTextBox1.Text=Text
EndSub
PrivateSubCommand2-Click()
DimstrAsString
DimTextAsString
DimPositionAsInteger
DimLenthAsInteger
str=″输入要高亮显示的字符串″
Text=InputBox(str)
IfText〈〉″″Then
Position=InStr(RichTextBox1.Text,Text)-1
Lenth=Len(Text)
RichTextBox1.SelStart=Position
RichTextBox1.SelLength=Lenth
RichTextBox1.SelColor=RGB(255,0,0)
DoWhileInStr(Position+Lenth+
1,RichTextBox1.Text,Text)〈〉0
Position=InStr(Position+Lenth+
1,RichTextBox1.Text,Text)-1
RichTextBox1.SelStart=Position
RichTextBox1.SelLength=Lenth
RichTextBox1.SelColor=RGB(255,0,0)
Loop
EndIf
EndSub
----按F5执行程序,单击"输入文本"按钮,在弹出的对话框中输入一些文本,确定后,刚刚输入的文本将显示在RichTextBox中;再单击"选择字符串"按钮,在弹出的对话框中输入你希望高亮显示的字符串,确定后,RichTextBox中相应的字符串将以红色高亮显示。
----八.编程实现Windows95/98操作系统热启动的方法
----要利用程序实现系统的重新启动,可以在你的程序中调用API函数来实现。
建一个子函数:
(以VB为例)
DeclareFunctionSystemParametersInfoLib″
user32″Alias-
″SystemParametersInfo″(ByValuActionAsLong,
ByValuParamAsLong,
ByVallpvParamAsAny,ByVal
fuWinIniAsLong)AsLong
SubDisableCtrlAltDelete(bDisabledAsBoolean)
DimXAsLong
X=SystemParametersInfo(97,bDisabled,CStr
(1),0)
EndSub
CallDisableCtrlAltDelete(true)′禁止热启
CallDisableCtrlAltDelete(false)′允许热启
----九.在Windows95/98启动后自动启动程序的方法
----我们都知道在Windows95/98的"开始"→"程序"选单下有一"启动"选单项,当每次启动Windows95或Windows98时,系统都会自动启动放在"启动"选单栏里的可执行程序。
----但目前有好多软件,像解霸五、ICQ,以及大部分实时侦测病毒的软件等等,安装后,并没有放在"启动"选单里,也能在启动操作系统时自动启动。
怎么实现的呢?
----其实只要知道Windows注册表的一些知识,这个问题就不能称之为问题了。
用鼠标单击"开始",打开开始选单,再单击"运行",出现一对话框,然后输入"regedit",确定后,会打开系统注册表编辑器,找到HKEY-LOCAL-MACHINE?
SOFTWARE?
Microsoft?
Windows?
CurrentVersion?
Run,加入你的程序的入口,就可以了。
如果不知道怎么加,就参考一下已经存在的键值。
----十.如何把数据文件输出到Text控件中?
如果数据量比较大,窗体满屏也不够大,怎么解决?
----有一个比较简单的方法,就是把数据放到一个文本框(Text)里,并在其中加上水平和垂直滚动条。
具体实现步骤为:
先在窗体(Form)里加入一个文本框,采用默认名Text1;然后,设置文本框Text1的属性:
Text属性设置为空,MultiLine属性设置为True,ScrollBars属性设置为3-Both;接着添加如下VB代码:
PrivateSubForm-Load()
DimHandleAsInteger
DimFileNameAsString
OnErrorGoToErrExit
begin:
′输入要显示的数据文件的名称
FileName=InputBox$(″InputFilename″,
″OpenFile″)
OnErrorGoToFileErr
Handle=FreeFile
OpenFileNameForInputAs#Handle
′把数据文件中的数据输出到文本框中
Text1.Text=Input$(LOF(Handle),Handle)
Close#Handle
ExitSub
FileErr:
DimErrNumAsInteger
IfErr.Number=53Then
ErrNum=MsgBox(″Filenotexist″,
vbOKCancel,″ErrorInformation″)
IfErrNum=1Then
GoTobegin
Else
ExitSub
EndIf
EndIf
MsgBoxErr.Description,,″fileopenfailed″
ErrExit:
ExitSub
EndSub
′使文本框充满整个窗体
PrivateSubForm-Resize()
Text1.Left=0
Text1.Top=0
Text1.Width=Form1.Width-100
Text1.Height=Form1.Height-400
EndSub
----通过这样的处理,不仅能解决问题,而且用户还可以在文本框中对数据进行编辑。
----十一.关联文件列表框、目录列表框和驱动器列表框的方法
----想做一个对话窗体,包含驱动器列表框、目录列表框和文件列表