メニューから指定の項目を削除
Declare Function DeleteMenu Lib "user32.dll" _
(ByVal hMenu As Long, ByVal uPosition As Long, ByVal uFlags As Long) As Long
Declare Function DeleteMenu Lib "user32.dll" _
(ByVal hMenu As Integer, ByVal uPosition As Integer, ByVal uFlags As Integer) As Integer
BOOL DeleteMenu(
HMENU hMenu,
UINT uPosition,
UINT uFlags
);
引数
hMenu
メニューのハンドルnPosition
メニュー項目のインデックス or IDuFlags
nPositionの意味を指定する定数戻り値
正常終了のとき 押されたボタンの定数備考
エラーのとき 0
この関数を実行後、DrawMenuBar()関数でメニューバーを再描画する必要があるuFlagsの定数
MF_BYCOMMAND = &H0 nPositionはメニュー項目のIDサンプル
MF_BYPOSITION = &H400 nPositionはメニュー項目のインデックス
ダウンロード(DeleteMenu.lzh 9SPAN.39KB)Public Const IDM_MENU0 = &H100 'メニューのコマンド名 Public Const IDM_MENU0_1 = &H101 'サブメニュー
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 _ , 300 _ , 150 _ , 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, hPopupMenu2 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) hPopupMenu2 = CreatePopupMenu 'メニューを挿入 Call InsertMenu(hMenu, 1, MF_BYPOSITION Or MF_POPUP, hPopupMenu2, "ダミー") 'サブメニュー Call InsertMenu(hPopupMenu2, 0, MF_BYPOSITION, 0, "ボタンを押すと削除") 'メニューをウィンドウに関連付ける Call SetMenu(hWnd, hMenu) 'メニューバーの再描画 Call DrawMenuBar(hWnd) 'ボタンの作成 Call CreateWindowEx(0, "Button", "メニューの削除", WS_VISIBLE Or WS_CHILD, _ 100, 20, 150, 50, hWnd, 10, 0, 0) Case WM_COMMAND If wParam = 10 Then 'メニューの削除 Call DeleteMenu(GetMenu(hWnd), 1, MF_BYPOSITION) Call DrawMenuBar(hWnd) End If 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