完善CPopupText类

“介绍一个有Toolbar功能的可重用类 CPopupText”。这篇文章的内容是关于在一个列表框中,如果列表框中数据项的文字长度超过了列表框本身的宽度,则会显示一个类似ToolTips的弹出提示,将超长的列表框数据项完整地显示出来(如图一)。文中给出的 CPopupText 类非常好用,但是该文章提供的例子代码——ListCtrl运行起来似乎有点问题,就是在单击提示条下面的列表框数据项时,无法选中这个项目。如果能完善一下就好了......

图一 显示弹出式提示

解答:

提出这个问题的朋友很细心。确实不错,稍微认真一点的人都不难发现这个例子中存在着上面所说的bug。本文将针对这个问题对程序进行修改和完善。

这个例子程序使用了一个特别的类——CListBoxTipHandler,它的作用是截获发送到列表框的消息。这个类派生于CSubclassWnd,请读者们注意,CSubclassWnd是个非常有用的类,它易于使用,可重用性极强。在VC知识库的很多文章和例子代码中都使用到了这个类(在其它的商业开发中当然也可以利用这个类)。这个类的作用是将截获的 Windows 消息发送到另外一个窗口。CListBoxTipHandler类还用到了另一个类——CPopupText,这个类的作用是显示超长的列表框项目文本。下面我们就来分析一下要实现的目标。

当用户点击弹出的提示条文本时(如图一),要想让 Windows 忽略提示文本的存在,让鼠标单击事件穿透文本直接传到下面的列表框是行不通的。那么如何让才能让鼠标单击事件传到列表框呢?Windows 自有其绝招。

当用户在屏幕的某个地方点击鼠标时,Windows 通过其内部机制来决定光标下面是什么东西,在发送WM_LBUTTONDOWN消息之前,Windows 首先要发送WM_NCHITTEST消息来查询光标处于哪个非客户区上方。如果光标在标题上方,则 Windows 返回HTCAPTION。如果光标处于菜单上方,则 Windows 返回HTMENU。如果光标落在客户区,则 Windows 返回HTCLIENT。大多数应用程序都不处理WM_NCHITTEST消息——一般这个消息都是由缺省的窗口过程(DefWindowProc)处理,所以可能有些人从来就没有听说过有这么一个Windows消息。DefWindowProc 进行所有相应的计算来确定像素是否落在标题,菜单,边界,大小调整客户区等区域,同时返回相应的HT码。在这些返回的HT码中有一个HTTRANSPARENT。这个返回码是我们分场感兴趣的东西。它告诉Windows,“我是透明的,不要把任何鼠标事件消息发给我,把它们发给下一个窗口吧。”这里所说的下一个窗口,指的是光标下面Z-坐标上的窗口线程。实际上这就是我们所需要的东西——对CPopupText类做如下修改:

UINT CPopupText::OnNcHitTest(CPoint pt)
{
 return HTTRANSPARENT;
}

哈哈,就这么简单,bug排除了!现在当用户单击如图一中的提示文本时,它下面的列表框被选中。真神!我喜欢这样用只有一行代码的函数就能搞掂的bug。它证明了最初的设计并不令人失望,尽管它不是那么完美。

时间: 2024-11-10 00:21:43

完善CPopupText类的相关文章

有Toolbar功能的可重用类CPopupText

背景:我用一个CListBox派生类实现宿主(owner-draw)列表框,这个列表框的项目宽度超过了列表框本身的宽度,因此当鼠标指针指向大宽度的列表框项时,我想显示一个类似Toolbar的提示窗口,在窗口中显示完整的列表框项目文本. 起初我想使用CToolTipCtrl::AddTool的第三个参数lpRectTool来实现这个功能,但没有成功.后来,我采用了自立更生的解决方案,创建了一个可重用窗口类,CPopupText-基类是CWnd.用这个派生类不仅可以在列表框中实现类似Toolbar的

今天发现易宝(yeepay)充值卡类支付方式可能存在的安全漏洞!

