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