文章編號:1672-5913(2008)12-0097-03
摘要:在VB教學中,拖放操作是一個難點內(nèi)容。本文介紹在教學過程中如何講解通過修改拖放坐標和使用API函數(shù),實現(xiàn)在不同容器之間拖放控件的操作,并給出了實例程序。
關鍵詞:VB;拖放;坐標;API函數(shù)
中圖分類號:G642
文獻標識碼:B
在Visual Basic應用程序中,為了實現(xiàn)更加靈活的用戶控制,時常需要由用戶自己安排一些控件的位置。在Windows操作系統(tǒng)中,經(jīng)常使用拖動操作移動或復制文件;在一些應用程序中,可將工具欄中的控件按鈕拖放到文檔窗口中,實現(xiàn)插入對象操作;在Office軟件中,還可以隨意定制工具欄中的按鈕。
在我多年的VB一線教學實踐中,發(fā)現(xiàn)拖放操作的講解難點在于拖放的目標位置設置。在拖放控件時,根據(jù)源位置和目標位置的容器控件不同分為兩種情況:在同一容器對象中拖放控件,在不同容器對象中拖放控件。學生對于在不同容器中拖放控件有很多疑問,因此我在教學中采用了由淺入深、循序漸進的方法,分別講解這兩種情況的處理方法,并通過典型的實例讓學生掌握拖放操作的相關概念和實現(xiàn)方法,收到了不錯的效果,學生感覺比較容易理解,下面具體介紹一下這兩種情況拖放操作的實現(xiàn)方法。
1在同一容器內(nèi)部拖放控件
在教學過程中,我首先講解拖放操作的相關概念,然后舉例介紹與拖放操作相關的屬性、方法和事件。拖放(Drag)操作是指在窗體中,將鼠標指針指向控件,按住鼠標按鍵移動鼠標,到達目標位置后松開鼠標按鍵,被拖放的控件移動到目標位置[1]。
在同一容器中拖放控件比較容易實現(xiàn),可以通過設置控件的拖放屬性,或調(diào)用控件的Drag方法來實現(xiàn)。在教學過程中以命令按鈕(CommandButton)控件為例,在窗體上添加一個命令按鈕Command1,設置DragMode屬性為1-Automatic(自動拖放),運行程序后用鼠標左鍵拖動命令按鈕,可以看到拖動時顯示灰色控件邊框,但控件并不真正移動到目標位置。若設置DragMode屬性為0-Manual(手動拖放),則需要編寫命令按鈕的MouseDown事件調(diào)用其Drag方法,事件過程的代碼如下:
Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Command1.Drag 1'開始拖動控件
End Sub
運行程序時演示拖放操作,讓學生看到兩種設置方法的效果相同,使學生了解DragMode屬性的含義和Drag方法的用法。
為了真正實現(xiàn)控件的移動,還需要編寫窗體的DragDrop事件過程,通過調(diào)用命令按鈕的Move方法使其移動到目標位置。DragDrop事件過程的代碼如下:
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
Source.Move X, Y'把命令按鈕移到目標位置
End Sub
在程序運行時可以看到,拖放命令按鈕時能夠將其移動到目標位置。
2在不同容器之間拖放控件
上述的方法雖然可以改變控件的位置,但是控件的源位置和目標位置都是窗體,不能把控件從一個容器對象移到另一容器對象。為了實現(xiàn)控件在不同容器之間的拖放操作,可以通過修改坐標和修改容器對象的方法實現(xiàn)。
2.1修改拖放坐標
在教學過程中,要給學生強調(diào)目標位置坐標的設置方法。還以命令按鈕為例,在窗體上添加一個圖片框(PictureBox)控件Picture1,由于窗體和圖片框都是容器對象,可以嘗試通過修改對象的坐標,將命令按鈕從窗體上拖放到圖片框上。
首先給學生講解DragDrop事件中參數(shù)的含義,Source表示被移動的控件對象,X和Y表示被拖動控件的停放位置,并通過畫示意圖讓學生了解在不同容器之間拖放控件時坐標的變化。DragDrop事件中的控件停放坐標X和Y是指在本容器中的坐標,當命令按鈕在窗體中移動時,坐標X和Y是相對于窗體而言的,而當命令按鈕被拖放到圖片框中時,坐標X和Y是相對于圖片框而言的。如果仍舊使用Source.Move X, Y語句,則命令按鈕無法移到目標位置。因此需要考慮命令按鈕在圖片框中的坐標與在窗體中的坐標之間的關系,即需要設置坐標的偏移,修改拖放坐標的程序代碼如下:
Private Sub Picture1_DragDrop(Source As Control, X As Single, Y As Single)
'計算得到控件在圖片框中的停放坐標
Source.Move X + Picture1.Left, Y + Picture1.Top
End Sub
運行此程序可以看到,拖放命令按鈕能夠將控件從窗體上移動到圖片框上。
2.2修改容器對象
上述程序仍有一些弊端,就是當圖片框位于命令按鈕下層時,可以將命令按鈕移動到圖片框上,但當圖片框的疊放次序位于命令按鈕上層時,移動命令按鈕到圖片框時,命令按鈕會被圖片框覆蓋。也就是說,修改拖放坐標的方法可以把命令按鈕移動到圖片框之上,卻無法將命令按鈕移動到圖片框之中。為了實現(xiàn)將控件拖放到不同容器對象中的功能,需要修改控件的容器對象。
在VB的開發(fā)環(huán)境中,沒有提供在程序運行時建立窗口及控件之間嫡屬關系的方法和手段,因此要實現(xiàn)上面要求的功能,需要補充一點動態(tài)建立窗口及控件之間嫡屬關系的能力。解決這個問題的方法是借助Windows系統(tǒng)調(diào)用,即使用API函數(shù)。
API(應用程序接口)是操作系統(tǒng)自帶的一套功能強大的函數(shù)集,Windows API直接面對操作系統(tǒng)底層,可以實現(xiàn)VB所不能實現(xiàn)的功能。Visual Basic 6.0支持約1500個API函數(shù),主要包括在3個DLL中,其中User32.dll中的函數(shù)主要用于窗口管理,SetParent函數(shù)就是其中一個函數(shù)[2]。
由于API函數(shù)不屬于教學大綱的要求,因此在教學過程中可以簡要介紹API函數(shù)的相關知識,只需舉例講解SetParent函數(shù)的含義和用法。
SetParent函數(shù)可以用來在程序運行時刻,動態(tài)建立兩個容器對象及控件之間的嫡屬關系。SetParent函數(shù)接收兩個參數(shù),第一個參數(shù)是子對象的句柄,第二個參數(shù)是父對象的句柄,若兩個參數(shù)都是合法的句柄,則函數(shù)調(diào)用成功,為兩者之間建立起嫡屬關系[3]。
在本例中,當將命令按鈕從窗體拖放到圖片框時,父對象是圖片框;當從圖片框拖放到窗體時,父對象是窗體。因此需要根據(jù)鼠標拖放時的方向設置不同的父對象,在DragOver事件中,可用If語句來判斷鼠標拖放的方向。另外,需要給學生強調(diào)在使用SetParent函數(shù)時,需要先聲明再使用,如果只在窗體模塊中使用,就在窗體代碼的通用部分聲明。相應的程序代碼如下:
Private Declare Function SetParent Lib \"User32\" (ByVal hWndChild As Long, _
ByVal hWndNewParent As Long) As Long'使用前聲明API函數(shù)SetParent
Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then Command1.Drag 1'如果按下的是左鍵則開始拖放
End Sub
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
Source.Move X, Y
End Sub
Private Sub Picture1_DragDrop(Source As Control, X As Single, Y As Single)
Source.Move X, Y
End Sub
Private Sub Picture1_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
'當進入圖片框時把圖片框設置為容器對象
If State = 0 Then SetParent Command1.hWnd, Picture1.hWnd
'當進入窗體時把窗體設置為容器對象
If State = 1 Then SetParent Command1.hWnd, Form1.hWnd
End Sub
上面的程序能夠實現(xiàn)在同一個窗體中的不同容器對象之間拖放控件。若對程序再做改進,還可以實現(xiàn)在不同窗體之間拖放控件。
3結束語
本文介紹了VB教學過程中鼠標拖放操作的有關問題,通過實例探討了拖放操作由簡單到復雜的實現(xiàn)過程,達到了理想的教學效果,學生能夠更深刻地理解拖放操作的本質(zhì),更容易掌握拖放操作的實現(xiàn)方法。本文中的程序經(jīng)過反復調(diào)試,僅用來驗證拖放操作,并不是完整的應用程序,在開發(fā)實際應用程序時,還需要擴展程序功能,可將此作為大作業(yè)留給學生們課余時間完成。
參考文獻
[1] 申石磊,張東生. Visual Basic程序設計[M]. 北京:中國科學技術出版社,2007:237-241.
[2] 求是科技. Visual Basic 6.0程序設計與開發(fā)技術大全[M]. 北京:人民郵電出版社,2005:212-216.
[3] 張智群. 在VB應用程序中實現(xiàn)動態(tài)控件移動[J]. 計算機世界報,1997,(18).