MFC应用程序中的菜单提示信息
2008-01-19 20:23:58 来源:WEB开发网CMenuTipManager 使用了我闻名于世的子类化窗口类 CSubClassWnd 来捕获发往主窗口的 WM_MENUSELECT 消息。当用户在主菜单、系统菜单甚至上下文菜单中选中不同的的菜单项时,Windows 都会像 宿主窗口发送一个 WM_MENUSELECT 消息。如果你想提供反馈信息或者做其它自己你想做的事,此时便是最佳时机。MFC 的 CFrameWnd::OnMenuSelect 处理 WM_MENUSELECT 消息以便在状态栏上显示命令提示信息。CMenuTipManager 捕获同样的消息来显示菜单提示信息,Figure 2 展示了相关的代码。
总体上来说,CMenuTipManager 还是非常容易理解的,但是在 Windows 中还是有几点需要注意。首先是工具提示信息本身:有人曾指出过如何使用 Windows 标准的工具提示信息么?我在 2000 年 9 月和 2001 年 6 月的专栏中使用的是 CPopupText 类。CPopupText 非常简单,甚至一个知道如何敲分号的 VB 专家都能够实现它。 你只需要实例化一个 CPopupText 对象,调用 Create 和 SetWindowText,然后 CPopupText::ShowDelayed 就会在指定的时间里显示提示信息了。CPopupText::Cancel 负责删除提示信息。唯一的难点是使 CPopupText 看起来和标准的工具提示信息一样。为了实现这一目的,CPopupText 使用了菜单字体并且调用 GetSystemColor(COLOR_INFOBK) 得到包含工具提示颜色的系统颜色。 具体细节请参考本文附带的源代码。
对于 CMenuTipManager 而言,最复杂的部分是如何放置提示信息,以便恰好与高亮菜单项的右面对齐。这个问题基本思路是先得到菜单的位置,然后进行一系列的算术运算将所有的菜单项高度加起来,直到达到了被选中的菜单项。但是怎样才能得到菜单的位置呢?这可不是一个简单的问题。你也许猜到了,菜单本身也是一个窗口,但是没有 API 可以用来得到它的句柄,那怎么办呢?我曾经多次提到,在 Windows 中总会有解决办法,你决不会被困住的。
更多精彩
赞助商链接