方法一
這種方法是在窗體的MouseDown、MouseUp和MouseMove等事件的處理過程中添加代碼,實現(xiàn)在鼠標(biāo)左鍵按下后移動時,改變窗體的Left和Top屬性,實現(xiàn)移動無標(biāo)題欄的窗體。
進入VB,把窗體Form1的BorderStyle屬性設(shè)置為0-None(無標(biāo)題欄),再窗體上添加一個ButtonCommand組件,用來關(guān)閉程序。代碼如下:
PRivateTypePOINT
XAsSingle
YAsSingle
EndType
DimFormPaspOINT
'記錄窗體原始位置
DimMousePAsPOINT
'記錄鼠標(biāo)按下時的位置
DimMouseLButtonDownAsBoolean
'記錄鼠標(biāo)左鍵是否按下
PrivateSubCommand1_Click()
End'退出程序
EndSub
PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
FormP.X=Form1.Left
'記下窗體原始坐標(biāo)位置
FormP.Y=Form1.Top
MouseP.X=X
'記下鼠標(biāo)按下時的位置
MouseP.Y=Y
IfButton=1Then
MouseLButtonDown=True
'鼠標(biāo)左鍵按下
EndIf
EndSub
PrivateSubForm_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
IfMouseLButtonDownThen
Form1.Left=FormP.X (X-MouseP.X)'移動窗體
Form1.Top=FormP.Y (Y-MouseP.Y)
EndIf
EndSub
PrivateSubForm_MouseUp(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
MouseLButtonDown=False
'鼠標(biāo)左鍵彈起
EndSub
上述方法不是很完善,制作出的窗體被拖動時,窗體會隨鼠標(biāo)的移動而移動。而在默認(rèn)的Windows設(shè)置中拖動窗體時,被拖動的窗體不會隨窗體的移動而移動,隨窗體移動的僅是一個與窗體形狀、大小一樣的虛框,只有釋放鼠標(biāo)后,窗體才會移動到釋放鼠標(biāo)時虛框的所在處。要實現(xiàn)這種效果,請看第二種方法。
這種方法通過消息的發(fā)送實現(xiàn)移動無標(biāo)題窗體。當(dāng)鼠標(biāo)按下、移動或釋放時,將鼠標(biāo)在窗體上按下的消息(消息值為HTCAPTION)發(fā)出,就可以拖動窗體了。代碼如下:
PrivateDeclareFunctionReleaseCaptureLib"user32"()AsLong
PrivateDeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsLong,
ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong
PrivateConstWM_NCLBUTTONDOWN=&&HA1
PrivateConstHTCAPTION=2
'以上API函數(shù)和常數(shù)的聲明可在VB自帶的“API瀏覽器”中找到
PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
'在窗體的MouseDown事件中添加以下代碼
IfButton=1Then
CallReleaseCapture
CallSendMessage(hwnd,WM_NCLBUTTONDOWN,HTCAPTION,0)
EndIf
EndSub
PrivateSubCommand1_Click()
End '退出程序
EndSub
這種方法實現(xiàn)起來比第一種方法更容易,只有幾行代碼,并且沒有那么多的變量,窗體被拖動時與普通窗體一樣,只有一個虛框隨鼠標(biāo)的移動而移動,當(dāng)釋放鼠標(biāo)時窗體才移動到相應(yīng)的位置。用到了兩個API函數(shù)。
以上程序在VB6.0和Windows98SE下調(diào)試通過。
->新聞熱點
疑難解答