最近用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. android工具类常用方法

    1.获取手机唯一识别号 添加AndroidManifest.xml权限 <uses-permission android:name="android.permission.READ_P ...

  2. find中的-print0和xargs中-0的区别

    默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('\n'), 因此我们看到的 find 的输出都是一行一行的: [bash-4.1.5] ; ls -l total 0 -r ...

  3. 7.MyBatis延时加载

    1.创建javaWeb项目MyBatis_Lazy并在WebRoot下的WEB-INF下的lib下添加如下jar文件 cglib-nodep-2.1_3.jar log4j-1.2.17.jar my ...

  4. Ubuntu 14.04 绑定固定 IP

    参考百度经验首先用root用户登录,然后输入你的root密码,如果不用root登录可以在命令之前添加sudo:然后编辑interfaces 文件,该文件位于/etc/network/下面, 执行如下命 ...

  5. Process Monitor V2.96 (系统监视工具) 汉化免费绿色版

    软件名称: Process Monitor V2.96 (系统监视工具) 汉化免费绿色版软件语言: 简体中文授权方式: 免费软件运行环境: Win7 / Vista / Win2003 / WinXP ...

  6. 灾情巡视C语言代码

    /*"水灾巡视问题"模拟退火算法.这是一个推销员问题,本题有53个点,所有可能性大约为exp(53),目前没有好方法求出精确解,既然求不出精确解,我们使用模拟退火法求出一个较优解, ...

  7. SVN打包方法

    当有一个版本稳定下来,或者是发布一个版本的时候,我们可以通过SVN打包来进行标记. 打包方法如下: 1.前提:保证本地的工程文件是没有冲突的,均提交到SVN服务器. 2.右键选择SVN中的分支/打包. ...

  8. oAuth 使得第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权

    OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可 ...

  9. NS_ASSUME_NONNULL_BEGIN 延伸

    NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END 在.h文件中,可以看到这两个宏,翻看定义,这两个宏的代码是 #define NS_ASSUME_NONNUL ...

  10. Webstrom 连接svn报错怎么解决

    Subversion: (Accessing URL:  https://192.168.1.249:8443/svn/H5/seif ) Received fatal alert: handshak ...