最近用WTL重写CGdipButton。从ButtonST中将CtoolTipCtrl的相关代码转过来,发现一个问题:

ToolTip可以显示,鼠标移开后再移动到button上也可以再次显示,但是按下button或者等待tootip自动消失后,tooptip就不会再显示了。。。

郁闷了几天今天偶然看到MSDN论坛的一个答复,(http://social.msdn.microsoft.com/Forums/en-US/dfea9abc-8535-4a43-918a-a78f88b77c70/tooltip-does-not-appear-after-click?forum=winforms)我又喷血了,因为在之前的代码中加两句代码就解决了。。。。

贴下相关代码

// GdipButton.h

#pragma once

class CGdipButton : public CWindowImpl<CGdipButton, CButton> {
public:
CGdipButton();
virtual ~CGdipButton(); void SetTooltipText(LPCTSTR lpszText, BOOL bActivate = TRUE); protected:
BEGIN_MSG_MAP_EX(CGdipButton)
MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseMessage)
MSG_WM_MOUSEHOVER(OnMouseHover)
MSG_WM_MOUSELEAVE(OnMouseLeave)
END_MSG_MAP() LRESULT OnMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
void OnMouseHover(WPARAM wParam, CPoint point);
void OnMouseLeave(); private:
void InitToolTip();
BOOL m_bHovering;
CToolTipCtrl m_toolTip;
};
// GdipButton.cpp

#include "stdafx.h"
#include "GdipButton.h" CGdipButton::CGdipButton() {
m_bHovering = FALSE;
} CGdipButton::~CGdipButton() {
} LRESULT CGdipButton::OnMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
// track hover msg and leave msg
if(WM_MOUSEMOVE == uMsg) {
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_HOVER | TME_LEAVE;
tme.dwHoverTime = ;
tme.hwndTrack = m_hWnd;
_TrackMouseEvent(&tme);
} if(m_toolTip.IsWindow()) {
m_toolTip.RelayEvent((LPMSG)m_pCurrentMsg);
} bHandled = false;
return ;
} void CGdipButton::OnMouseHover(WPARAM wParam, CPoint point) {
if(!m_bHovering) {
m_bHovering = TRUE;
Invalidate();
}
} void CGdipButton::OnMouseLeave() {
  // 就是这两句
// 要先判断下是否存在m_toolTip窗口,否则未添加toolTip的button会出错。。。
if(m_toolTip.IsWindow()) {
m_toolTip.Activate(FALSE);
m_toolTip.Activate(TRUE);
} m_bHovering = FALSE;
Invalidate();
} void CGdipButton::SetTooltipText(LPCTSTR lpszText, BOOL bActivate) {
if(NULL == lpszText) {
return;
}
InitToolTip();
if (m_toolTip.GetToolCount() == ) {
CRect rectBtn;
GetClientRect(rectBtn);
m_toolTip.AddTool(*this, lpszText, rectBtn, );
}
m_toolTip.UpdateTipText(lpszText, *this, );
m_toolTip.Activate(bActivate);
} void CGdipButton::InitToolTip() {
if(NULL == m_toolTip.m_hWnd) {
m_toolTip.Create(*this);
m_toolTip.Activate(FALSE);
m_toolTip.SetMaxTipWidth();
}
}

VC 中使用 CToolTipCtrl 消失后不再出现的Bug。。。。的更多相关文章

  1. VC++中开发汇编语言(转)

    汇编程序结构 一个显示字符串的汇编程序 程序格式 一.模式定义 二.includelib语句 三.函数声明语句 四.数据和代码部分 Visual C/C++环境 建立工程 汇编程序的调试 一.设置断点 ...

  2. VC中不同类型DLL及区别

    1. DLL的概念可以向程序提供一些函数.变量或类. 静态链接库与动态链接库的区别:(1)静态链接库与动态链接库都是共享代码的方式.静态链接库把最后的指令都包含在最终生成的EXE文件中了:动态链接库不 ...

  3. VC中动态添加控件

    VC中动态添加控件 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个 ...

  4. VC中GetLastError()获取错误信息的使用,以及错误代码的含义

    转载:http://www.seacha.com/article.php/knowledge/windows/mfc/2011/0423/335.html VC中GetLastError()获取错误信 ...

  5. 深度解析VC中的消息(转发)

    http://blog.csdn.net/chenlycly/article/details/7586067 这篇转发的文章总结的比较好,但是没有告诉我为什么ON_MESSAGE的返回值必须是LRES ...

  6. VC中基于 Windows 的精确定时[转]

    在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位 机定时向下位机发送命令和传送数据等.特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要 ...

  7. VC中实现GCC的2个比较常用的位运算函数

    在GCC中内嵌了两个位运算的函数,但在VC中并没有这两个函数(有相似函数). //返回前导的0的个数. int __builtin_clz (unsigned int x) //返回后面的0个个数,和 ...

  8. VC中调用COM组件的方法(转载)

    原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449 总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程 ...

  9. 在VirtualBox中安装了Ubuntu后,Ubuntu的屏幕分辨率非常小,操作非常不便。通过安装VirtualBox提供的“增强功能组件”,-摘自网络

    在VirtualBox中安装了Ubuntu后,Ubuntu的屏幕分辨率非常小,操作非常不便.通过安装VirtualBox提供的“增强功能组件”,可以解决这一问题,并且使用非常方便. 一.环境 | En ...

随机推荐

  1. angular-ui-bootstrap插件API - Tabs

    Tabs 案例 <!DOCTYPE html> <html lang="en" ng-app="myApp"> <head> ...

  2. HTML5学习之Web存储

    在客户端存储数据 HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 之前, ...

  3. PHP学习资源

    PHPerNote PHPerNote 是一个php程序员的工作生活笔记,本站包含了php网络编程学习教程,数据库(主要是MySQL数据库)教程,javascript,jquery,div+css,h ...

  4. 1.webpack-----模块加载器兼打包工具

    一.webpack的优势 1. 能模块化 JS . 2. 开发便捷,能替代部分 grunt/gulp 的工作,比如打包.压缩混淆.图片转base64等. 3. 扩展性强,插件机制完善,特别是支持 Re ...

  5. CentOS 6.5的安装详解

    CentOS 6.5的安装详解 主流: 目前的Linux操作系统主要应用于生产环境, 主流企业级Linux系统仍旧是RedHat或者CentOS 免费: RedHat 和CentOS差别不大,Cent ...

  6. jvm-监控指令-jps

    解释:jps 列表展示java进程信息,以及java进程配置的jvm参数. 命令格式: jps [ options ] [ hostid ]  选项 -m 输出main method的参数 -l 输出 ...

  7. [SQL基础教程] 3-1 对表进行聚合查询

    [SQL基础教程] 3-1 对表进行聚合查询 聚合函数 用于合计的函数称为聚合函数或者集合函数 COUNT SUM AVG MAX MIN SELECT COUNT(*) FROM table; SE ...

  8. HUD 1171 Big Event in HDU(01背包)

    Big Event in HDU Problem Description Nowadays, we all know that Computer College is the biggest depa ...

  9. <hdu - 3999> The order of a Tree 水题 之 二叉搜索的数的先序输出

    这里是杭电hdu上的链接:http://acm.hdu.edu.cn/showproblem.php?pid=3999  Problem Description: As we know,the sha ...

  10. 输入身份证号码自动读取生日与性别(delphi)

    一.格式介绍: [15位号码格式] 1.第l一6位数为行政区划代码; 2.第7-12位数为出生日期代码; 3.第13---15位数为分配顺序代码; (1).行政区划代码,是指公民第一次申领居民身份证时 ...