WEB开发网
开发学院软件开发VC 一个有Toolbar功能的可重用类 CPopupText 阅读

一个有Toolbar功能的可重用类 CPopupText

 2006-07-23 11:19:06 来源:WEB开发网   
核心提示: OK,前面讲了关于CPopupText类的创建以及使用方法,一个有Toolbar功能的可重用类 CPopupText(2),下面要讲一下对列表框所要做的事情,它是用CListBoxTipHandler类来实现的,这两个函数是你必须修改的,不要将CListBoxTipHandler 用于树型

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功能。

上一页  1 2 

Tags:一个 Toolbar 功能

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接