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