分享
 
 
 

VB编程的必备技巧

王朝vb·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

---- 对编程者来说,VB很容易上手,但要深入、灵活地驾驭它还要下一番功夫。笔者在这里介绍几个较为典型的编程技巧,希望能对广大VB爱好者有所帮助。

---- 一.怎样创建自定义的光标

---- 1.当在设计一个应用程序时,Visual Basic允许程序员将许多控件的MousePointer属性设计成12个预先定义好的鼠标光标之一。然而,有些程序员或许会希望显示一个预定义形状之外的光标。本文说明如何创建一个不同的鼠标指针(光标),包括为一个没有MousePointer属性的控件创建光标。

----要在Visual Basic应用程序中将光标(鼠标指针)改变成个不同的形状,可以添加代码来改变希望监视的控件的MouseMove和DragOver事件。

----MouseMove事件所包含的代码用于触发该控件的Drag方法。当鼠标在被选中的控件上移动的时候,轮流显示新的鼠标指针。当鼠标指针离开该控件时,则DragOver事件被触发。在Visual Basic程序中,可以重新复位此Drag属性,以便以前的鼠标指针能够被再次显示出来。

---- 2.下面的样例程序实现当鼠标指针移动到一个文件列表框控件上时,将其改变成不同的形状。

---- 首先采用缺省的方法建立Form1。在Form1上添加一个文件列表框控件,采用缺省的方法建立File1。将File1控件的DragIcon属性设置为所选择的.ICO文件。

---- 将如下代码添加到File1的MouseMove事件中:

Private Sub File1-MouseMove(ButtonAs

Integer, Shift As Integer, X As Single, Y As Single)

File1.Drag 1 'icon on

End Sub

---- 将如下代码添加到Form1的DragOver事件中:

Private Sub Form-DragOver(Source As Control,

X As Single, Y As Single, State As Integer)

File1.Drag 0 ′icon off

End Sub

---- 按下F5功能键执行此程序。得到的运行结果是:将鼠标指针移动到该文件列表框控件上时,程序将把所选中的.ICO文件作为缺省的鼠标光标;将鼠标指针离开该控件时,光标则会自动恢复为缺省的形状。

---- 二.怎样在窗体上点鼠标右键产生一个弹出式选单(PopUp Menu)?

---- 大家都知道,在Windows95/98/2000的桌面和许多流行软件的视窗中,当我们点鼠标右键时,会在鼠标的当前位置弹出一个快捷选单。许多爱好编程的朋友是不是也希望能在自己的程序里有类似的功能呢?其实,这并不困难。笔者经过一番努力,在VB下找出一个通用的方法,供大家分享。

---- 要实现上述功能,需分两个步骤:

---- 1. 利用VB的选单编辑器(Menu Editor)编辑你希望弹出的选单及子选单,注意,要将选单的Visible属性设置为:False。

---- 2. 在窗体(Form1)的MouseDown事件中编写程序,来激发编辑好的选单,假设选单名为PopMenu,程序源码如下:

Private Sub Form-MouseDown

(Button As Integer, Shift As Integer,

X As Single, Y As Single)

If Button = vbRightButton Then

PopMenu.Visible = True

PopupMenu PopMenu

End If

End Sub

---- 上述方法是针对窗体的,我们也可以针对任意控件,用鼠标右键点击控件时,也弹出一个快捷选单。方法也很简单,只要把上述代码放到相应控件的MouseDown事件中,就可以了。

---- 三.怎样动态地在窗体上判断某区域内是否有控件存在?

---- 在笔者的一个小程序中,想在窗体的某个区域输出数据,这就要求在这个区域内不能有其他控件存在,那么,怎么才能知道在窗体的某个区域内,是否有控件存在呢?

---- 为了判断在窗体的某个区域中,是否含有控件,我们可以利用以下VB程序来实现:

Function GetControl(x1 As Single, y1 As Single,

x2 as Single, y2 as Single) As Control

Dim Control as Control

For Each Control In Form1

With Control

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

Set GetControl = Control

Exit Function

End If End With

Next

Set GetControl = Nothing

End Function

---- 注:(x1, y1)和(x2, y2)分别为选定矩形区域的左上角和右下角点的坐标值。

---- 该程序通过计算窗体上所有控件的四个角的位置来判断控件是否与选定区域相交,并返回相交的控件。

---- 四.获取和修改计算机名字的方法

---- 在Win 95/98/2000中,计算机有一个名字。运行regedit,在"HKEY-LOCAL-MACHINE\System\CurrentControlSetcontrol\ComputerName\ComputerName"中将发现"ComputerName"="Default"( 或其它字符串),在regedit下可以查看和修改这个名字。我们还可在程序中通过Win32API提供的GetComputerName、SetComputerName这两个函数来查看和修改计算机的名字。下面以VB为例来探讨如何编写一个可查看和修改计算机名字的程序。

---- 1.插入一个新模块,在其中添加如下代码:

′声明 GetComputerName

Declare Function GetComputerName Lib″kernel 32″Alias″

GetComputerNameA″(Byval lpBuffer As

String,nSize As Long)As Long

′声明 SetComputerName

Declare Function SetComputerName Lib″kernel 32″Alias ″

SetComputerNameA″(Byval lp ComputerName As String)As Long

′定义一个获取计算机名字的函数

Public Function GetCName (CName) As Boolean

Dim sComputerName As String '计算机的名字

Dim lComputerName As Long

'计算机名字的长度

Dim lResult As Long

'GetComputerName的返回值

Dim RV As Boolean

′GetCName返回值,若为TRUE则表示操作成功

lComputerNameLen=256

sComputerName=Space (lComputerNameLen)

lResult=GetComputerName (sComputerName,lCompputerNameLen)

If lResult 〈〉0 Then Cname=Left$ (sComputerName,lComputerNameLen)

RV=True

Else RV=False

End If

GetCName=RV

End Function

′定义一个修改计算机名字的函数

Public Function SetCName (CName ) As Boolean

Dim lResult As Long

Dim RV As Boolean

lResult=SetComputerName (CName)

If lResult 〈〉0 Then

RV=True′修改成功

Else RV=False

End If

SetCName=RV

End Function

---- 2.在窗体中添加一命令按钮Command1,双击该按钮并在其中添加如下代码:

Sub Command1-Click ()

DIM CN AS String

x=GetCName (CN)

Print ″This Computer Name is :″,CN

CN=″MYCOMPUTER″

x=SetCName (CN )

Print ″Now the Computer name is :″,CN

End Sub

---- OK, 保存上述设置和代码,然后按F5运行该程序。

---- 五.给VB控件PictureBox加滚动条的方法

---- 用过PictureBox控件的朋友都知道,在其中我们可以加载图片。当图片不是很大时,可能还不会有什么问题,但是,如果所加载的图片比PictureBox大时,我们只能看到图片的一部分,那么,怎么才能看到其他的部分呢?为了解决上述问题,我们可以在图片框(PictureBox)内部加上水平和垂直滚动条,利用滚动条来显示看不到的图片。具体方法如下:

----首先给工程(Project)添加一个OCX控件,单击选单上的工程(Project)选单项,在弹出的下拉选单中点击组件(Components),选中其中的"Microsoft Common Dialog Control 5.0",确定完成加载工作;然后画一个PictureBox,采用VB提供的默认名字Picture1, 再在Picture1上面画一个PictureBox,默认名字为Picture2,注意别忘了设置:Picture2.AutoSize=TRUE;接着,加上水平和垂直滚动条,默认名字分别为:HScroll1,VScroll1;以后加载图形到Picture2上,就可以了;最后,在窗体中引入其它控件:一个按钮(Command),默认名为Command1和一个"Microsoft Common Dialog Control",默认名为CommonDialog1。具体VB代码如下:

Private Sub Form-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

If HScroll1.Max 〈 0 Then HScroll1.Enabled = False

If VScroll1.Max 〈 0 Then VScroll1.Enabled = False

End Sub

Private Sub Command-Click()

On Error GoTo ErrExit

CommonDialog1.Filter =

"Bitmap file(*.bmp)¦*.bmp¦All File(*.*)¦*.*"

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

