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

 

你可能感兴趣的:(Windows,Mobile,Mobile,Windows,MFC,Blog)