-------------------------------------------
使窗體右上角的X按鈕失效
-------------------------------------------
程序說明:
本例利用API函數GetSystemMenu得到系統菜單的句柄
X按鈕是系統菜單的一菜單項,然后用RemoveMenu函數
刪去這一菜單項,也就是使X按鈕失效了。
-------------------------------------------
【VB聲明】
PRivateDeclareFunctionGetSystemMenuLib"user32"(ByValhwndAsLong,ByValbRevertAsLong)AsLong
【說明】
取得指定窗口的系統菜單的句柄。在vb環境,“系統菜單”的正式名稱為“控制菜單”,即單擊窗口左上角的控制框時出現的菜單
【返回值】
Long,如執行成功,返回系統菜單的句柄;零意味著出錯。如bRevert設為TRUE,也會返回零(簡單的恢復原始的系統菜單)
【備注】
在vb里使用:系統菜單會向窗口發送一條WM_SYSCOMMAND消息,而不是WM_COMMAND消息
【參數表】
hwnd-----------Long,窗口的句柄
bRevert--------Long,如設為TRUE,表示接收原始的系統菜單
PrivateDeclareFunctionGetSystemMenuLib"user32"(_
ByValhwndAsInteger,_
ByValbRevertAsInteger_
)AsInteger
【VB聲明】
PrivateDeclareFunctionRemoveMenuLib"user32"(ByValhMenuAsLong,ByValnPositionAsLong,ByValwFlagsAsLong)AsLong
【說明】
刪除指定的菜單條目。如刪除的條目屬于一個彈出式菜單,那么這個函數不會同時刪除彈出式菜單。首先應該用GetSubMenu函數取得彈出式菜單的句柄,再在以后將其刪除
【返回值】
Long,非零表示成功,零表示失敗。會設置GetLastError
【備注】
強烈建議大家使用vb菜單的visible屬性從菜單中刪除條目,而不要用這個函數,否則會造成指定菜單中其他菜單條目的visible屬性對錯誤的菜單條目產生影響
【參數表】
hMenu----------Long,菜單的句柄
nPosition------Long,欲改變的菜單條目的標識符。如在wFlags參數中指定了MF_BYCOMMAND,這個參數就代表欲改變的菜單條目的命令ID。如設置的是MF_BYPOSITION,這個參數就代表菜單條目在菜單中的位置(第一個條目的位置為零)
wFlags---------Long,常數MF_BYCOMMAND或MF_BYPOSITION,取決于nPosition參數
PrivateDeclareFunctionRemoveMenuLib"user32"(_
ByValhMenuAsInteger,_
ByValnPositionAsInteger,_
ByValwFlagsAsInteger_
)AsInteger
PrivateSubCommand1_Click()
UnloadMe
EndSub
PrivateSubForm_Load()
DimRAsInteger
MyMenu=GetSystemMenu(Me.hwnd,0)
RemoveMenuMyMenu,&HF060,R
EndSub
程序中用到了兩個API函數GetSystemMenu、RemoveMenu,其中GetSystemMenu函數用來得到系統菜單的句柄,RemoveMenu用來刪除指定的菜單條目,我們先來看看這個函數的聲明和參數:
PrivateDeclareFunctionGetSystemMenuLib"user32"(ByValhwndAsLong,ByValbRevertAsLong)AsLong
   PrivateDeclareFunctionRemoveMenuLib"user32"(ByValhMenuAsLong,ByValnPositionAsLong,ByValwFlagsAsLong)AsLong
其中各GetSystemMenu參數的意義如下表:
參數意義
hwndLong系統菜單所在窗口的句柄
bRevertLong如設為TRUE,表示恢復原始的系統菜單
返回值Long如執行成功,返回系統菜單的句柄;零意味著出錯。如bRevert設為TRUE,也會返回零(簡單的恢復原始的系統菜單)
而RemoveMenu參數的意義如下表:
參數意義
hMenuLong菜單的句柄
nPositionLong欲改變的菜單條目的標識符。如在wFlags參數中指定了MF_BYCOMMAND,這個參數就代表欲改變的菜單條目的命令ID。如設置的是MF_BYPOSITION,這個參數就代表菜單條目在菜單中的位置(第一個條目的位置為零)
wFlagsLong常數MF_BYCOMMAND=&H0&或MF_BYPOSITION=&H400&,取決于nPosition參數
返回值Long,非零表示成功,零表示失敗
然后就可以在程序中使用這兩個函數了,我們在窗體的Form_Load()過程中加入如下代碼:
MyMenu=GetSystemMenu(Me.hwnd,0) 得到系統菜單的句柄,Me.hwnd表示當前窗體的句柄
RemoveMenuMyMenu,&HF060,MF_BYCOMMAND 移去“關閉”菜單項,&HF060“關閉”菜單項的命令ID
接著我們運行程序,看看窗體右上角的X按鈕是不是已經不可點擊了,系統菜單中的“關閉”項也消失了,很有趣,不過一定記著為程序留一個“退出”按鈕哦!
->新聞熱點
疑難解答