在wince与wm中,菜单创建过程如下:
1 菜单栏的创建 (1) Win32 和 MFC 都适用的创建方式
/* 加载菜单到窗口, 并返回菜单窗口句柄 uiMenuID 菜单资源ID pWnd 需要加载菜单的窗口返回值 菜单栏窗口句柄 */
HWND Menu_LoadMenuToWnd( UINT uiMenuID, CWnd* pWnd )
{ SHMENUBARINFO mbi; ZeroMemory(&mbi, sizeof(SHMENUBARINFO)); mbi.cbSize = sizeof(SHMENUBARINFO); mbi.hwndParent = pWnd->m_hWnd; mbi.hInstRes = ::AfxGetInstanceHandle(); mbi.dwFlags = SHCMBF_HMENU|SHCMBF_HIDESIPBUTTON; //隐藏SIP mbi.nToolBarId = uiMenuID; if( !SHCreateMenuBar(&mbi) ) { WRITE_LOG1( "::LoadMenuToWnd error, error code is %d./r/n", GetLastError() ); return NULL; } return mbi.hwndMB; }
(2) 在MFC上, 也可以这样创建菜单 if (!m_dlgCommandBar.Create(this) || !m_dlgCommandBar.InsertMenuBar(IDR_MENU_MAIN)) //IDR_MENU_MAIN 菜单资源ID { TRACE0("未能创建 CommandBar/n"); return FALSE; // 未能创建 } 不过这样创建的菜单好像在动态改变菜单项的时候比较麻烦 MFC下的对话框工程, 主窗口有个默认的菜单IDR_MAINFRAME, 我试着在其上面直接添加菜单项, 彷佛永远都不起作用, 不知道怎么回事. 2 获取菜单栏的左右菜单句柄 在上一步创建的菜单与win32 pc上创建的菜单实际上是不同的, 在WM上要想操作子菜单项, 还必须要先获取子菜单项的句柄 /* 由菜单窗口句柄获取右软件菜单句柄 hWnd, 菜单栏窗口句柄返回值 左(右)软键菜单句柄 */ HMENU Menu_GetSK1FromMenuHwnd( HWND hWnd) { TBBUTTONINFO tbbi = {0}; tbbi.cbSize = sizeof(TBBUTTONINFO); tbbi.dwMask = TBIF_LPARAM | TBIF_BYINDEX; ::SendMessageW(hWnd, TB_GETBUTTONINFO, 1, (LPARAM)&tbbi); //0为左软键,1为右软键, return (HMENU)tbbi.lParam; }
3 菜单项的编辑 SendMessageW发送TB_SETBUTTONINFO可以修改左右软键的属性, 选中状态, 以及是否disable等, 实际上这是按钮, 而不是菜单. 用EnableMenuItem, CHeckMenuItem等这些api也可以编辑菜单项. 在MFC工程中, 也可以CMenu::FromHandle后用 CMenu类来操作.
4 在wm5上, 好像一定要重写OnInitMenuPopup这个函数后才能正确的编辑菜单项