If HScroll1.Max 〈 0 Then HScroll1.Enabled = False

If VScroll1.Max 〈 0 Then VScroll1.Enabled = False

ErrExit:

End Sub

Private Sub HScroll1-Change()

Picture2.Left = -HScroll1.Value

End Sub

Private Sub VScroll1-Change()

Picture2.Top = -VScroll1.Value

End Sub

---- 该程序通过点击Command1按钮,在弹出的对话框中选择一个图形文件加载到Picture2中,利用水平和垂直滚动条就可以实现图片的滚动。

---- 六.用VB做聊天程序的方法

---- 所谓"聊天"是指两个程序能够发送数据给对方。这个程序涉及到数据通讯的知识,仿佛很复杂,不过,由于VB给我们提供了一个Winsock控件,问题就变得很简单了。

---- 先编写"聊天(主机)"程序。在窗体里添加Winsock控件,并设置其Protocol属性为1-SckUDPProtocol,其他属性为缺省值。接着添加两个标签和两个文本框,设置两个标签的标题属性分别为"接收窗"和"发送窗";两个文本框的标题属性为空。最后编写代码:

---- 1."聊天(主机)"

Private Sub Form-Load()

′设置网络地址

Winsock1.LocalPort=1024

Winsock1.RemoteHost="202.96.6.1"

Winsock1.RemotePort=1999

End Sub

Private Sub Text1-Change()

′发送用户输入的内容

Winsock1.SendData Text1.Text

End Sub

Private Sub Winsock1-DataArrival

(Byval bytesTotal As Long)

Dim rec As String

′接收对方数据并在文本框内显示

Winsock1.GetData rec, vb String

Text2.Text=rec

End Sub

---- 2."聊天(副机)"

Private Sub Form_Load()

′设置网络地址

Winsock1.LocalPort=1999

Winsock1.RemoteHost="202.96.6.1"

Winsock1.RemotePort=1024

---- 其他部分程序与(主机)相同。最后将两个程序存盘,并编译成执行(.Exe)文件。现在就可以使用这个程序进行对话了。

---- 七.文本框中文本的某一特定字符或字符串同时高亮显示的方法

---- 由于普通TextBox控件不支持不连续字符串的同时高亮显示,所以我们选择RichTextBox控件。单击工程(Project)选单项,在弹出的下拉选单中单击组件(Components)选单项,从弹出的对话框中选择Microsoft Rich Textbox Control 5.0复选框,确定加载RichTextBox控件。

---- 新建(New)一个工程,在窗体(Form)上添加一个RichTextBox控件和两个Command(按钮)控件,都采用系统默认的Name属性值;设置RichTextBox的Text属性值为空,Command1和Command2的Caption属性值分别设为"输入文本"和"选择字符串"。最后,添加如下VB代码:

Private Sub Command1-Click()

Dim str As String

Dim Text As String

str=″输入文本″

Text=InputBox(str)

RichTextBox1.Text=Text

End Sub

Private Sub Command2-Click()

Dim str As String

Dim Text As String

Dim Position As Integer

Dim Lenth As Integer

str=″输入要高亮显示的字符串″

Text=InputBox(str)

If Text 〈〉 ″″ Then

Position=InStr(RichTextBox1.Text, Text)-1

Lenth=Len(Text)

RichTextBox1.SelStart=Position

RichTextBox1.SelLength=Lenth

RichTextBox1.SelColor=RGB(255,0,0)

