使窗體右上角的X按鈕失效刪除系統(tǒng)菜單
發(fā)表時(shí)間:2023-08-17 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]內(nèi)容簡介:刪除系統(tǒng)菜單Dim MHwd As LongMHwd = GetSystemMenu(Me.hwnd, False)MsgBox DeleteMenu(MHwd, &H0&...
內(nèi)容簡介:
刪除系統(tǒng)菜單Dim MHwd As Long
MHwd = GetSystemMenu(Me.hwnd, False)
MsgBox DeleteMenu(MHwd, &H0&, &H400)
源代碼內(nèi)容:
窗體右上角的X按鈕通常用來關(guān)閉一個(gè)程序,這個(gè)小X按鈕實(shí)際上是和系統(tǒng)菜單的“關(guān)閉”菜單項(xiàng)關(guān)聯(lián)在一起的,什么?不知道什么是系統(tǒng)菜單,系統(tǒng)菜單是指我們點(diǎn)擊窗體左上角的小圖標(biāo)時(shí)所彈出的菜單,其中好象有“恢復(fù)”、“移動(dòng)”、“最大化”、“最小化”、“關(guān)閉”這么幾個(gè)按鈕。這個(gè)菜單用普通的方法是不能編輯和改變的,但是我們可以通過API函數(shù)GetSystemMenu來得到它的句柄,然后通過菜單相關(guān)的API函數(shù)就能改變它了,下面一起看看怎么做吧。
為了學(xué)習(xí)方便,下面先給出源碼,并且已經(jīng)作了詳細(xì)的中文注釋:
程序說明:
本例利用API函數(shù)GetSystemMenu得到系統(tǒng)菜單的句柄
X按鈕是系統(tǒng)菜單的一菜單項(xiàng),然后用RemoveMenu函數(shù)
刪去這一菜單項(xiàng),也就是使X按鈕失效了。
-------------------------------------------
【VB聲明】
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
【說明】
取得指定窗口的系統(tǒng)菜單的句柄。在vb環(huán)境,“系統(tǒng)菜單”的正式名稱為“控制菜單”,即單擊窗口左上角的控制框時(shí)出現(xiàn)的菜單
【返回值】
Long,如執(zhí)行成功,返回系統(tǒng)菜單的句柄;零意味著出錯(cuò)。如bRevert設(shè)為TRUE,也會(huì)返回零(簡單的恢復(fù)原始的系統(tǒng)菜單)
【備注】
在vb里使用:系統(tǒng)菜單會(huì)向窗口發(fā)送一條WM_SYSCOMMAND消息,而不是WM_COMMAND消息
【參數(shù)表】
hwnd ----------- Long,窗口的句柄
bRevert -------- Long,如設(shè)為TRUE,表示接收原始的系統(tǒng)菜單
Private Declare Function GetSystemMenu Lib "user32" ( _
ByVal hwnd As Integer, _
ByVal bRevert As Integer _
) As Integer
【VB聲明】
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
【說明】
刪除指定的菜單條目。如刪除的條目屬于一個(gè)彈出式菜單,那么這個(gè)函數(shù)不會(huì)同時(shí)刪除彈出式菜單。首先應(yīng)該用GetSubMenu函數(shù)取得彈出式菜單的句柄,再在以后將其刪除
【返回值】
Long,非零表示成功,零表示失敗。會(huì)設(shè)置GetLastError
【備注】
強(qiáng)烈建議大家使用vb菜單的visible屬性從菜單中刪除條目,而不要用這個(gè)函數(shù),否則會(huì)造成指定菜單中其他菜單條目的visible屬性對錯(cuò)誤的菜單條目產(chǎn)生影響
【參數(shù)表】
hMenu ---------- Long,菜單的句柄
nPosition ------ Long,欲改變的菜單條目的標(biāo)識符。如在wFlags參數(shù)中指定了MF_BYCOMMAND,這個(gè)參數(shù)就代表欲改變的菜單條目的命令I(lǐng)D。如設(shè)置的是MF_BYPOSITION,這個(gè)參數(shù)就代表菜單條目在菜單中的位置(第一個(gè)條目的位置為零)
wFlags --------- Long,常數(shù)MF_BYCOMMAND或MF_BYPOSITION,取決于nPosition參數(shù)
Private Declare Function RemoveMenu Lib "user32" ( _
ByVal hMenu As Integer, _
ByVal nPosition As Integer, _
ByVal wFlags As Integer _
) As Integer
Private Sub Command1_Click()
Unload Me
End Sub
Private Sub Form_Load()
Dim R As Integer
MyMenu = GetSystemMenu(Me.hwnd, 0)
RemoveMenu MyMenu, &HF060, R
End Sub
程序中用到了兩個(gè)API函數(shù)GetSystemMenu、RemoveMenu,其中GetSystemMenu函數(shù)用來得到系統(tǒng)菜單的句柄,RemoveMenu用來刪除指定的菜單條目,我們先來看看這個(gè)函數(shù)的聲明和參數(shù):
Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
其中各GetSystemMenu參數(shù)的意義如下表:
參數(shù) 意義
hwnd Long 系統(tǒng)菜單所在窗口的句柄
bRevert Long 如設(shè)為TRUE,表示恢復(fù)原始的系統(tǒng)菜單
返回值 Long 如執(zhí)行成功,返回系統(tǒng)菜單的句柄;零意味著出錯(cuò)。如bRevert設(shè)為TRUE,也會(huì)返回零(簡單的恢復(fù)原始的系統(tǒng)菜單)
而RemoveMenu參數(shù)的意義如下表:
參數(shù) 意義
hMenu Long 菜單的句柄
nPosition Long 欲改變的菜單條目的標(biāo)識符。如在wFlags參數(shù)中指定了MF_BYCOMMAND,這個(gè)參數(shù)就代表欲改變的菜單條目的命令I(lǐng)D。如設(shè)置的是MF_BYPOSITION,這個(gè)參數(shù)就代表菜單條目在菜單中的位置(第一個(gè)條目的位置為零)
wFlags Long 常數(shù)MF_BYCOMMAND=&H0&或MF_BYPOSITION=&H400&,取決于nPosition參數(shù)
返回值 Long,非零表示成功,零表示失敗
然后就可以在程序中使用這兩個(gè)函數(shù)了,我們在窗體的Form_Load()過程中加入如下代碼:
MyMenu = GetSystemMenu(Me.hwnd,0) 得到系統(tǒng)菜單的句柄,Me.hwnd表示當(dāng)前窗體的句柄
RemoveMenu MyMenu, &HF060, MF_BYCOMMAND 移去“關(guān)閉”菜單項(xiàng),&HF060“關(guān)閉”菜單項(xiàng)的命令I(lǐng)D
接著我們運(yùn)行程序,看看窗體右上角的X按鈕是不是已經(jīng)不可點(diǎn)擊了,系統(tǒng)菜單中的“關(guān)閉”項(xiàng)也消失了,很有趣,不過一定記著為程序留一個(gè)“退出”按鈕哦!