六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 290|回复: 0

Windows mobile 菜单(Menu Bar) 更改解决方案

[复制链接]

升级  92%

56

主题

56

主题

56

主题

秀才

Rank: 2

积分
188
 楼主| 发表于 2013-1-30 22:44:39 | 显示全部楼层 |阅读模式
 
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为SoftKey2hMenu = (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); 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表