Windows Mobile 菜单(Menu Bar,CommandBar)使用更改解决方案
本文参考并引用了如下两篇博客内容:
http://hi.baidu.com/angelmeng86/blog/item/8af9570820d7e388d1581bd2.html
http://blog.163.com/aiding_001/blog/static/229081920100652445753/
搞了很长时间windows mobile的开发了,一直都在使用windows mobile的Menubar,但是一直没有很好的总结一下,今天写篇文章来详细的说一下这方面的东西。
如果是在MFC中使用,我通常用
CCommandBar m_dlgCommandBar;
在OnInitDialog函数中初始化一下。IDR_MENU_MY_POSITION就是Resource中创建的MENU了。
if (!m_dlgCommandBar.Create(this) || !m_dlgCommandBar.InsertMenuBar(IDR_MENU_MY_POSITION)) { TRACE0("Failed to create CommandBar\n"); return FALSE; // fail to create }
当然了,如果不用CCommandBar,也可以是用如下的方式来创建:
SHMENUBARINFO* smb=new SHMENUBARINFO(); smb->cbSize = sizeof(SHMENUBARINFO); smb->hInstRes = ::AfxGetInstanceHandle(); smb->hwndParent = m_hWnd; smb->nToolBarId =IDR_DAYPLANSTART; smb->nBmpId = 0; smb->cBmpImages = 0; smb->dwFlags = SHCMBF_HMENU|SHCMBF_HIDESIPBUTTON; SHCreateMenuBar(smb);
如果使用此种方式来创建,就可以用如下的方式直接获取MenuBar的句柄。
HWND hwndMB=smb->hwndMB; TBBUTTONINFO tbbi={0}; tbbi.cbSize=sizeof(tbbi); tbbi.dwMask=TBIF_LPARAM|TBIF_BYINDEX; ::SendMessage(hwndMB,TB_GETBUTTONINFO,0,(LPARAM)&tbbi); HMENU m_hMenuBar=(HMENU)tbbi.lParam;
如果命令栏是使用 MFC 方式创建的,这里的 hwndMB 可以使用 CCommandBar 类型成员变量 m_dlgCommandBar.m_hWnd 代替。
这样,我们就可以得到一个 HMENU 。 接下来就可以对HMENU进行操作了。
注:
此 hMenu 必须使用第三点的方法得到,在 MFC 方式生成的对话框类中的 m_dlgCommandBar.GetMenu() 得到的 HMENU 跟第三点里得到的结果是不一致的,我试过操纵 m_dlgCommandBar.GetMenu() 方式得到的 HMENU ,结果是菜单确实是更改了,但是显示没有效果而用第三点的方法得到的 hMenu 是有效果的。
对菜单修改:
2 、隐藏菜单
HWND hwnd = ::SHFindMenuBar(m_hWnd); if(hwnd != NULL) ::ShowWindow(hwnd, SW_HIDE);
3 、隐藏某个子菜单
HMENU hMenu = NULL; TBBUTTONINFO tbbi = {0}; tbbi.cbSize = sizeof(TBBUTTONINFO); tbbi.dwMask = TBIF_LPARAM | TBIF_BYINDEX; ::SendMessageW(mbi.hwndMB, TB_GETBUTTONINFO, 1, (LPARAM)&tbbi); // 0为SoftKey1,1为SoftKey2 hMenu = (HMENU)tbbi.lParam; EnableMenuItem(hMenu, IDM_TEST, MF_GRAYED); // 隐藏子菜单 EnableMenuItem(hMenu, IDM_TEST, MF_ENABLED); // 显示子菜单
4 、使某个SoftKey 不 可用
::SHEnableSoftkey(mbi.hwndMB, 0, TRUE, FALSE);
5 、动态修改菜单
ModifyMenu(hMenu, IDM_TEST, MF_DISABLED | MF_STRING, IDM_TEST, L"修改后的文字"); InsertMenu(hMenu, beforeItem, MF_BYCOMMAND, afterItem, L”新增加的菜单”); // 加入含有欲改写文本的菜单项 DeleteMenu(hMenu, beforeItem, MF_BYCOMMAND); // 删除被改写的菜单 DrawMenuBar(); // 刷新菜单
使用菜单句柄对里面的菜单项进行修改。同时也可使用如下方法:
TCHAR szDrawText[100]; wcscpy(&szDrawText[0],sChangeText);sChangeText是CString类型,注意长度不要超过 szDrawText定义的长度。 MENUITEMINFO mii; memset((char *)&mii, 0, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_TYPE; mii.dwTypeData = &szDrawText[0]; mii.cch = 100; mii.fType =MFT_STRING; GetMenuItemInfo(m_hMenuBar, ID_TAKEPHOTO, FALSE, &mii);//获取菜单项信息 SetMenuItemInfo(m_hMenuBar, ID_TAKEPHOTO, FALSE, &mii);//设置菜单项信息 ID_TAKEPHOTO是菜单项的ID
6.设置MenuBar的选中状态
CheckMenuItem(m_hMenuBar,ID_MENU_MY_POSITION_DISPLAY_MY_POSITION,MF_UNCHECKED);