[翻译]-WinCE 程序设计 (3rd 版)--4.4 菜单

翻译 tellmenow

菜单在Windows输入中占据重要位置。虽然每个应用程序可能有不同的键盘和手写笔界面,但几乎所有的应用程序都按Windows用户熟悉的结构来组织菜单。

在Windows CE程序中使用菜单有些不同于其它版本的Windows程序,最显著的不同是,在Windows CE里,菜单不是标准顶层窗口的一部分。相反,菜单被绑定到为窗口创建的命令条或者菜单条控件上。除了这一变化外,菜单的功能以及菜单的选择方式同其它版本的Windows大部分是相同的。鉴于这个普遍相似性,在本节我只对Windows菜单管理做一个基本介绍。

要创建菜单,只要简单调用HMENU CreateMenu(void)即可,该函数返回一个空菜单的句柄。要给菜单添加项,可以使用两种调用方式。第一种是调用BOOL AppendMenu (HMENU hMenu, UINT fuFlags, UINT idNewItem, LPCTSTR lpszNewItem),将在菜单末尾添加一个单独菜单项。可以用一系列标志来设置fuFlages参数,用来指示菜单项的初始情形。例如,菜单项开始可能是失效的(使用MF_GRAYED标志)或者有一个选择标记在旁边(使用MF_CHECKED标志)。几乎所有的调用都会指定MF_STRING标志,表示lpszNewItem参数是包含菜单项文本的字符串。idNewItem表示用户选择的菜单项ID或者需要改变的菜单项的状态。

添加菜单项的另一种方法是调用BOOL InsertMenu(HMENU hMenu, UINT uPosition, UINT uFlags, UINT uIDNewItem, LPCTSTR lpNewItem);
该函数与AppendMenu类似,但增加了灵活性,菜单项可以插到菜单的任何位置。对该函数来说,可以传给uFlags两个附加标志之一:MF_BYCOMMAND或MF_BYPOSITION,用来指出如何确定菜单项在菜单里的位置。

菜单可以采用嵌套来达到级联效果。要增加一个级联菜单或者子菜单,可以使用HMENU CreatePopMenu(void)来创建您想绑定的菜单,再用InsertMenu或者AppendMenu来构造该菜单,之后通过把标志位设置为MF_POPUP,调用InsertMenu或者AppendMenu来将该子菜单插入或者附加到主菜单上。在这种情况下,uIDNewItem包含的是子菜单的句柄,而lpNewItem包含的是显示在菜单项里的字符串。

有许多函数可以让您查询或者操纵菜单项,完成增加/去除选择标记、有效/无效菜单项等。
用函数EnableMenuItem来使菜单项有效/失效。
其函数原型如下:BOOL EnableMenuItem (HMENU hMenu, UINT uIDEnableItem, UINT uEnable);
uEnable中使用的标志和其它菜单函数中用的标志类似。在Windows CE中,使用MF_GRAYED而不是MF_DISABLED标志来使菜单项失效。

用函数CheckMenuItem来选择菜单项/去除选择。
其函数原型如下:DWORD CheckMenuItem (HMENU hmenu, UINT uIDCheckItem, UINT uCheck);
还有许多其它函数可以用来查询和操纵菜单项。要获取更多细节,请参阅SDK文档。

下面的代码片段创建了一个简单的菜单结构:
hMainMenu = CreateMenu ();
  
hMenu = CreatePopupMenu ();
AppendMenu (hMenu, MF_STRING | MF_ENABLED, 100, TEXT ("&New"));
AppendMenu (hMenu, MF_STRING | MF_ENABLED, 101, TEXT ("&Open"));
AppendMenu (hMenu, MF_STRING | MF_ENABLED, 101, TEXT ("&Save"));
AppendMenu (hMenu, MF_STRING | MF_ENABLED, 101, TEXT ("E&xit"));
  
AppendMenu (hMainMenu, MF_STRING | MF_ENABLED | MF_POPUP, (UINT)hMenu, TEXT ("&File"));
  
hMenu = CreatePopupMenu ();
AppendMenu (hMenu, MF_STRING | MF_ENABLED, 100, TEXT ("C&ut"));
AppendMenu (hMenu, MF_STRING | MF_ENABLED, 101, TEXT ("&Copy"));
AppendMenu (hMenu, MF_STRING | MF_ENABLED, 101, TEXT ("&Paste"));
  
AppendMenu (hMainMenu, MF_STRING | MF_ENABLED | MF_POPUP, (UINT)hMenu, TEXT ("&Edit"));
  
hMenu = CreatePopupMenu ();
AppendMenu (hMenu, MF_STRING | MF_ENABLED, 100, TEXT ("&About"));
  
AppendMenu (hMainMenu, MF_STRING | MF_ENABLED | MF_POPUP, (UINT)hMenu, TEXT ("&Help"));

一旦创建完菜单,就可以使用TrackPopupMenu来显示它。函数原型如下:
BOOL TrackPopupMenu (HMENU hMenu, UINT uFlags, int x, int y, HWND hWnd, LPTPMPARAMS lptpm);

第一个参数是菜单句柄。根据位置参数x和y,标志位uFlags用来设置菜单的对齐方式,其中一个标志TPM_RETURNCMD,会让函数返回被选择的菜单项的ID,而不是发送一个WM_COMMAND消息。hwnd是接收所有与菜单相关消息的窗口句柄,其中也包括用户选择菜单项时产生的WM_COMMAND消息。最后一个参数lptpm,是指向TPMPARAMS结构的指针,该结构包含一个尺寸值和一个矩形结构。矩形结构定义了菜单不能覆盖的屏幕矩形。如果没有要排除的矩形,则该参数可以是null。

处理菜单命令
当用户选择了一个菜单项,Windows会向拥有该菜单的窗口发送WM_COMMAND消息。wParam的低字位包含被选择的菜单项的ID。其高字位则包含通知码,对“菜单选择”这个动作来说,该值总是0。由选择菜单引发的WM_COMMAND消息,其lParam是0。所以为了响应一个菜单选择动作,窗口需要回应WM_COMMAND消息,解析出传入的ID,并根据选择的菜单项进行响应。

既然我已经涉及了菜单创建的基本过程,您可能想知道创建菜单的代码在Windows程序的哪里。我的回答是,它不存在。除了在运行中动态创建菜单外,大部分Windows程序都是简单的从资源中装载一个菜单模板。要了解更多关于资源的知识,就让我们用本章剩余的部分来看一看资源吧。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值