MFC 中 Tooltip 实现的几种方式
方法一:
利用CWnd本身自身支持的tooptip来实现,这种方法适用给控件增加tooltip,非常方便和简单方法如下:
1、在窗口中增加消息映射ON_NOTIFY_EX(TTN_NEEDTEXT, 0, SetTipText)
SetTipText是个回调函数,名字叫什么无所谓,符合原型就行了,原型下面会说。
2、EnableToolTips(TRUE),使用这个方法调用这个函数是必不可少的.建议在CDialog::OnInitDialog调用。
3、在窗口中增加一个函数用于动态提供显示内容,其原型为 BOOL SetTipText(UINT id, NMHDR *pTTTStruct, LRESULT *pResult),下面的代码可以根据传入的参数判定应该显示的内容。
BOOL CWndYour::SetTipText(UINT id, NMHDR *pTTTStruct, LRESULT *pResult)
{
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;
UINT nID = pTTTStruct->idFrom; //得到相应窗口ID,有可能是HWND
//表明nID是否为HWND
if (pTTT->uFlags & TTF_IDISHWND)
{
//从HWND得到ID值,当然你也可以通过HWND值来判断
nID = ::GetDlgCtrlID((HWND)nID);
if (NULL == nID)
return FALSE;
switch(nID)
{
case(IDC_YOUR_CONTROL1)
strcpy(pTTT->lpszText, your_string1);
break;
case(IDC_YOUR_CONTROL2)
//设置相应的显示字串
break;
default:
break;
}
return TRUE;
}
return FALSE;
}
4、很重要的一点,要显示的控件必须设置notify属性,否则收不到notify消息,自然也就显示不了tooltip。
方法二:
使用MFC中封装好的CToolTipCtrl类,步骤如下:
1、定义全局变量 CToolTipCtrl m_tooltip和CWnd* pwnd,pwnd用来指定要显示控件的指针
2、在窗体的OnInitDialog()中或OnShowWindow()中创建m_tooltip。
//创建m_tooltip
m_tooltip.Create(pwnd);
//将CToolTipCtrl与相应的控件对应起来
m_tooltip.AddTool(pwnd, TTS_ALWAYSTIP);
//设定文字的颜色
m_tooltipSetTipTextColor(RGB(0,0,255));
//设定提示文字在控件上停留的时间
m_tooltip.SetDelayTime(150);
3、重载PreTranslateMessage(MSG* pMsg)函数,增加如下代码:
if(m_tooltip.m_hWnd!=NULL)
m_tooltip.RelayEvent(pMsg);
4、捕获主窗口的WM_MOUSEMOVE消息,在OnMouseMove(UINT nFlags, CPoint point)函数中增加如下代码:
//鼠标在相应的控件上移动时显示提示文字
m_tooltip.UpdateTipText("怎么样",pwnd);
5、说明
其实上面的第四步可以不要,就是在AddTool时,就可以将它的第二个参数就设置为提示文字,至于风格可以在Create的时候设置。
方法三:
自己封装SDK中的这个控件,难度是大点,但是可控性和适用性都可以大大提高。
e.g.
// 常量定义
// tooltip
#define TTS_BALLOON 0x40
#define TTS_CLOSE 0x80
#define TTS_NOFADE 0x20
m_tooltip.Create(this, TTS_BALLOON | TTS_ALWAYSTIP | TTS_CLOSE | TTS_NOFADE);
m_tooltip.Activate(TRUE);
m_tooltip.AddTool(this, DEFINE_INFO_FLOATTIP);
m_tooltip.SetTipTextColor(RGB(0, 0, 255));
m_tooltip.SetTipBkColor(RGB(255,0,255));
m_tooltip.SetDelayTime(150);
http://blog.csdn.net/magictong/article/details/3539086
MFC 中 Tooltip 实现的几种方式的更多相关文章
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- JavaScript学习12 JS中定义对象的几种方式
JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...
- Shell脚本中执行mysql的几种方式(转)
Shell脚本中执行mysql的几种方式(转) 对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用 ...
- Java中HashMap遍历的两种方式
Java中HashMap遍历的两种方式 转]Java中HashMap遍历的两种方式原文地址: http://www.javaweb.cc/language/java/032291.shtml 第一种: ...
- JAVA中集合输出的四种方式
在JAVA中Collection输出有四种方式,分别如下: 一) Iterator输出. 该方式适用于Collection的所有子类. public class Hello { public stat ...
- android中解析文件的三种方式
android中解析文件的三种方式 好久没有动手写点东西了,最近在研究android的相关技术,现在就android中解析文件的三种方式做以下总结.其主要有:SAX(Simple API fo ...
- jQuery中开发插件的两种方式
jQuery中开发插件的两种方式(附Demo) 做web开发的基本上都会用到jQuery,jQuery插件开发两种方式:一种是类扩展的方式开发插件,jQuery添加新的全局函数(jQuery的全局函数 ...
- Struts中的数据处理的三种方式
Struts中的数据处理的三种方式: public class DataAction extends ActionSupport{ @Override public String execute() ...
- JavaScript学习12 JS中定义对象的几种方式【转】
avaScript学习12 JS中定义对象的几种方式 转自: http://www.cnblogs.com/mengdd/p/3697255.html JavaScript中没有类的概念,只有对象. ...
随机推荐
- Notepad++中删除连续的任意n行
使用Notepad++里的行标记功能,可以删除指定的任意n行. 案例1,删除sample2.dat里的第201行到第10000行.方法如下: (1) 用户NotePad++打开sample2.dat, ...
- 再议指针---------函数回调(qsort函数原理)
我们是否能写一个这种函数: 能够对不论什么类型数据排序 不论什么人在使用该函数不须要改动该函数代码(即:用户能够不必看到函数源 码,仅仅会调用即可) 思考: 用户须要排序的数据的类型千变万化,可能是i ...
- vue sourcemap详解
从webpack开始 直接进入正题.有人觉得vue项目难调试,是因为用了webpack.所有代码揉在了一起,还加了很多框架代码,根本不知道怎么下手.所以vue+webpack调试要从webpack入手 ...
- PAT 1001-1010 题解
早期部分代码用 Java 实现.由于 PAT 虽然支持各种语言,但只有 C/C++标程来限定时间,许多题目用 Java 读入数据就已经超时,后来转投 C/C++.浏览全部代码:请戳 本文谨代表个人思路 ...
- 【cocos2dx 加载资源目录】
从互联网下载vsproject代码.编译一切都还好吗,当发现向导的最后一个执行create没有找到图片功能异常.看图片Resource的内容下表,他没有排除的图像的可能性. 那么之后呢?!仅仅能是pr ...
- 机器学习: t-Stochastic Neighbor Embedding 降维算法 (一)
Introduction 在计算机视觉及机器学习领域,数据的可视化是非常重要的一个应用,一般我们处理的数据都是成百上千维的,但是我们知道,目前我们可以感知的数据维度最多只有三维,超出三维的数据是没有办 ...
- android延时处理任务范例
今天要做一个任务,要求图片做button开关,点击出发对应事件.点击打开,图片左边显示几行字体,这几行字体是延时显示的.以下将主要代码附上.以下是main.xml <?xml version=& ...
- 从 RNN 到 LSTM (Short-Term Memory)
理论上循环神经网络可以支持任意长度的序列,然而在实际中,如果序列过长会导致优化时出现梯度消散(the vanishing gradient problem)的问题,在实际中一把会规定一个最大长度,当序 ...
- POJ1185:火炮(减少国家)
Description 命令将军打算N*M该网络格他们的炮兵部队部署在地图上.一个N*M该地图由N行M列,每个地图格它可以是山(使用"H" 表示),也可能是平原(用"P& ...
- WPF学习目录
基本概念 数据源Source-目标Target WPF生命周期 App.xaml 依赖属性 WPF路由 线程操纵UI问题 利用属性中设置.查看DataContext/Command等 分析布局 写数据 ...