MFC 应用程序中的菜单提示信息
2006-07-18 11:26:16 来源:WEB开发网当我开始实现用户从菜单项上移开鼠标光标,提示信息必须消失的功能时,我遇到了另外一个非常奇怪的问题。对于主窗口而言,如果用户将鼠标指针移出菜单时,Windows 发送一个 WM_MENUSELECT 消息 ,并且在消息中附带有父菜单句柄和一个 MF_POPUP 标志,这样一来就有可能知道所发生的事情从而隐藏提示信息。但是对于上下文菜单来说,就没有那么幸运了。当用户将鼠标移出上下文菜单时,并没有 WM_MENUSELECT 消息通知你。
没关系,在 Windows 中总会有解决方法。这种情况下,Windows 发送了一个不同的消息WM_ENTERIDLE。事实上,当程序等待输入并且对话框或者菜单被显示的时候,Windows 都会发送 WM_ENTERIDLE 消息。Windows 甚至通情达理到同时传递了对话框或者菜单的窗口句柄 HWND,吃惊吧?所以你所需要做的就是在接受到 WM_ENTERIDLE 消息的时候拿这个窗口句柄与鼠标下的窗口句柄进行比较。如果鼠标下的窗口句柄与随 WM_ENTERIDLE 发送过来的相同,那么鼠标仍然停留在菜单上面;如果鼠标下的是其 它窗口的句柄,那么说明用户已将鼠标移出上下文菜单,取消提示信息的时机到了。Figure 2 中的 CMenuTipManager::OnEnterIdle 函数完成的就是这个功能。
最后,CMenuTipManager 使用了一个 m_bSticky 标记来控制提示信息是立即出现还是延迟一段时间之后才出现。当用户第一次使用某个菜单项的时候,菜单提示信息的出现是需要等待一段时间的。但是如果已经出现过一次提示信息,那么用户在选择其 它的新菜单项时就不必再等。所以一旦显示过提示信息,CMenuTipManager 就将 m_bSticky 置为 TRUE,以便随后的提示信息能够立即显示出来。取消菜单或者调用其 它命令将 m_bSticky 重新设置为 FALSE。
无论菜单项是处于启用还是禁用状态,CMenuTipManager 都会显示同样的提示信息。如果想在你的程序中显示为什么一个菜单项被禁用的信息,你就必须对 CMenuTipManager 和 MFC 的相关机制做一些改动。MFC 期待命令字串具备“长提示信息\n短提示信息”的格式,那意味着 MFC 总是预期有一个分隔长提示信息和短提示信息的换行符。MFC 将长提示信息显示在状态栏上、将短提示信息显示在工具栏上。你应该对这种处理方式进行扩展以便能够加入为什么菜单被禁 用的解释字符串。你必须将 CMenuTipManager::GetResCommandPrompt 函数改写为能够接受两个参数,以便适应命令提示信息为(long/short/disable)的格式,并且你需要改写 OnGetCommandPrompt 函数以便在菜单项有MF_DISABLED 标志时得到菜单项禁 用的提示信息。我将这部分工作留给读者作为练习。
更多精彩
赞助商链接