按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
主菜单中的“查看”菜单,所以按鼠标右键弹出的菜单和下拉菜单中的“查看”菜单是一模一样的。
来源:电子工业出版社 作者:罗云彬 上一页 回书目 下一页
上一页 回书目 下一页
第5章 使用资源
5。1 菜单和加速键(7)
7。 菜单状态的检测和设置
在程序中经常要对菜单项的状态进行设置,如剪贴板中没有数据时,“粘贴”菜单项应该灰化,窗口中没有被选中的字符时,“拷贝”菜单项也应该灰化,这样可以给使用者一个善意的提醒。同样,对菜单的状态也常常需要检测,如查看菜单项的状态是否处于灰化状态或选中状态以便进行下一步操作等。
对菜单项状态的检测可以用GetMenuState函数来完成,用法是:
invoke GetMenuState;hMenu,uId,uFlags
参数hMenu是菜单的句柄,uId用来定位要检测的菜单项,当uFlags是MF_BYMAND的时候,uId用菜单项的命令ID指定,当uFlags是MF_BYPOSITION的时候,uId的值是位置索引,函数执行后的返回值为-1时表示失败,否则会是MF_CHECKED,MF_DISABLED,MF_GRAYED,MF_HILITE,MF_MENUBARBREAK,MF_MENUBREAK和MF_SEPARATOR的组合值,它们分别表示菜单项的状态是选中、禁用、灰化、高亮显示以及3种分隔线,读者可以用test指令测试相应的数据位来分辨菜单项处于哪种状态,一般的测试代码如下:
invoke GetMenuState;hMenu;IDM_XXX;MF_BYMAND
。if eax & MF_CHECKED
;表示IDM_XXX菜单项现在是选中状态
。endif
同样,读者也可以用eax & MF_DISABLED和eax & MF_GRAYED等条件测试其他状态。
设置菜单项的状态可以用下列3个函数来实现不同的功能:
invoke EnableMenuItem;hMenu;uIDEnableItem;uEnable
invoke CheckMenuItem;hMenu;uIDCheckItem;uCheck
invoke CheckMenuRadioItem;hMenu;idFirst;idLast;idCheck;uFlags
EnableMenuItem函数将菜单项在禁用、可用和灰化状态之间切换,uEnable可以取值为MF_DISABLED,MF_ENABLED和MF_GRAYED,分别代表这3种状态。
CheckMenuItem函数将菜单项在非互斥的选定状态和非选定状态之间切换(即前面是否有对钩),uCheck的取值可以是MF_CHECKED或MF_UNCHECKED,代表选定或非选定状态。
CheckMenuRadioItem将菜单项在互斥的选定状态和非选定状态之间切换(即前面是否有圆点标志),由于互斥的菜单项在一个范围内只有一个是可以选定的,当选定另一个的时候,原来的选定应该撤销,idFirst和idLast就指定了这个互斥范围。函数在选定idCheck指定的菜单项的同时将自动清除idFirst和idLast范围内的其他选定。所以uFlags中无需指定状态,只需指定MF_BYMAND或MF_BYPOSITION定位方法。
在这些函数的参数中,uIDEnableItem,uIDCheckItem,idFirst,idLast和idCheck用来定位菜单项,同样,参数的取值可以是菜单项的命令ID或位置索引,可以在状态参数(uEnable,uCheck,uFlags)中组合定义MF_BYMAND或MF_BYPOSITION来决定使用哪种方法。
在例子程序中,当选中IDM_TOOLBAR和IDM_STATUSBAR之间的菜单项的时候,程序先用invoke GetMenuState;hMenu;ebx;MF_BYMAND获取当前的状态,检查是否选定,并将选定状态反转后用CheckMenuItem重新设置:
。elseif eax 》= IDM_TOOLBAR && eax = IDM_BIG && eax