VB編程的必備技巧
北京市西客站 黃立偉 ---- 對編程者來說,VB很容易上手,但要深入、靈活地駕馭它還要下一番功夫。筆者在這里介紹幾個較為典型的編程技巧,希望能對廣大VB愛好者有所幫助。 ---- 一.怎樣創(chuàng)建自定義的光標 ---- 1.當在設計一個應用程序時,Visual Basic允許程序員將許多控件的MousePointer屬性設計成12個預先定義好的鼠標光標之一。然而,有些程序員或許會希望顯示一個預定義形狀之外的光標。本文說明如何創(chuàng)建一個不同的鼠標指針(光標),包括為一個沒有MousePointer屬性的控件創(chuàng)建光標。 ----要在Visual Basic應用程序中將光標(鼠標指針)改變成個不同的形狀,可以添加代碼來改變希望監(jiān)視的控件的MouseMove和DragOver事件。 ----MouseMove事件所包含的代碼用于觸發(fā)該控件的Drag方法。當鼠標在被選中的控件上移動的時候,輪流顯示新的鼠標指針。當鼠標指針離開該控件時,則DragOver事件被觸發(fā)。在Visual Basic程序中,可以重新復位此Drag屬性,以便以前的鼠標指針能夠被再次顯示出來。 ---- 2.下面的樣例程序實現(xiàn)當鼠標指針移動到一個文件列表框控件上時,將其改變成不同的形狀。 ---- 首先采用缺省的方法建立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功能鍵執(zhí)行此程序。得到的運行結果是:將鼠標指針移動到該文件列表框控件上時,程序將把所選中的.ICO文件作為缺省的鼠標光標;將鼠標指針離開該控件時,光標則會自動恢復為缺省的形狀。 ---- 二.怎樣在窗體上點鼠標右鍵產(chǎn)生一個彈出式選單(PopUp Menu)? ---- 大家都知道,在Windows95/98/2000的桌面和許多流行軟件的視窗中,當我們點鼠標右鍵時,會在鼠標的當前位置彈出一個快捷選單。許多愛好編程的朋友是不是也希望能在自己的程序里有類似的功能呢?其實,這并不困難。筆者經(jīng)過一番努力,在VB下找出一個通用的方法,供大家分享。 ---- 要實現(xiàn)上述功能,需分兩個步驟: ---- 1. 利用VB的選單編輯器(Menu Editor)編輯你希望彈出的選單及子選單,注意,要將選單的Visible屬性設置為:False。 ---- 2. 在窗體(Form1)的MouseDown事件中編寫程序,來激發(fā)編輯好的選單,假設選單名為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事件中,就可以了。 ---- 三.怎樣動態(tài)地在窗體上判斷某區(qū)域內是否有控件存在? ---- 在筆者的一個小程序中,想在窗體的某個區(qū)域輸出數(shù)據(jù),這就要求在這個區(qū)域內不能有其他控件存在,那么,怎么才能知道在窗體的某個區(qū)域內,是否有控件存在呢? ---- 為了判斷在窗體的某個區(qū)域中,是否含有控件,我們可以利用以下VB程序來實現(xiàn): 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)分別為選定矩形區(qū)域的左上角和右下角點的坐標值。 ---- 該程序通過計算窗體上所有控件的四個角的位置來判斷控件是否與選定區(qū)域相交,并返回相交的控件。 ---- 四.獲取和修改計算機名字的方法 ---- 在Win 95/98/2000中,計算機有一個名字。運行regedit,在"HKEY-LOCAL-MACHINE\System\CurrentControlSet\ control\ComputerName\ComputerName"中將發(fā)現(xiàn)"ComputerName"="Default"( 或其它字符串),在regedit下可以查看和修改這個名字。我們還可在程序中通過Win32API提供的GetComputerName、SetComputerName這兩個函數(shù)來查看和修改計算機的名字。下面以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 ′定義一個獲取計算機名字的函數(shù) 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 ′定義一個修改計算機名字的函數(shù) 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中,利用水平和垂直滾動條就可以實現(xiàn)圖片的滾動。 ---- 六.用VB做聊天程序的方法 ---- 所謂"聊天"是指兩個程序能夠發(fā)送數(shù)據(jù)給對方。這個程序涉及到數(shù)據(jù)通訊的知識,仿佛很復雜,不過,由于VB給我們提供了一個Winsock控件,問題就變得很簡單了。 ---- 先編寫"聊天(主機)"程序。在窗體里添加Winsock控件,并設置其Protocol屬性為1-SckUDPProtocol,其他屬性為缺省值。接著添加兩個標簽和兩個文本框,設置兩個標簽的標題屬性分別為"接收窗"和"發(fā)送窗";兩個文本框的標題屬性為空。最后編寫代碼: ---- 1."聊天(主機)" Private Sub Form-Load() ′設置網(wǎng)絡地址 Winsock1.LocalPort=1024 Winsock1.RemoteHost="202.96.6.1" Winsock1.RemotePort=1999 End Sub Private Sub Text1-Change() ′發(fā)送用戶輸入的內容 Winsock1.SendData Text1.Text End Sub Private Sub Winsock1-DataArrival (Byval bytesTotal As Long) Dim rec As String ′接收對方數(shù)據(jù)并在文本框內顯示 Winsock1.GetData rec, vb String Text2.Text=rec End Sub ---- 2."聊天(副機)" Private Sub Form_Load() ′設置網(wǎng)絡地址 Winsock1.LocalPort=1999 Winsock1.RemoteHost="202.96.6.1" Winsock1.RemotePort=1024 ---- 其他部分程序與(主機)相同。最后將兩個程序存盤,并編譯成執(zhí)行(.Exe)文件?,F(xiàn)在就可以使用這個程序進行對話了。 ---- 七.文本框中文本的某一特定字符或字符串同時高亮顯示的方法 ---- 由于普通TextBox控件不支持不連續(xù)字符串的同時高亮顯示,所以我們選擇RichTextBox控件。單擊工程(Project)選單項,在彈出的下拉選單中單擊組件(Components)選單項,從彈出的對話框中選擇Microsoft Rich Textbox Control 5.0復選框,確定加載RichTextBox控件。 ---- 新建(New)一個工程,在窗體(Form)上添加一個RichTextBox控件和兩個Command(按鈕)控件,都采用系統(tǒng)默認的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執(zhí)行程序,單擊"輸入文本"按鈕,在彈出的對話框中輸入一些文本,確定后,剛剛輸入的文本將顯示在RichTextBox中;再單擊"選擇字符串"按鈕,在彈出的對話框中輸入你希望高亮顯示的字符串,確定后,RichTextBox中相應的字符串將以紅色高亮顯示。 ---- 八.編程實現(xiàn)Windows 95/98操作系統(tǒng)熱啟動的方法 ---- 要利用程序實現(xiàn)系統(tǒng)的重新啟動,可以在你的程序中調用API函數(shù)來實現(xiàn)。建一個子函數(shù):(以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時,系統(tǒng)都會自動啟動放在"啟動"選單欄里的可執(zhí)行程序。 ---- 但目前有好多軟件,像解霸五、ICQ,以及大部分實時偵測病毒的軟件等等,安裝后,并沒有放在"啟動"選單里,也能在啟動操作系統(tǒng)時自動啟動。怎么實現(xiàn)的呢? ---- 其實只要知道Windows注冊表的一些知識,這個問題就不能稱之為問題了。用鼠標單擊"開始",打開開始選單,再單擊"運行",出現(xiàn)一對話框,然后輸入"regedit",確定后,會打開系統(tǒng)注冊表編輯器,找到HKEY-LOCAL-MACHINE? SOFTWARE?Microsoft?Windows?CurrentVersion?Run,加入你的程序的入口,就可以了。如果不知道怎么加,就參考一下已經(jīng)存在的鍵值。 ---- 十. 如何把數(shù)據(jù)文件輸出到Text控件中?如果數(shù)據(jù)量比較大,窗體滿屏也不夠大,怎么解決? ---- 有一個比較簡單的方法,就是把數(shù)據(jù)放到一個文本框(Text)里,并在其中加上水平和垂直滾動條。具體實現(xiàn)步驟為:先在窗體(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: ′輸入要顯示的數(shù)據(jù)文件的名稱 FileName=InputBox$(″Input Filename″, ″Open File″) On Error GoTo FileErr Handle=FreeFile Open FileName For Input As #Handle ′把數(shù)據(jù)文件中的數(shù)據(jù)輸出到文本框中 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 ---- 通過這樣的處理,不僅能解決問題,而且用戶還可以在文本框中對數(shù)據(jù)進行編輯。 ---- 十一.關聯(lián)文件列表框、目錄列表框和驅動器列表框的方法 ---- 想做一個對話窗體,包含驅動器列表框、目錄列表框和文件列表框,并能實現(xiàn)三者的同步操作,怎么做?這都是我們在實際應用中經(jīng)常會遇到的問題,在VB中解決這個問題非常簡單,可以通過Path屬性的改變引發(fā)Change事件來實現(xiàn)。例如: Sub Dir1-Change() File1.Path=Dir1.Path End Sub ---- 該事件過程使窗體上的目錄列表框Dir1和文件列表框File1產(chǎn)生同步。因為目錄列表框Path屬性的改變將產(chǎn)生Change事件,所以在Dir1-Change事件過程中,把Dir1.Path賦給File1.Path,就可以產(chǎn)生同步效果。類似地,增加下面的事件過程,就可以使三種列表框同步操作: Sub Drive1-Change() Dir1.Path=Drive1.Drive End Sub ---- 該過程使驅動器列表框和目錄列表框同步,前面的過程使目錄列表框和文件列表框同步,從而使三種列表框同步,問題即可解決。 |
|