这二天应朋友之托,要为他的游戏增加一个在线充值功能,因为支付宝/快钱等比较大牌的公司申请商户都要营业执照或付费,于是他选择了易宝支付(www.yeepay.com),下载了SDk开发文档看了下,功能还蛮全的,而且比较贴心的是易宝提供了二种模式:测试模式和生产模式,测试模式下不必真实付费,就能得到跟真实生产模式一样的返回值,极大的方便了开发调试. 易宝的充值大概分为二类,一类是银行卡类的网银在线支付,另一类是非银行卡类的充值卡支付(比如神州行,Q币充值卡等) 接入过程中,发现一个明显的安全问题,充

社区研究之敏思博客的独到之处

博客|社区 先扯上几句.我的社区研究系列说穿了只关注两个点:其一,社区的黏度,因为我认为必须对用户产生黏度才能叫做社区:其二,高黏度社区的技术特征和管理规则,因为我认为社区主要的技术应用之间特征的不同会导致社区产品天生的黏度差异,同时不同的社区管理规则也会对这种黏度差异产生非常大的影响,一个是先天的一个是后天的.     比如说,我之前一直认为目前Blog的技术特征Trackback.RSS.Tag造成站外聚合和交互的巨大便捷性,从而使Blog搬迁的成本过低,低到BSP对Blog个体丧失了社区应

获得Win32窗口句柄的更好的方法

"VC6中使用CHtmlView在对话框控制中显示HTML文件" "如何禁用HTML页面的上下文菜单" "Convert CHtmlView to CHtmlCtrl..." 这三篇文章的原文实际上都出自 MSDN Magazine 及其前身 MSJ 的"C++ Q&A"专栏作家 Paul DiLascia 之手.此君从1995年开始就成为 MS 在 C++/MFC 方面的高级写手,Paul 在 Windows 应用开

没有Rails,Java程序员如何使用Ruby

一.引言 Ruby on Rails仅是使Ruby成为伟大的一个因素,这就象EJB仅是Java企业平台的一个组成部分一样.本文将带你一同讨论,作为一名Java开发者,仅利用Ruby自身所能够实现的功能. 首先让我先澄清一些问题.第一,这不是一篇关于Ruby on Rails的文章.如果你想了解Rails,那么每周都出版新的文章和博客来颂扬这种令人激动的框架及其各种特征.第二,本文并非在预告,在目前出现一些更好的语言.工具和框架(如Ruby on Rails)时,Java平台即将崩溃.因此,本文与

TDD的iOS开发初步以及Kiwi使用入门

测试驱动开发(Test Driven Development,以下简称TDD)是保证代码质量的不二法则,也是先进程序开发的共识.Apple一直致力于在iOS开发中集成更加方便和可用的测试,在Xcode 5中,新的IDE和SDK引入了XCTest来替代原来的SenTestingKit,并且取消了新建工程时的"包括单元测试"的可选项(同样待遇的还有使用ARC的可选项).新工程将自动包含测试的target,并且相关框架也搭建完毕,可以说测试终于摆脱了iOS开发中"二等公民"

【斗医】【4】Web应用开发20天

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://qingkechina.blog.51cto.com/5552198/1315778 在上面把日志文件打印到了D:\log下,考虑到Liunx服务器环境下,让最终用户修改可能不可接受,接下来完成三件事情:(1)应用程序指定输出路径(2)完善异常类的处理(3)完成页面跳转的封装处理 一.指定输出路径 由于Logback的<FILE>指定相对路径与Log4J存在差异,所以在修改日志

使用生成器展平异步回调结构,JS篇

1. 前言 2012 年的时候,我去详细了解过 Python 的 Tornado 框架中的 gen.py 这套工具,http://www.zouyesheng.com/generator-for-async.html ,因为觉得它用于异步环境的编程中实在太方便了,而且,适用性上几乎没有成本,你的定义部分代码完全不需要因为这套工具而作任何改动,这套工具完全是"使用时"的一种可选形式. 那时我想的就是,如果在遍地是 callback 的 Javascript 中也有这样的东西可用就好了.后

Redux教程3:添加倒计时

前面的教程里面,我们搭建了一个简单红绿灯示例,通过在console输出当面的倒计时时间:由于界面上不能显示倒计时,用户体验并不良好,本节我们就添加一个简单的倒计时改善一下. 作为本系列的最后一篇文章,将示例如何处理多个Redux.React的情形: 1.创建Counter类 我们定义倒计时的类名为 Counter ,创建所需要的文件(夹): mkdir actions/counter reducers/counter stores/counter components/counter views