移動窗體
新建一標准工程,設置Form1的BorderStyle屬性為0。此時運行程序後,無法移動窗體。為能移動窗體,在Form1的代碼窗口聲明下列函數和常數:OptionExplicit
PrivateDeclareFunctionReleaseCaptureLib“user32”()AsLongPrivateDeclareFunctionSendMessageLib“user32”Alias“SendMessageA”(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong
ConstWM_SYSCOMMAND=&H112ConstSC_MOVE=&HF012
在Form_MouseDown事件中輸入以下代碼:PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
'按下鼠標左鍵IfButton=vbLeftButtonThen
'為當前的應用程序釋放鼠標捕獲ReleaseCapture
'移動窗體SendMessageMe.hwnd,WM_SYSCOMMAND,SC_MOVE,0
EndIfEndSub
注意:此時窗體上不能放置除Shape控件以外的任何控件,否則,在被控件遮住的地方點按鼠標還是無法移動窗體。要使點按控件也能移動窗體,需再添加一個該控件的MouseDown事件過程,代碼與上述過程代碼相似。改變窗體的大小
為了改變窗體的大小,需要添加一個Timer控件,以定時捕獲鼠標在窗體中的位置。當鼠標位於窗體邊緣時,改變鼠標的形狀,以通知用戶可以進行改變大小的操作。為此,將Timer控件的Interval屬性設為100(即每過100毫秒檢測一下鼠標位置),其他取默認值。在Form1的代碼窗口中再添加下列兩個函數,並定義兩個自定義變量和一個字符串變量:
'取得窗體位置的函數PrivateDeclareFunctionGetWindowRectLib“user32”(ByValhwndAsLong,lpRectAsRECT)AsLong
'取得鼠標位置的函數PrivateDeclareFunctionGetCursorPosLib“user32”(lpPointAsPOINTAPI)AsLong
'鼠標位置變量PrivateTypePOINTAPI
xAsLongyAsLong
EndType'窗體位置變量
PrivateTypeRECTLeftAsLong
TopAsLongRightAsLong
BottomAsLongEndType
'所要執行的動作變量,是移動還是改變大小及從哪個方向改變大小DimActionAsString
在Timer1控件的Timer事件過程中添加以下代碼:PrivateSubTimer1_Timer()
DimMyRectAsRECTDimMyPointAsPOINTAPI
'MyRect返回當前窗口位置CallGetWindowRect(Me.hwnd,MyRect)
'MyPoint返回當前鼠標位置CallGetCursorPos(MyPoint)
SelectCaseTrue'鼠標位於窗體左上方
CaseMyPoint.x<MyRect.Left+5AndMyPoint.y<MyRect.Top+5Screen.MousePointer=vbSizeNWSE
Action=“LeftUp”'鼠標位於窗體右下方
CaseMyPoint.x>MyRect.Right-5AndMyPoint.y>MyRect.Bottom-5Screen.MousePointer=vbSizeNWSE
Action=“RightDown”'鼠標位於窗體右上方
CaseMyPoint.x>MyRect.Right-5AndMyPoint.y<MyRect.Top+5'45度雙向鼠標指針
Screen.MousePointer=vbSizeNESWAction=“RightUp”
'鼠標位於窗體左下方CaseMyPoint.x<MyRect.Left+5AndMyPoint.y>MyRect.Bottom-5
Screen.MousePointer=vbSizeNESWAction=“LeftDown”
'鼠標位於窗體左邊CaseMyPoint.x<MyRect.Left+5
'水平雙向鼠標指針Screen.MousePointer=vbSizeWE
Action=“Left”'鼠標位於窗體右邊
CaseMyPoint.x>MyRect.Right-5Screen.MousePointer=vbSizeWE
Action=“Right”'鼠標位於窗體上方
CaseMyPoint.y<MyRect.Top+5'垂直雙向鼠標指針
Screen.MousePointer=vbSizeNSAction=“Up”
'鼠標位於窗體下方CaseMyPoint.y>MyRect.Bottom-5
Screen.MousePointer=vbSizeNSAction=“Down”
'鼠標位於窗體其他位置CaseElse
'默認鼠標指針Screen.MousePointer=0
Action=“Move”EndSelect
EndSub當利用SendMessage函數由系統向窗口發送改變大小的信息時,只要將上面移動窗體的語句“SendMessageMe.hwnd,WM_SYSCOMMAND,SC_MOVE,0”中的第3個參數改為相應的常數即可。
VB中&HF001~&HF008分別是從左、右、上、左上、右上、下、左下、右下8個方向改變窗體大小的常數。結合移動窗體的代碼,將上述Form_MouseDown事件的代碼綜合如下(也可以把這8個常數聲明為自定義常數):PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,xAsSingle,yAsSingle)
'按下鼠標左鍵IfButton=vbLeftButtonThen
'為當前的應用程序釋放鼠標捕獲ReleaseCapture
SelectCaseActionCase“Left”
SendMessageMe.hwnd,WM_SYSCOMMAND,&HF001,0Case“Right”
SendMessageMe.hwnd,WM_SYSCOMMAND,&HF002,0Case“Up”
SendMessageMe.hwnd,WM_SYSCOMMAND,&HF003,0Case“LeftUp”
SendMessageMe.hwnd,WM_SYSCOMMAND,&HF004,0Case“RightUp”
SendMessageMe.hwnd,WM_SYSCOMMAND,&HF005,0Case“Down”
SendMessageMe.hwnd,WM_SYSCOMMAND,&HF006,0Case“LeftDown”
SendMessageMe.hwnd,WM_SYSCOMMAND,&HF007,0Case“RightDown”
SendMessageMe.hwnd,WM_SYSCOMMAND,&HF008,0Case“Move”
SendMessageMe.hwnd,WM_SYSCOMMAND,SC_MOVE,0EndSelect
EndIfEndSub
->