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);