[cpp]
// 首先需要定義菜單的ID
#define IDM_FILE_NEW 40001
#define IDM_FILE_OPEN 40002
#define IDM_EDIT_COPY 40003
#define IDM_EDIT_CUT 40004
HMENU hMenu;
HMENU hMenuPop;
// Menu Append
hMenu = CreateMenu(); //主菜單,水平
hMenuPop = CreateMenu(); //下拉的菜單,垂直
AppendMenu(hMenuPop,MF_STRING,IDM_FILE_NEW,TEXT("New"));
AppendMenu(hMenuPop,MF_STRING,IDM_FILE_OPEN,TEXT("Open"));
AppendMenu(hMenu,MF_POPUP,(unsigned int)hMenuPop,TEXT("File"));
hMenuPop = CreateMenu();
AppendMenu(hMenuPop,MF_STRING,IDM_EDIT_COPY,TEXT("Copy"));
AppendMenu (hMenuPop, MF_SEPARATOR, 0, NULL) ;
AppendMenu(hMenuPop,MF_STRING,IDM_EDIT_CUT,TEXT("Cut"));
AppendMenu(hMenu,MF_POPUP,(unsigned int)hMenuPop,TEXT("Edit"));// Menu Insert
InsertMenu(hMenu, 0, uTemp, IDM_EDIT_CUT+7, TEXT("NewAdd"));
SetMenu(hwnd, hMenu);
其他的都還好說,解釋一下InsertMenu(因為網上能查到的使用InsertMenu的部分,都是CMenu的),InsertMenu
的第一個參數是要插入的菜單HMENU;第二個參數為要參入的菜單項的位置,比如這裡的0代表插入到菜單New的前面(也就是最前面一項),1代表插入到New的後面(第二項);第三個參數指的是標志,一般指定UINT uTemp=MF_BYPOSITION | MF_POPUP就行;第四個參數指的是新菜單項的ID,這裡是IDM_EDIT_CUT+7;
第五個參數指的是要加入菜單項的name;
無論是AppendMenu好還是InsertMenu好,操作之後都要SetMenu到原來的hwnd那,才能使操作之後的菜單項生效。。
為什麼要有菜單的ID呢。。
我們來思考這樣的一個問題-----當我們想要處理菜單項事件的時候,用什麼來定位到想要處理的菜單項呢?
。。。
所以菜單項的ID還是挺重要的,因為我們需要在WM_COMMAND中通過這個ID來定位到某個菜單項:
[cpp]
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
switch (wParam)
{
case IDM_FILE_NEW:
MessageBox(hwnd, TEXT("this menu is IDM_FILE_NEW"), szAppName, MB_OK);
break;
case IDM_FILE_OPEN:
MessageBox(hwnd, TEXT("this menu is IDM_FILE_OPEN"), szAppName, MB_OK);
break;
default:
break;
}
break;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
此總結配圖: