指定の項目を削除
Declare Function RemoveMenu Lib "user32.dll" _
(ByVal hMenu As Long, ByVal nPosition As Long, _
ByVal uFlag As Long) As Long
Declare Function RemoveMenu Lib "user32.dll" _
(ByVal hMenu As Integer, ByVal nPosition As Integer, _
ByVal uFlag As Integer) As Integer
BOOL RemoveMenu(
HMENU hMenu,
UINT uPosition,
UINT uFlags
);
引数
hMenu
メニューのハンドルnPosition
メニュー項目のID or インデックスuFlag
nPositionの意味を示す定数戻り値
ウィンドウの直前の状態が無効のとき 0以外備考
有効のとき 0
削除したあとは再描画(DrawMenuBar()関数)が必要uFlagの定数
サンプル
MF_BYCOMMAND = &H0 nPositionはメニュー項目のID
MF_BYPOSITION = &H400 nPositionはメニュー項目のインデックス
ダウンロード(RemoveMenu.lzh 9.42KB)Public Const IDM_MENU0 = &H100 'メニューのコマンド名 Public Const IDM_MENU0_1 = &H101 'サブメニュー Public Cnt As Long
Public Sub Main() '<-----------C++では「WinMain」に当たる Dim hWnd As Long, MSG As Message, wcl As WNDCLASSEX Dim ClassName As String, hParentWnd As Long 'クラス名 ClassName = "Test" With wcl .cbSize = Len(wcl) .hInstance = App.hInstance .lpszClassName = ClassName .lpfnWndProc = ChangeAddressOf(AddressOf TestProc) .style = 0 .hIcon = LoadIcon(0, ByVal IDI_APPLICATION) .hIconSm = LoadIcon(0, ByVal IDI_APPLICATION) .hCursor = LoadCursor(0, 32512) .lpszMenuName = 0 .cbClsExtra = 0 .cbWndExtra = 0 .hbrBackground = GetStockObject(LTGRAY_BRUSH) End With Call RegisterClassEx(wcl) hParentWnd = CreateWindowEx(WS_EX_APPWINDOW Or WS_EX_WINDOWEDGE _ , wcl.lpszClassName, "Now Testing!", _ WS_CAPTION Or WS_VISIBLE Or WS_SYSMENU Or WS_MINIMIZEBOX _ , CW_USEDEFAULT _ , CW_USEDEFAULT _ , 100 _ , 100 _ , 0, 0, App.hInstance, 0) Call ShowWindow(hParentWnd, SW_SHOW) Call UpdateWindow(hParentWnd) Do While (GetMessage(MSG, 0, 0, 0)) Call TranslateMessage(MSG) Call DispatchMessage(MSG) Loop End Sub
Public Function TestProc(ByVal hWnd As Long, ByVal MSG As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Dim hMenu As Long, hPopupMenu As Long Select Case MSG Case WM_CREATE '--------初期化 'メニューの作成 hMenu = CreateMenu hPopupMenu = CreatePopupMenu 'メニューを挿入 Call InsertMenu(hMenu, 0, MF_BYPOSITION Or MF_POPUP, hPopupMenu, "グループ") 'サブメニュー Call InsertMenu(hPopupMenu, 0, MF_BYPOSITION, 0, "項目1") Call InsertMenu(hPopupMenu, 1, MF_BYPOSITION, 1, "項目2") Call InsertMenu(hPopupMenu, 2, MF_BYPOSITION, 2, "項目3") 'グループ化する Call CheckMenuRadioItem(hPopupMenu, 0, 2, 1, MF_BYPOSITION) 'メニューをウィンドウに関連付ける Call SetMenu(hWnd, hMenu) 'メニューバーの再描画 Call DrawMenuBar(hWnd) 'ボタンを作る Call CreateWindowEx(WS_EX_CLIENTEDGE, "Button", "押す", _ WS_VISIBLE Or WS_CHILD, 10, 10, 80, 40, hWnd, 10, 0, 0) Case WM_COMMAND Select Case wParam Case 10 'メニューの削除 hMenu = GetMenu(hWnd) Call RemoveMenu(GetSubMenu(hMenu, 0), 0, MF_BYPOSITION) Call DrawMenuBar(hWnd) End Select Case WM_DESTROY '終了 'メニューの破棄 Call DestroyMenu(GetMenu(hWnd)) 'ウィンドウの破棄 Call DestroyWindow(Frame) PostQuitMessage (0) End Select TestProc = DefWindowProc(hWnd, MSG, wParam, lParam) End Function
Public Function ChangeAddressOf(ByVal Address As Long) As Long 'AddressOf演算子は変数として使えないので、間接的に使えるようにする ChangeAddressOf = Address End Function