WIN32汇编语言教程:第09章 通用控件 · 9.2 使用状态栏(4)
9.2.3 在状态栏上显示菜单提示信息
本节演示当用户浏览菜单项的时候如何在状态栏上面显示菜单提示信息。每当用户将鼠标移过一个菜单项的时候,Windows会向窗口过程发送一条WM_MENUSELECT消息,当用户真正选择了菜单项的时候,Windows才会发送WM_COMMAND消息,为了显示菜单项提示信息,必须响应WM_MENUSELECT消息并根据浏览的菜单项显示对应的提示信息。
如果由我们自己实现这个功能,那么可以用4个步骤完成:首先是响应WM_MENUSELECT消息并从消息参数中获取用户浏览的菜单项ID;第2步是根据菜单项ID获取对应的提示信息字符串;第3步是将状态栏的分栏取消以便用整个状态栏显示提示信息;第4步是在状态栏上显示字符串。
但在现实中不必这样做,在状态栏上面显示菜单提示信息的应用是这样的广泛,以至于系统为此设置了一个专用的函数MenuHelp:
invoke MenuHelp,uMsg,wParam,lParam,hMenu,hInstance,hwndStatus,lpwIDs
这个函数是和WM_MENUSELECT消息配合使用的,输入参数中的uMsg,wParam和lParam可以取自WM_MENUSELECT消息的对应参数,hMenu是用户当前浏览的菜单句柄,由于WM_MENUSELECT消息的lParam参数传递过来的就是菜单句柄,所以函数的hMenu参数也可以直接使用lParam。hwndStatus参数指定了状态栏窗口的句柄。
hInstance和lpwIDs配合指定了需要显示的提示信息字符串,MenuHelp函数使用的字符串必须放在资源文件的字符串表中,函数会自动使用LoadString装入正确的字符串,参数hInstance指定了包含字符串资源的模块的实例句柄。lpwIDs指向一个包含4个双字的数组,用来指定函数装入的字符串的ID值基数,第一个双字指定命令菜单项的基数,第二个双字指定弹出式菜单的基数。基数加上用户当前浏览的菜单项ID得到的数值就是MenuHelp函数要装入的字符串ID。
举例说明,例子程序中调用MenuHelp函数如下:
dwMenuHelp dd 0,IDM_MENUHELP,0,0 ... .elseif eax == WM_MENUSELECT invoke MenuHelp,WM_MENUSELECT,wParam,lParam,lParam,hInstance,\ hWinStatus,offset dwMenuHelp
资源脚本文件中的字符串表定义如下:
stringtable discardable BEGIN IDM_MENUHELP "包含文件操作的命令" IDM_MENUHELP+1 "包含操作视图的命令" IDM_OPEN "打开需要编辑的文件" IDM_SAVEAS "以另外一个文件名保存文件" IDM_PAGESETUP "选择打印机以及设置页边距、纸张大小等打印参数" ...
dwMenuHelp数值第一项指定的基数为0,所以对于IDM_OPEN和IDM_SAVEAS等命令菜单项,MenuHelp显示的字符串就等于菜单项ID,我们在资源脚本中只要将对应菜单项的提示字符串ID等同于菜单项ID定义就可以了。
dwMenuHelp数值第二项指定的基数为IDM_MENUHELP,由于弹出式菜单没有ID,系统按照菜单的索引号加上基数当做字符串ID,所以对于第一个弹出式菜单“文件”,函数显示的是ID号为IDM_MENUHELP的字符串,对于第二个弹出式菜单“查看”,菜单索引为1,所以函数显示的是ID为IDM_MENUHELP+1的字符串。
用例子程序中这种简单的逻辑可以显示命令菜单项和第一级弹出式菜单的提示信息,但是无法显示第二级弹出式菜单的提示信息,如果要显示第二级弹出式菜单的提示信息,就必须根据WM_MENUSELECT消息的参数自己判断菜单是否是二级弹出式菜单,并根据不同的情况调用不同参数的MenuHelp函数来实现。