当前位置: 代码迷 >> Windows Mobile >> Windows mobile 菜单(Menu Bar) 更动解决方案
  详细解决方案

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

热度:469   发布时间:2016-04-25 07:37:05.0
Windows mobile 菜单(Menu Bar) 更改解决方案

?

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

?

  相关解决方案