Do While InStr(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

End If

End Sub

---- 按F5执行程序,单击"输入文本"按钮,在弹出的对话框中输入一些文本,确定后,刚刚输入的文本将显示在RichTextBox中;再单击"选择字符串"按钮,在弹出的对话框中输入你希望高亮显示的字符串,确定后,RichTextBox中相应的字符串将以红色高亮显示。

---- 八.编程实现Windows 95/98操作系统热启动的方法

---- 要利用程序实现系统的重新启动,可以在你的程序中调用API函数来实现。建一个子函数:(以VB为例)

Declare Function SystemParametersInfo Lib ″

user32″ Alias -

″SystemParametersInfo″ (ByVal uAction As Long,

ByVal uParam As Long,

ByVal lpvParam As Any, ByVal

fuWinIni As Long) As Long

Sub DisableCtrlAltDelete(bDisabled As Boolean)

Dim X As Long

X=SystemParametersInfo(97, bDisabled, CStr(1), 0)

End Sub

Call DisableCtrlAltDelete(true) ′禁止热启

Call DisableCtrlAltDelete(false) ′允许热启

---- 九.在Windows 95/ 98启动后自动启动程序的方法

---- 我们都知道在Windows 95/98的"开始"→"程序"选单下有一"启动"选单项,当每次启动Windows 95或Windows 98时,系统都会自动启动放在"启动"选单栏里的可执行程序。

---- 但目前有好多软件,像解霸五、ICQ,以及大部分实时侦测病毒的软件等等,安装后,并没有放在"启动"选单里,也能在启动操作系统时自动启动。怎么实现的呢?

---- 其实只要知道Windows注册表的一些知识,这个问题就不能称之为问题了。用鼠标单击"开始",打开开始选单,再单击"运行",出现一对话框,然后输入"regedit",确定后,会打开系统注册表编辑器,找到HKEY-LOCAL-MACHINE? SOFTWARE?Microsoft?Windows?CurrentVersion?Run,加入你的程序的入口,就可以了。如果不知道怎么加,就参考一下已经存在的键值。

---- 十. 如何把数据文件输出到Text控件中?如果数据量比较大,窗体满屏也不够大,怎么解决?

---- 有一个比较简单的方法,就是把数据放到一个文本框(Text)里,并在其中加上水平和垂直滚动条。具体实现步骤为:先在窗体(Form)里加入一个文本框,采用默认名Text1;然后,设置文本框Text1的属性:Text属性设置为空,MultiLine属性设置为True,ScrollBars属性设置为3-Both;接着添加如下VB代码:

Private Sub Form-Load()

Dim Handle As Integer

Dim FileName As String

On Error GoTo ErrExit

begin:

′输入要显示的数据文件的名称

FileName=InputBox$(″Input Filename″,

″Open File″)

On Error GoTo FileErr

Handle=FreeFile

Open FileName For Input As #Handle

′把数据文件中的数据输出到文本框中

Text1.Text=Input$(LOF(Handle), Handle)

Close #Handle

Exit Sub

FileErr:

Dim ErrNum As Integer

If Err.Number=53 Then

ErrNum=MsgBox(″File not exist″,

vbOKCancel, ″Error Information″)

If ErrNum=1 Then

GoTo begin

Else

Exit Sub

End If

End If

MsgBox Err.Description, , ″file open failed″

ErrExit:

Exit Sub

End Sub

′使文本框充满整个窗体

Private Sub Form-Resize()

Text1.Left=0

Text1.Top=0

Text1.Width=Form1.Width-100

Text1.Height=Form1.Height-400

End Sub

---- 通过这样的处理,不仅能解决问题,而且用户还可以在文本框中对数据进行编辑。

---- 十一.关联文件列表框、目录列表框和驱动器列表框的方法

---- 想做一个对话窗体,包含驱动器列表框、目录列表框和文件列表框,并能实现三者的同步操作,怎么做?这都是我们在实际应用中经常会遇到的问题,在VB中解决这个问题非常简单,可以通过Path属性的改变引发Change事件来实现。例如:

Sub Dir1-Change()

File1.Path=Dir1.Path

End Sub

---- 该事件过程使窗体上的目录列表框Dir1和文件列表框File1产生同步。因为目录列表框Path属性的改变将产生Change事件,所以在Dir1-Change事件过程中,把Dir1.Path赋给File1.Path,就可以产生同步效果。类似地,增加下面的事件过程,就可以使三种列表框同步操作:

Sub Drive1-Change()

Dir1.Path=Drive1.Drive

End Sub

---- 该过程使驱动器列表框和目录列表框同步,前面的过程使目录列表框和文件列表框同步,从而使三种列表框同步,问题即可解决。

黄立伟(北京市西客站)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有