MFC之CToolTipCtrl按钮提示(消息捕获和消息传递)
记得以前写对话框时,按钮直接有一个tips属性,可以添加默认值,不记得是C#还是啥了,今天忽然想给几个按钮添加提示信息,就捣鼓了一下。
头文件中创建CToolTipCtrl变量,然后在初始化时激活使用:
CToolTipCtrl m_iToolTips;
BOOL CTestDXFDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码
EnableToolTips(TRUE);
m_iToolTips.Create(this);
m_iToolTips.Activate(TRUE);
m_iToolTips.SetTipTextColor(RGB(,,));
m_iToolTips.SetTipBkColor(RGB(,,));
m_iToolTips.SetDelayTime();
m_iToolTips.AddTool(GetDlgItem(IDC_BTN_ZOOM_IN), "放大");
m_iToolTips.AddTool(GetDlgItem(IDC_BTN_ZOOM_OUT), "缩小");
m_iToolTips.AddTool(GetDlgItem(IDC_BTN_ZOOM_EXTENT), "适应"); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
重载PreTranslateMessage系统消息函数
BOOL CTestDXFDlg::PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message)
{
case WM_MOUSEMOVE:
m_iToolTips.RelayEvent(pMsg);
break;
default:
break;
}
return CDialog::PreTranslateMessage(pMsg);
}
手动和自动添加该函数均可(vs2008自动添加PreTranslateMessage函数)
然后遇到问题:不能设置tip的背景颜色和字体颜色,查询后发现,在xp系统下是正常的,在xp之后的系统均出现这个问题,注释掉stdafx.h中相关代码又出现界面其他显示问题。(注释代码详情)
WIN32消息传递方式
- MFC消息,MFC会把所有的消息一条条放到一个AFX_MSG_MAP_ENTRY结构中,形成一个数组,该数组存放了所有的消息和与它们相关的参数。也可以说是放到消息队列里去,受PreTranslateMessage()影响。
- 采用SendMessage()或其他类似的方式向窗口直接发送的而不经过消息队列的消息。
消息处理函数
- MFC中,PreTranslateMessage()是虚函数,可以重载它来处理键盘和鼠标消息。
- SDK中,调用回调函数 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)处理消息,它和PreTranslateMessage起的作用是类似的。
PreTranslateMessage函数表示在消息处理(TranslateMessage()和DispatchMessage()等)前所作的操作,如果函数返回值为TRUE,那么消息处理即终止,不会调用TranslateMessage()和DispatchMessage()来翻译和分发消息给相应的窗口;若返回值为FALSE,才会调用翻译和分发消息函数。
注:
- 是否调用TranslateMessage()和DispatchMessage()是由一个名称为PreTranslateMessage()函数的返回值决定的,如果该函数返回TRUE,则不会把该消息分发给窗口函数处理。
- 传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。例如可以在该函数中使用(pMsg->wParam == VK_RETURN)来拦截回车键。
- 在WindowProc里不能处理WM_CHAR消息。
- SetWindowText会发送WM_CHAR给窗口。
- PeekMessage和GetMessage的区别:GetMessage在没有消息的时候等待消息,效率低。PeekMessage没有消息的时候立刻返回,所以CPU使用率高。因为游戏不能靠Windows消息驱动,所以要用PeekMessage()。
屏蔽消息
直接在函数中屏蔽回车和ESC的消息
BOOL CDemoDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_ESCAPE)
return TRUE;
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)
return TRUE;
else
return CDialog::PreTranslateMessage(pMsg);
}
屏蔽并继续传递消息
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) //如果消息类型为WM_KEYDOWN并且用户按下的是回车
return FALSE;
//不翻译消息,直接将消息传递下去。具体可查MSDN。注意,这里返回值不能为TRUE,TRUE的意思是翻译消息后退出消息传递,如此一来虽然也能避开对话框默认处理,但是会退出消息传递,这样EDIT控件照样得不到消息。
MFC之CToolTipCtrl按钮提示(消息捕获和消息传递)的更多相关文章
- MFC中添加ToolTip提示框
PART 1 MFC 对话框中的 Buttton添加提示 例如我们想在一个对话框中的一个button控件添加tooltip,实现的方法如下: 1. 在该对话框的类中添加一个CToolTipCtrl类型 ...
- 一款基于jquery超炫的弹出层提示消息
今天给大家带来一款基于jquery超炫的弹出层提示消息.这款实例页面初始时,一个go按钮.当单击go按钮时,提示强出层以动画形式出现.效果图如下: 在线预览 源码下载 实现的代码. html代码: ...
- 图解MFC基本框架(深入消息映射机制)
首先,先看整体的消息流向图: 上图解释: 起点是消息循环,在winmain函数中(mfc中winmain函数是隐含的调用的,在app全局对象构造完后紧接着调用winmain函数),while循环中不断 ...
- MFC中对话框的各种消息触发时间
小结:WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕.可以安全的使用这个窗口了,例如在它上面画控件等等.这个状态肯定是在调用ShowWindows()显示窗口之前.WM_WM_IN ...
- jQuery动态提示消息框效果
效果预览:http://keleyi.com/keleyi/phtml/jqtexiao/2.htm 原文:http://keleyi.com/a/bjac/hxv86dyi.htm <!DOC ...
- jQuery实现鼠标移到元素上动态提示消息框效果
当光标移动到某些元素上时,会弹出像tips的提示框,这种效果想必大家都有见到过吧,下面有个不错的示例,大家可以感受下 当光标移动到某些元素上时,会弹出像tips的提示框. 复制代码代码如下: < ...
- Yii自定义错误提示消息
英文原文: http://www.yiiframework.com/wiki/1/how-to-customize-the-error-message-of-a-validation-rule/ Va ...
- Jquery 网站保存信息提示消息实现,提示后自动消失
现在的大多数网站都有校验,以及信息提示:为了给用户更好的体验可以不用alert提示消息,采用jQuery提示完消息,自动消失 css <style> #tip_message { z-in ...
- MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕
//////////////////////////////////////////////////////////////////////////////////// ...
随机推荐
- Oralce新建数据库、新建远程登录用户全过程
Oracle安装完后,其中有一个缺省的数据库,除了这个缺省的数据库外,我们还可以创建自己的数据库. 对于初学者来说,为了避免麻烦,可以用'Database Configuration Assi ...
- android动画效果编程基础--Android Animation
动画效果编程基础--Android Animation 动画类型 Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 tran ...
- 混血儿爹妈要混的远,数据库与WEB分离,得混的近
最近搞了个漫画网站,放在香港VPS,由于内存不够,把数据库移到了阿里云,混的远了点,没缓存的时候网站打开速度慢了1秒左右.笨狗漫画:http://www.bengou8.com 底部有sql时间cop ...
- git clone之后自动checkout文件处理
这个问题发生是因为不同操作系统的行结束符不一致导致的,可在clone之后在仓库根目录修改.gitattributes文件 简单处理的话,注释* text=auto这行即可.也可根据不同系统,做相应设定 ...
- C#截图操作方法大全
using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApplication1 { class ScreenC ...
- VNC 黑屏
参考资料: http://blog.sina.com.cn/s/blog_57edaf600100serf.html http://www.programgo.com/article/43581885 ...
- Universal-Image-Loader 基本使用
简介 https://github.com/nostra13/Android-Universal-Image-Loader 项目的结构:每一个图片的加载和显示任务都运行在独立的线程中,除非这个图片缓存 ...
- SpringMVC06以对象的方式获取前台的数据
========创建需要的两个实体类================ public class School { private String sName; private String addres ...
- [JavaScript]plupload多图片上传图片
var uploader = new plupload.Uploader({ //创建实例的构造方法 runtimes: 'html5,flash,silverlight,html4', ...
- DIV布局之道一:DIV块的水平并排、垂直并排
DIV布局网页元素的方式主要有三种:平铺(并排).嵌套.覆盖(遮挡).本文先讲解平铺(并排)方式. 1.垂直平铺(垂直排列) 请看如下代码 CSS部分: CSS Code复制内容到剪贴板 .lay1{ ...