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手机全屏解决方案.C#.
windows mobile上MFC动态菜单的程序
WindowsMobile5 源码WindowsMobile5 源码WindowsMobile5 源码WindowsMobile5 源码
仿电脑开始菜单 手机版windows mobile系统 STM5700
如何搭建windows mobile应用开发的环境
Windows Mobile开发实验,wince操作系统定制。
众所周知,在windows7操作系统中已经不需要安装active sync ...清您下载windows mobile center for windows7(vista也是如此)软件,然后将手机与电脑连接即可.亲自操作,该方法适合于任何版本的windows mobile 手机系统.
windows mobile 更改安装的图标
Windows Mobile开发Windows Mobile开发Windows Mobile开发Windows Mobile开发
Windows Mobile for HP iPAQ 114
Windows Mobile 经典源码 学习Windows Mobile 的不二选择
windows mobile 平台下的My mobile软件。
windows mobile 6.1注册表修改技巧
QR条形码的开发程序,能够在windows mobile 6中实现QR条形码的开发程序,能够在windows mobile 6中实现,eMbedded Visual C++和VS两种源代码
Windows mobile 6.5常用软件
windows mobile 6.0 基于WebService方式与PC Server通讯的demo
windows mobile注册表修改详解方案集合
Windows Mobile应用程序开发介绍 .Windows Mobile平台 .Windows Mobile开发环境搭建 .Windows Mobile开发技术和资源 .Demo
windows mobile直连版
WINDOWS MOBILE滑屏解锁