有Toolbar功能的可重用类 CPopupText
2006-07-19 11:26:07 来源:WEB开发网OK,前面讲了关于CPopupText类的创建以及使用方法。下面要讲一下对列表框所要做的事情。它是用CListBoxTipHandler类来实现的。这个类的功能是当列表框项目文本宽度超过列表框本身的宽度时,在一个提示窗口中显示鼠标指针所指的列表框项目的完整文本内容。图一是本文的例子程序,LCTest。它是一个对话框的例子。
图一
CListBoxTipHandler类很容易使用,你只要实例化并用Init函数初始化实例就可以了。
class CMyDialog {
CListBox m_wnd_List; // 普通的 listbox
CListBoxTipHandler
m_tipHandler; // CListBoxTipHandler类实例
......
};
BOOL CMyDialog::OnInitDialog(){
......
m_tipHandler.Init(&m_wndList);
......
}
就这样,你的listbox魔法般地获得了提示特性(图一)。
CListBoxTipHandler类的设计原则是使它尽量易于使用,它的工作原理又是怎样的呢?如果你仔细研究一下它的代码就会明白。CListBoxTipHandler类的基类是CSubclassWnd,这个类在以前的VCKBASE文章中出现过很多次,CSubclassWnd类的作用是不用派生新类便能在MFC中子类化窗口。这一点很重要,如果你从CListBox派生一个新类,假如说是:CListBoxWithTips,那你就不能在自己已经派生的列表框类(如:CMyListBox)中直接使用它。而要作很多修改。这是不可取的。CSubclassWnd完全可以让CListBoxTipHandler通过实例化来子类你的列表框,而不是通过派生。
当你调用Init函数时,CListBoxTipHandler子类化列表框,然后,截获发送到列表框的所有消息。而只有一个消息是我们感兴趣的,那就是 WM_MOUSEMOVE。
当用户移动鼠标到列表框时,CListBoxTipHandler实例(提示处理器)便检查鼠标所指的列表框项目的文字是否比列表框本身的宽度要宽,从而决定是否启动CPopupText显示文本提示窗口。其中的处理有两个技巧。
第一个技巧:如果用户把鼠标从文本提示窗口上移走,CListBoxTipHandler会调用CPopupText::Cancel 隐藏提示窗。当用户的鼠标在列表框项目间移动时不会有什么问题,但如果将鼠标完全移到列表框之外会发生什么呢?显然,你无法知道哪一个是最后一个WM_MOUSEMOVE消息。为了避免这种情况,CListBoxTipHandler代表列表框来捕获鼠标,所以全部的鼠标消息都到了CListBoxTipHandler,当鼠标移到列表框之外的情况发生时,
CListBoxTipHandler释放鼠标。
第二个技巧:关于提示窗的激活与隐藏。为了正确定位提示窗口,CListBoxTipHandler要计算窗口矩形的大小,并调用SetWindowPos函数。这里使用 SWP_NOACTIVATE 很关键,否则提示窗口将是活动的,而且对话框不活动-对话框标题条变灰。在调用 CPopupText::ShowWindow 时之所以必须用SW_SHOWNA 也是一样的道理。
例子程序使用了一个最普通的列表框,但 CListBoxTipHandler 应该处理宿主(owner-draw)列表框,另外还要让 CListBoxTipHandler 获得列表框项目文本并决定文本宽度。CListBoxTipHandler::OnGetItemInfo 和 CListBoxTipHandler::IsRectCompletelyVisible 是两个重载的虚函数,如果你想让 CListBoxTipHandler 类也适用于其它类似列表框一样的控件(如组合框、列表视图等),这两个函数是你必须修改的。不要将CListBoxTipHandler 用于树型控件,因为树型控件本身就内建有toolbar功能。
- ››功能强更实用 Win7库变为“计算机”
- ››功能最全!网管必备子网划分计算工具!
- ››功能完整的 Google Reader 离线浏览器 Byline 介绍...
- ››功能才是硬道理 色彩风暴图片处理
- ››功能完备 Google Talk新版试用体验
- ››功能区工具栏基本操作——PowerPoint 2007多媒体课...
- ››功能强大桌面便签YNotes新版发布
- ››功能再改进!Foxmail 6.5Beta2发布
- ››重用java.util.Observable类
- ››功能完善的Java连接池调用实例
- ››功能强大的全新 T-SQL 语法极大地提升了 SQL Serv...
- ››功能丰富的图片浏览软件新宠儿XnView
更多精彩
赞助商链接