程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 操作VB中的無邊框窗體

操作VB中的無邊框窗體

編輯:VB綜合教程
在VB中,BorderStyle屬性為0的窗體沒有邊框,並且也沒有與邊框相關的元素。這種窗體具有簡潔、占用空間少等優點,用它可以設計出某些富有個性的窗體。但是,由於它沒有標題欄,窗體不能移動,同時也不能改變大小,在某些情況下會給使用者造成一定的麻煩。本文介紹在VB中如何用API函數操作無邊框窗體。

移動窗體

新建一標准工程,設置Form1的BorderStyle屬性為0。此時運行程序後,無法移動窗體。為能移動窗體,在Form1的代碼窗口聲明下列函數和常數:

OptionExplicit

PrivateDeclareFunctionReleaseCaptureLib“user32”()AsLong

PrivateDeclareFunctionSendMessageLib“user32”Alias“SendMessageA”(ByValhwndAsLong,ByValwMsgAsLong,ByValwParamAsLong,lParamAsAny)AsLong

ConstWM_SYSCOMMAND=&H112

ConstSC_MOVE=&HF012

在Form_MouseDown事件中輸入以下代碼:

PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)

'按下鼠標左鍵

IfButton=vbLeftButtonThen

'為當前的應用程序釋放鼠標捕獲

ReleaseCapture

'移動窗體

SendMessageMe.hwnd,WM_SYSCOMMAND,SC_MOVE,0

EndIf

EndSub

注意:此時窗體上不能放置除Shape控件以外的任何控件,否則,在被控件遮住的地方點按鼠標還是無法移動窗體。要使點按控件也能移動窗體,需再添加一個該控件的MouseDown事件過程,代碼與上述過程代碼相似。

改變窗體的大小

為了改變窗體的大小,需要添加一個Timer控件,以定時捕獲鼠標在窗體中的位置。當鼠標位於窗體邊緣時,改變鼠標的形狀,以通知用戶可以進行改變大小的操作。為此,將Timer控件的Interval屬性設為100(即每過100毫秒檢測一下鼠標位置),其他取默認值。

在Form1的代碼窗口中再添加下列兩個函數,並定義兩個自定義變量和一個字符串變量:

'取得窗體位置的函數

PrivateDeclareFunctionGetWindowRectLib“user32”(ByValhwndAsLong,lpRectAsRECT)AsLong

'取得鼠標位置的函數

PrivateDeclareFunctionGetCursorPosLib“user32”(lpPointAsPOINTAPI)AsLong

'鼠標位置變量

PrivateTypePOINTAPI

xAsLong

yAsLong

EndType

'窗體位置變量

PrivateTypeRECT

LeftAsLong

TopAsLong

RightAsLong

BottomAsLong

EndType

'所要執行的動作變量,是移動還是改變大小及從哪個方向改變大小

DimActionAsString

在Timer1控件的Timer事件過程中添加以下代碼:

PrivateSubTimer1_Timer()

DimMyRectAsRECT

DimMyPointAsPOINTAPI

'MyRect返回當前窗口位置

CallGetWindowRect(Me.hwnd,MyRect)

'MyPoint返回當前鼠標位置

CallGetCursorPos(MyPoint)

SelectCaseTrue

'鼠標位於窗體左上方

CaseMyPoint.x<MyRect.Left+5AndMyPoint.y<MyRect.Top+5

Screen.MousePointer=vbSizeNWSE

Action=“LeftUp”

'鼠標位於窗體右下方

CaseMyPoint.x>MyRect.Right-5AndMyPoint.y>MyRect.Bottom-5

Screen.MousePointer=vbSizeNWSE

Action=“RightDown”

'鼠標位於窗體右上方

CaseMyPoint.x>MyRect.Right-5AndMyPoint.y<MyRect.Top+5

'45度雙向鼠標指針

Screen.MousePointer=vbSizeNESW

Action=“RightUp”

'鼠標位於窗體左下方

CaseMyPoint.x<MyRect.Left+5AndMyPoint.y>MyRect.Bottom-5

Screen.MousePointer=vbSizeNESW

Action=“LeftDown”

'鼠標位於窗體左邊

CaseMyPoint.x<MyRect.Left+5

'水平雙向鼠標指針

Screen.MousePointer=vbSizeWE

Action=“Left”

'鼠標位於窗體右邊

CaseMyPoint.x>MyRect.Right-5

Screen.MousePointer=vbSizeWE

Action=“Right”

'鼠標位於窗體上方

CaseMyPoint.y<MyRect.Top+5

'垂直雙向鼠標指針

Screen.MousePointer=vbSizeNS

Action=“Up”

'鼠標位於窗體下方

CaseMyPoint.y>MyRect.Bottom-5

Screen.MousePointer=vbSizeNS

Action=“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

SelectCaseAction

Case“Left”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF001,0

Case“Right”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF002,0

Case“Up”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF003,0

Case“LeftUp”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF004,0

Case“RightUp”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF005,0

Case“Down”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF006,0

Case“LeftDown”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF007,0

Case“RightDown”

SendMessageMe.hwnd,WM_SYSCOMMAND,&HF008,0

Case“Move”

SendMessageMe.hwnd,WM_SYSCOMMAND,SC_MOVE,0

EndSelect

EndIf

EndSub

->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved