再谈无边框窗体的操作
生活随笔
收集整理的這篇文章主要介紹了
再谈无边框窗体的操作
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文介紹操作無邊框窗體的其他幾個(gè)方面的技巧。
設(shè)置浮動(dòng)菜單
通常情況下,在無邊框窗體中不能設(shè)置菜單。如果在無邊框窗體中設(shè)置了菜單,運(yùn)行時(shí)窗體上就會(huì)出現(xiàn)標(biāo)題欄。那么,是否在無邊框窗體中就不能使用菜單了呢?答案是否定的。下面我們介紹用“借雞下蛋”的方法在窗體中設(shè)置浮動(dòng)菜單。
首先借“雞”——再添加一個(gè)窗體,然后用這個(gè)“雞”來下“蛋”——設(shè)置菜單。具體操作步驟如下:
1.在默認(rèn)名為Form1的窗體的屬性窗口中設(shè)置BorderStyle值為0-vbBSNone(沒有邊框或與邊框相關(guān)的元素)。
2.從菜單“工程/添加窗體”中添加一個(gè)窗體Form2。
3.在Form2中,單擊工具欄中的“菜單編輯器”。在彈出的“菜單編輯器”窗口中,按需要設(shè)置一個(gè)頂級(jí)菜單,下設(shè)若干個(gè)菜單項(xiàng)(至少一個(gè)),并設(shè)置好頂級(jí)菜單及各菜單項(xiàng)的標(biāo)題(菜單中顯示的文字)和名稱(程序調(diào)用所需的名稱)。注意:此時(shí)其頂級(jí)菜單的“可見性”可任意設(shè)置,因?yàn)楸疚某绦蛑胁⒉恍枰堰@個(gè)窗體顯示出來(而在一般的浮動(dòng)菜單中其“可見性”必須設(shè)為False)。
4.在Form1的Form_MouseUp過程中添加以下代碼:
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
’如果用戶按的是鼠標(biāo)右鍵
If Button = 2 Then
注釋:激活Form2的浮動(dòng)菜單,mnuMain為頂級(jí)菜單名稱
PopupMenu Form2.mnuMain
End If
End Sub
5.在Form2的各菜單項(xiàng)的單擊事件過程中輸入有關(guān)代碼。
編譯并運(yùn)行后,在Form1上點(diǎn)擊右鍵就會(huì)彈出設(shè)定的菜單。在利用這種方法時(shí),有兩點(diǎn)需要注意:一是這種方法雖然多添加了一個(gè)窗體,資源略顯“浪費(fèi)”,但實(shí)現(xiàn)了編程愿望,也不枉然。而且如果程序中除主窗體外,還需要一個(gè)有標(biāo)題欄的窗體(如“關(guān)于”對(duì)話框),則可以把菜單建在該窗體中(設(shè)計(jì)時(shí),使頂級(jí)菜單不可見,當(dāng)然其BorderStyle值不能為0)。這樣,不但系統(tǒng)資源得到了充分利用,而且設(shè)想的功能也全部實(shí)現(xiàn)。二是在Form1窗體中,每次調(diào)用Form2的浮動(dòng)菜單時(shí),會(huì)先在窗體Form2中產(chǎn)生Initialize事件,再產(chǎn)生Load事件,然后顯示浮動(dòng)菜單。因此編程時(shí),如果在Form2中含有涉及到上述兩過程的代碼調(diào)用,一定要加以注意。
在任務(wù)欄中顯示圖標(biāo)與系統(tǒng)菜單
默認(rèn)情況下,無邊框窗體不在任務(wù)欄中顯示圖標(biāo)。一般情況下,要使它能在任務(wù)欄中顯示,只要將其ShowInTaskbar屬性設(shè)為True。但此時(shí)只有標(biāo)題沒有圖標(biāo),而且,通常情況下的任務(wù)欄中鼠標(biāo)右鍵的系統(tǒng)菜單也沒有。
實(shí)際上,我們可以用API函數(shù)來解決此問題。首先將下面的代碼放入窗體的聲明段中:
注釋:為指定窗體設(shè)置信息
Private Declare Function SetWindowLong Lib “user32” Alias “SetWindowLongA”(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_SYSMENU = &H80000
Private Const WS_SIZEBOX = &H40000
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
然后在窗體的Load事件過程中添加如下代碼:
Private Sub Form_Load()
Dim lStyle As Long
’為任務(wù)欄添加圖標(biāo)和系統(tǒng)菜單(僅關(guān)閉和移動(dòng)兩個(gè)菜單項(xiàng)有效)
lStyle = WS_SYSMENU
’使“大小”有效
lStyle = lStyle Or WS_SIZEBOX
’使“最大化”有效
lStyle = lStyle Or WS_MAXIMIZEBOX
’使“最小化”有效
lStyle = lStyle Or WS_MINIMIZEBOX
’確定以上設(shè)置
SetWindowLong hWnd, GWL_STYLE, lStyle
End Sub
運(yùn)行后就會(huì)發(fā)現(xiàn),在任務(wù)欄中標(biāo)題和圖標(biāo)都有了,點(diǎn)擊右鍵也出現(xiàn)了系統(tǒng)菜單,并且其效果與常規(guī)的基本一致。與常規(guī)窗口不同的有兩個(gè)地方:一是窗口處于活動(dòng)狀態(tài)時(shí),單擊不能將其最小化,但用標(biāo)題欄中的菜單最小化時(shí)單擊任務(wù)欄能恢復(fù)。二是“關(guān)閉”功能失效,并且當(dāng)改變了窗體大小時(shí),窗體的效果由原來的平面變?yōu)?D,這時(shí)可用鼠標(biāo)調(diào)整窗體大小。
窗體式樣的變化
由于Form的BorderStyle屬性在運(yùn)行時(shí)是只讀的,所以一般情況下在運(yùn)行時(shí)不能改變窗體式樣。但我們可以通過API函數(shù)并結(jié)合上節(jié)的相關(guān)內(nèi)容來實(shí)現(xiàn)無邊框窗體與普通窗體之間的轉(zhuǎn)換,實(shí)際上是在保持BorderStyle屬性不變的情況下,對(duì)標(biāo)題欄進(jìn)行了顯示與隱藏的操作。
首先新建一個(gè)工程,在代碼窗口添加以下聲明和過程代碼:
’設(shè)置窗體結(jié)構(gòu)信息函數(shù)
Private Declare Function SetWindowLong Lib “user32” Alias “SetWindowLongA”(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
’獲取窗體結(jié)構(gòu)信息函數(shù)
Private Declare Function GetWindowLong Lib “user32” Alias “GetWindowLongA”(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_SYSMENU = &H80000
Private Const WS_CAPTION = &HC00000
Private Const WS_SIZEBOX = &H40000
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
’為窗體指定一個(gè)新位置和狀態(tài)函數(shù)
Private Declare Function SetWindowPos Lib “user32”(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const SWP_NOZORDER = &H4
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_NOREPOSITION = &H200
’獲得整個(gè)窗體的大小和位置
Private Declare Function GetWindowRect Lib “user32”(ByVal hwnd As Long, lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Sub Form_Click()
Dim lStyle As Long
Dim MyRect As RECT
Dim Change As Boolean
’獲取窗體的大小和位置
GetWindowRect Me.hwnd, MyRect
’取得當(dāng)前窗體信息
lStyle=GetWindowLong(Me.hwnd, GWL_STYLE)
If Change Then
’分別使系統(tǒng)菜單(包括圖標(biāo))、標(biāo)題、大小、最大化、最小化顯示/有效
lStyle = lStyle Or WS_SYSMENU
lStyle = lStyle Or WS_CAPTION
lStyle = lStyle Or WS_SIZEBOX
lStyle = lStyle Or WS_MAXIMIZEBOX
lStyle = lStyle Or WS_MINIMIZEBOX
Else
’分別使系統(tǒng)菜單(包括圖標(biāo))、標(biāo)題、大小、最大化、最小化隱藏/無效
lStyle = lStyle And Not WS_SYSMENU
lStyle = lStyle And Not WS_CAPTION
lStyle = lStyle And Not WS_SIZEBOX
lStyle = lStyle And Not WS_MAXIMIZEBOX
lStyle = lStyle And Not WS_MINIMIZEBOX
End If
’按lStyle的值設(shè)置窗體信息
SetWindowLong Me.hwnd, GWL_STYLE, lStyle
’保持窗體的大小與位置不變
SetWindowPos Me.hwnd, 0, MyRect.Left, MyRect.Top,MyRect.Right - MyRect.Left,
MyRect.Bottom - MyRect.Top,SWP_NOREPOSITION Or SWP_NOZORDER Or SWP_FRAMECHANGED
’改變顯示/隱藏狀態(tài)
Change = Not Change
End Sub
這樣,每次單擊窗體,標(biāo)題欄就會(huì)在顯示和隱藏之間進(jìn)行切換。
設(shè)置浮動(dòng)菜單
首先借“雞”——再添加一個(gè)窗體,然后用這個(gè)“雞”來下“蛋”——設(shè)置菜單。具體操作步驟如下:
1.在默認(rèn)名為Form1的窗體的屬性窗口中設(shè)置BorderStyle值為0-vbBSNone(沒有邊框或與邊框相關(guān)的元素)。
2.從菜單“工程/添加窗體”中添加一個(gè)窗體Form2。
3.在Form2中,單擊工具欄中的“菜單編輯器”。在彈出的“菜單編輯器”窗口中,按需要設(shè)置一個(gè)頂級(jí)菜單,下設(shè)若干個(gè)菜單項(xiàng)(至少一個(gè)),并設(shè)置好頂級(jí)菜單及各菜單項(xiàng)的標(biāo)題(菜單中顯示的文字)和名稱(程序調(diào)用所需的名稱)。注意:此時(shí)其頂級(jí)菜單的“可見性”可任意設(shè)置,因?yàn)楸疚某绦蛑胁⒉恍枰堰@個(gè)窗體顯示出來(而在一般的浮動(dòng)菜單中其“可見性”必須設(shè)為False)。
4.在Form1的Form_MouseUp過程中添加以下代碼:
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
’如果用戶按的是鼠標(biāo)右鍵
If Button = 2 Then
注釋:激活Form2的浮動(dòng)菜單,mnuMain為頂級(jí)菜單名稱
PopupMenu Form2.mnuMain
End If
End Sub
5.在Form2的各菜單項(xiàng)的單擊事件過程中輸入有關(guān)代碼。
編譯并運(yùn)行后,在Form1上點(diǎn)擊右鍵就會(huì)彈出設(shè)定的菜單。在利用這種方法時(shí),有兩點(diǎn)需要注意:一是這種方法雖然多添加了一個(gè)窗體,資源略顯“浪費(fèi)”,但實(shí)現(xiàn)了編程愿望,也不枉然。而且如果程序中除主窗體外,還需要一個(gè)有標(biāo)題欄的窗體(如“關(guān)于”對(duì)話框),則可以把菜單建在該窗體中(設(shè)計(jì)時(shí),使頂級(jí)菜單不可見,當(dāng)然其BorderStyle值不能為0)。這樣,不但系統(tǒng)資源得到了充分利用,而且設(shè)想的功能也全部實(shí)現(xiàn)。二是在Form1窗體中,每次調(diào)用Form2的浮動(dòng)菜單時(shí),會(huì)先在窗體Form2中產(chǎn)生Initialize事件,再產(chǎn)生Load事件,然后顯示浮動(dòng)菜單。因此編程時(shí),如果在Form2中含有涉及到上述兩過程的代碼調(diào)用,一定要加以注意。
在任務(wù)欄中顯示圖標(biāo)與系統(tǒng)菜單
默認(rèn)情況下,無邊框窗體不在任務(wù)欄中顯示圖標(biāo)。一般情況下,要使它能在任務(wù)欄中顯示,只要將其ShowInTaskbar屬性設(shè)為True。但此時(shí)只有標(biāo)題沒有圖標(biāo),而且,通常情況下的任務(wù)欄中鼠標(biāo)右鍵的系統(tǒng)菜單也沒有。
實(shí)際上,我們可以用API函數(shù)來解決此問題。首先將下面的代碼放入窗體的聲明段中:
注釋:為指定窗體設(shè)置信息
Private Declare Function SetWindowLong Lib “user32” Alias “SetWindowLongA”(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_SYSMENU = &H80000
Private Const WS_SIZEBOX = &H40000
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
然后在窗體的Load事件過程中添加如下代碼:
Private Sub Form_Load()
Dim lStyle As Long
’為任務(wù)欄添加圖標(biāo)和系統(tǒng)菜單(僅關(guān)閉和移動(dòng)兩個(gè)菜單項(xiàng)有效)
lStyle = WS_SYSMENU
’使“大小”有效
lStyle = lStyle Or WS_SIZEBOX
’使“最大化”有效
lStyle = lStyle Or WS_MAXIMIZEBOX
’使“最小化”有效
lStyle = lStyle Or WS_MINIMIZEBOX
’確定以上設(shè)置
SetWindowLong hWnd, GWL_STYLE, lStyle
End Sub
運(yùn)行后就會(huì)發(fā)現(xiàn),在任務(wù)欄中標(biāo)題和圖標(biāo)都有了,點(diǎn)擊右鍵也出現(xiàn)了系統(tǒng)菜單,并且其效果與常規(guī)的基本一致。與常規(guī)窗口不同的有兩個(gè)地方:一是窗口處于活動(dòng)狀態(tài)時(shí),單擊不能將其最小化,但用標(biāo)題欄中的菜單最小化時(shí)單擊任務(wù)欄能恢復(fù)。二是“關(guān)閉”功能失效,并且當(dāng)改變了窗體大小時(shí),窗體的效果由原來的平面變?yōu)?D,這時(shí)可用鼠標(biāo)調(diào)整窗體大小。
窗體式樣的變化
由于Form的BorderStyle屬性在運(yùn)行時(shí)是只讀的,所以一般情況下在運(yùn)行時(shí)不能改變窗體式樣。但我們可以通過API函數(shù)并結(jié)合上節(jié)的相關(guān)內(nèi)容來實(shí)現(xiàn)無邊框窗體與普通窗體之間的轉(zhuǎn)換,實(shí)際上是在保持BorderStyle屬性不變的情況下,對(duì)標(biāo)題欄進(jìn)行了顯示與隱藏的操作。
首先新建一個(gè)工程,在代碼窗口添加以下聲明和過程代碼:
’設(shè)置窗體結(jié)構(gòu)信息函數(shù)
Private Declare Function SetWindowLong Lib “user32” Alias “SetWindowLongA”(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
’獲取窗體結(jié)構(gòu)信息函數(shù)
Private Declare Function GetWindowLong Lib “user32” Alias “GetWindowLongA”(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_SYSMENU = &H80000
Private Const WS_CAPTION = &HC00000
Private Const WS_SIZEBOX = &H40000
Private Const WS_MAXIMIZEBOX = &H10000
Private Const WS_MINIMIZEBOX = &H20000
’為窗體指定一個(gè)新位置和狀態(tài)函數(shù)
Private Declare Function SetWindowPos Lib “user32”(ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Const SWP_NOZORDER = &H4
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_NOREPOSITION = &H200
’獲得整個(gè)窗體的大小和位置
Private Declare Function GetWindowRect Lib “user32”(ByVal hwnd As Long, lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Sub Form_Click()
Dim lStyle As Long
Dim MyRect As RECT
Dim Change As Boolean
’獲取窗體的大小和位置
GetWindowRect Me.hwnd, MyRect
’取得當(dāng)前窗體信息
lStyle=GetWindowLong(Me.hwnd, GWL_STYLE)
If Change Then
’分別使系統(tǒng)菜單(包括圖標(biāo))、標(biāo)題、大小、最大化、最小化顯示/有效
lStyle = lStyle Or WS_SYSMENU
lStyle = lStyle Or WS_CAPTION
lStyle = lStyle Or WS_SIZEBOX
lStyle = lStyle Or WS_MAXIMIZEBOX
lStyle = lStyle Or WS_MINIMIZEBOX
Else
’分別使系統(tǒng)菜單(包括圖標(biāo))、標(biāo)題、大小、最大化、最小化隱藏/無效
lStyle = lStyle And Not WS_SYSMENU
lStyle = lStyle And Not WS_CAPTION
lStyle = lStyle And Not WS_SIZEBOX
lStyle = lStyle And Not WS_MAXIMIZEBOX
lStyle = lStyle And Not WS_MINIMIZEBOX
End If
’按lStyle的值設(shè)置窗體信息
SetWindowLong Me.hwnd, GWL_STYLE, lStyle
’保持窗體的大小與位置不變
SetWindowPos Me.hwnd, 0, MyRect.Left, MyRect.Top,MyRect.Right - MyRect.Left,
MyRect.Bottom - MyRect.Top,SWP_NOREPOSITION Or SWP_NOZORDER Or SWP_FRAMECHANGED
’改變顯示/隱藏狀態(tài)
Change = Not Change
End Sub
這樣,每次單擊窗體,標(biāo)題欄就會(huì)在顯示和隱藏之間進(jìn)行切換。
轉(zhuǎn)載于:https://www.cnblogs.com/tanghuawei/archive/2007/01/12/618837.html
總結(jié)
以上是生活随笔為你收集整理的再谈无边框窗体的操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用JS代码集
- 下一篇: 宣武区政务网教育网的改造