windows mobile 菜单处理

本文详细介绍了如何使用Win32API创建菜单,并解决菜单加载失败的问题。文章提供了具体的步骤,包括创建菜单资源、加载资源及显示隐藏菜单等操作,并给出示例代码帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Menu的问题

 

在使用win32API进行创建一个菜单的时候,一般按照这样的步骤:

1, 在资源文件中创建菜单资源

2, 在窗体中加载资源

以上如windows+mobile编程中所提,可是操作完成以后却发现菜单没有被加载进来,寻找原因发现如下:

WM的菜单比较特殊,首先菜单本身是一个窗体,拥有句柄(HWND)并且可以通过::showWindow()函数进行显示和隐藏,这就是menu bar

在创建一个新的窗体的时候,系统会默认创建一个空的menubar,例如在你刚刚创建的窗体上也是存在menubar的,只是上面只显示一个输入法的图标。

当然也可以隐藏掉menubar,不过隐藏前最好使用函数SHFindMenuBarhwnd)获取当前menubar句柄进行保存。然后就可以对menubar进行隐藏显示操作了,就跟普通窗体操作一样。

   另外窗口创建的过程中,可以不使用系统的 menu bar ,自己动态创建 menu bar ,创建 menu bar

 

 

1.创建并显示菜单
  SHMENUBARINFO mbi;
  ZeroMemory(&mbi, sizeof(SHMENUBARINFO));
  mbi.cbSize=sizeof(SHMENUBARINFO);
  mbi.hwndParent=m_hWnd;
  mbi.hInstRes=::AfxGetInstanceHandle();
  mbi.dwFlags=SHCMBF_HMENU|SHCMBF_HIDESIPBUTTON;//隐藏SIP
  mbi.nToolBarId=IDR_MYMENU;
  SHCreateMenuBar(&mbi);

2.隐藏菜单

  /(1)隐藏窗口上的所有菜单

  HWND hwnd=::SHFindMenuBar(m_hWnd);
  if(hwnd!=NULL)
  ::ShowWindow(hwnd,SW_HIDE);

/(2)因为菜单本身也是定义为窗口,所以可通过其句柄来隐藏

::ShowWindow(mbi.hwndMB,SW_HIDE);

 



3.隐藏某个子菜单项
   TBBUTTONINFO tbbi = {0};
   tbbi.cbSize = sizeof(TBBUTTONINFO);
   tbbi.dwMask = TBIF_LPARAM | TBIF_BYINDEX;               
   ::SendMessageW(mbi.hwndMB, TB_GETBUTTONINFO,0, (LPARAM)&tbbi); //0为SK1,1为SK2(即左右软键)
   g_hMenu = (HMENU)tbbi.lParam;//g_hMenu为全局变量,这样就可以在任何地方隐藏子菜单了

  EnableMenuItem(g_Menu,ID_TEST,MF_GRAYED);//隐藏子菜单
  //显示子菜单
  EnableMenuItem(g_Menu,ID_TEST,MF_ENABLED);

  在使用语言Module时,要注意库中的ID与应用程序中定义的ID是否一致。

4.使某个SK(Soft Key)不可用
::SHEnableSoftkey(mbi.hwndMB,0,TRUE,FALSE);

 

5.子菜单打勾

 

 

HMENU hMenu;   

HWND hwndMenuBar = ::SHFindMenuBar(m_hWnd); //m_hWnd是窗口句柄  

tbbi.cbSize = sizeof(tbbi);   

tbbi.dwMask = TBIF_LPARAM|TBIF_BYINDEX;  

//三个参数1表示右菜单,为0表示左菜单  

 ::SendMessage(hwndMenuBar, TB_GETBUTTONINFO, 1, (LPARAM)&tbbi);   

hMenu = (HMENU)tbbi.lParam; //hMenu这个句柄就是菜单操作常用的句柄了,获得这个句柄非常有用。  

WORD ack =    CheckMenuItem(hMenu,ID_STARTUP,MF_BYCOMMAND|MF_CHECKED);  

 

 

 

参考blog

1. http://blog.youkuaiyun.com/lincyang/archive/2010/03/27/5422426.aspx

2. http://hi.baidu.com/bjwangc/blog/item/d4d2e882a2bbefac0df4d265.html

3. http://www.cppblog.com/gtwdaizi/articles/55157.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值