有Toolbar功能的可重用类 CPopupText

2016-02-19 15:02 15 1 收藏

今天图老师小编给大家展示的是有Toolbar功能的可重用类 CPopupText,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

【 tulaoshi.com - 编程语言 】

  背景:我用一个CListBox派生类实现宿主(owner-draw)列表框,这个列表框的项目宽度超过了列表框本身的宽度,因此当鼠标指针指向大宽度的列表框项时,我想显示一个类似Toolbar的提示窗口,在窗口中显示完整的列表框项目文本。

  起初我想使用CToolTipCtrl::AddTool的第三个参数lpRectTool来实现这个功能,但没有成功。后来,我采用了自立更生的解决方案,创建了一个可重用窗口类,CPopupText-基类是CWnd。用这个派生类不仅可以在列表框中实现类似Toolbar的提示窗口,还可以在其它的通用控件(如组合框、列表视图等)中实现类似Toolbar的提示窗口。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  CPopupText实现了一个类似Toolbar的弹出式窗口-浅黄色的背景,黑色的文本。

  CPopupText的使用方法是:实例化对象并创建窗口。

  

CPopupText wndText;wndText.Create(...);

  Create 函数的参数为:父窗口,风格,ID以及位置信息CPoint,通常你要创建不可见窗口(即关闭WS_VISIBLE),然后,当你想显示提示时,先调用 SetWindowText 函数

  设置提示文本,接着调用 ShowWindow 函数显示提示文本。

  

wndText.SetWindowText("hello, world");wndText.ShowWindow(SW_SHOWNA);

  CPopupText类会根据提示文本的长度自己决定弹出窗口的大小。它的字体默认值与状态行显示字体相同(由SystemParametersInfo(SPI_GETNONCLIENTMETRICS)返回的 NONCLIENTMETRICS 结构成员 lfStatusFont 定义),设置 SW_SHOWNA是很重要的,因为你不想使提示窗口为活动窗口,而只是显示它。另外,CPopupText还提供一个专门的函数CPopupText::ShowDelayed,它的功能是在显示提示窗口之前设置一个毫秒级延时,如果延时为零,则立刻显示提示窗口,你可以使用这个特点来替代对ShowWindow的调用。如果要隐藏提示窗口或取消ShowDelayed,调用CPopupText::Cancel。

  OK,前面讲了关于CPopupText类的创建以及使用方法。下面要讲一下对列表框所要做的事情。它是用CListBoxTipHandler类来实现的。这个类的功能是当列表框项目文本宽度超过列表框本身的宽度时,在一个提示窗口中显示鼠标指针所指的列表框项目的完整文本内容。图一是本文的例子程序,LCTest。它是一个对话框的例子。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  图一

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

本文示例代码或素材下载

来源:http://www.tulaoshi.com/n/20160219/1608687.html

延伸阅读
C-Visual Toolbar 1.0 作者:李晓飞 下载源代码 关键字 Delphi / Visual C++ / Visual Toolbar 1.5 / SeSkin / 位图 功能简介 C-Visual Toolbar 1.0 的功能可以用 Visual Toolbar 1.5 的功能来描述,以下是引用Visual Toolbar 1.5的功能来介绍 C-Visual Toolbar 1.0 的功能。“对 Visua...
整个蘑菇家族都具有抗癌能力。蘑菇中含有的多糖体是抗癌活性物质,能促进抗体形成,使机体对肿瘤产生免疫力,抑制肿瘤细胞生长。菌类蔬菜不主张生吃,建议至少要过水焯一下。干菌类可选择炖煮,以便让有益成分进入汤中。 萝卜属类蔬菜可抗癌-抗癌蔬菜有哪些? 抗癌蔬菜有哪些? 以下四类蔬菜是餐桌上的抗癌明星,大家应该...
标签: PHP
读者要求:了解PHP4 的模板概念 使用PHP 模板类进行编程很有好处,但是有时也会碰到一个问题,比如说输出一个表格,但是表格行数要到运行的时候才知道,如留言板、BBS、购物网站之类,经常会碰到这个问题。这时做美工的人无法决定在HTML文件中用几行表格,如果在PHP代码文件中写循环输出,又会让美工、PHP程序员看代码都不方便...
标签: 孕前
男人育前必须要治疗的几种病 精子质量异常 正常男性每次射精量为2~6毫升,小于1毫升或大于6毫升,对生育能力均有一定影响。正常情况下,精子数量应为(50~100)×106个/毫升,如果每毫升精液中的精子数量少于20×106个/毫升,可造成男性不育。如果小头、双头、双尾、胞浆不脱落等异常精子超过20%...
标签: 电脑入门
在我们用PowerPoint2007制作幻灯片的过程中,会碰到一些情况:比如我们要制作一批幻灯片,这些幻灯片中有一部分内容是大致相同的,例如各种 图表、报告、数据等,这个时候如果我们还一个一个的来制作幻灯片,效率低不说,还相当容易出错。其实,我们完全可以通过使用PowerPoint2007 的重用幻灯片功能来减少重复工作。 我们可以先将所有的PPT...

经验教程

204

收藏

44
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部