记得以前写对话框时,按钮直接有一个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,才会调用翻译和分发消息函数。

注:

  1. 是否调用TranslateMessage()和DispatchMessage()是由一个名称为PreTranslateMessage()函数的返回值决定的,如果该函数返回TRUE,则不会把该消息分发给窗口函数处理。
  2. 传给PreTranslateMessage()的消息是未经翻译过的消息,它没有经过TranslateMessage()处理。例如可以在该函数中使用(pMsg->wParam == VK_RETURN)来拦截回车键。
  3. 在WindowProc里不能处理WM_CHAR消息。
  4. SetWindowText会发送WM_CHAR给窗口。
  5. 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按钮提示(消息捕获和消息传递)的更多相关文章

  1. MFC中添加ToolTip提示框

    PART 1 MFC 对话框中的 Buttton添加提示 例如我们想在一个对话框中的一个button控件添加tooltip,实现的方法如下: 1. 在该对话框的类中添加一个CToolTipCtrl类型 ...

  2. 一款基于jquery超炫的弹出层提示消息

    今天给大家带来一款基于jquery超炫的弹出层提示消息.这款实例页面初始时,一个go按钮.当单击go按钮时,提示强出层以动画形式出现.效果图如下: 在线预览   源码下载 实现的代码. html代码: ...

  3. 图解MFC基本框架(深入消息映射机制)

    首先,先看整体的消息流向图: 上图解释: 起点是消息循环,在winmain函数中(mfc中winmain函数是隐含的调用的,在app全局对象构造完后紧接着调用winmain函数),while循环中不断 ...

  4. MFC中对话框的各种消息触发时间

    小结:WM_CREATE是所有窗口都能响应的消息,表明本窗口已经创建完毕.可以安全的使用这个窗口了,例如在它上面画控件等等.这个状态肯定是在调用ShowWindows()显示窗口之前.WM_WM_IN ...

  5. jQuery动态提示消息框效果

    效果预览:http://keleyi.com/keleyi/phtml/jqtexiao/2.htm 原文:http://keleyi.com/a/bjac/hxv86dyi.htm <!DOC ...

  6. jQuery实现鼠标移到元素上动态提示消息框效果

    当光标移动到某些元素上时,会弹出像tips的提示框,这种效果想必大家都有见到过吧,下面有个不错的示例,大家可以感受下 当光标移动到某些元素上时,会弹出像tips的提示框. 复制代码代码如下: < ...

  7. Yii自定义错误提示消息

    英文原文: http://www.yiiframework.com/wiki/1/how-to-customize-the-error-message-of-a-validation-rule/ Va ...

  8. Jquery 网站保存信息提示消息实现,提示后自动消失

    现在的大多数网站都有校验,以及信息提示:为了给用户更好的体验可以不用alert提示消息,采用jQuery提示完消息,自动消失 css <style> #tip_message { z-in ...

  9. MFC技术内幕系列之(四)---MFC消息映射与消息传递内幕

    ////////////////////////////////////////////////////////////////////////////////////                 ...

随机推荐

  1. HDU3631:Shortest Path(Floyd)

    Problem Description When YY was a boy and LMY was a girl, they trained for NOI (National Olympiad in ...

  2. 使用CCUserDefault 推断用户是否是第一次登陆系统及UserDefault全路径的获取

    bool bfirst =CCUserDefault::sharedUserDefault()->getBoolForKey("first"); //假设不能获取该键值,创建 ...

  3. HttpWebRequest get/post方法实现

    get请求url #region GetHttp请求 /// <summary> /// GetHttp请求 /// </summary> /// <param name ...

  4. Array.asList:数组转list时你一定要知道的“陷阱”!

    最近开发中,业务上处理,经常用到asList方法,这让我不经想起了它的很多容易让人犯错的地方或者误解的地方,所以就想抽出时间来,整理一下,和大家分享出来,深夜了,话不多说,主要以代码为主,简易的代码, ...

  5. 比较好的总结runtime

    http://www.cocoachina.com/ios/20160128/15154.html

  6. 连接、关联、JOIN、APPLY(SQL Server)

    连接方式 连接类型 个人总结 阐述(生成两个集合的约束笛卡儿积) INNER    JOIN 内连接 关联相同的(用于查找关联的信息) FROM C AS c INNER JOIN D AS d ON ...

  7. clang: error: unable to execute command: Segmentation fault: 11

    我在Archive的时候出现了上面这个错误, 解决方法很简单: After huge trying I have disabled the Bitcode in Project's Target-&g ...

  8. Swift - 41 - swift1.2新特性(1)

    更简洁的if-let import UIKit func attack(name: String, enemyName: String, weapon: String) { print("\ ...

  9. 思科27亿美元收购网络安全公司Sourcefire

    据国外媒体报道,思科于今日宣布将以27亿美元的总价收购网络安全公司Sourcefire,以加强自身在网络安全业务领域的优势,该交易将于今年下半年完成. [IT商业新闻网讯](记者 张良)7月23日消息 ...

  10. iOS开源 框架

    UI界面类项目: Panoramagl ——720全景展示 Panorama viewer library foriPhone, iPad and iPod touch MBProgressHUD — ...