MFC中添加ToolTip没有响应

2024-01-18 23:18
文章标签 mfc tooltip 没有响应

本文主要是介绍MFC中添加ToolTip没有响应,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如果把控件放在Group里面,有时发现ToolTip没有显示,此时可能的原因是Tab排序问题,即Group的Tab排在Group里面的控件的前面;所以,只要Ctrl+D,点击各个控件,进行重新排序即可;这个是我在一篇文章上看到的,不记得出处;

添加ToolTip方法如下,来自百度文库:

ToolTip在VC中的使用

 

按照下面的步骤去做:

1、先为static设置一个ID,如ID_TIP;

2、在CDialogBar的头文件中的AFX_MSG内加入一行申明

afx_msg BOOL OnToolTip(UINT id,NMHDR *pNMHDR,LRESULT * pResult);

3、在CDialogBar的CPP文件中的AFX_MSG_MAP内加入一行

ON_NOTIFY_EX(TTN_NEEDTEXT,0,OnToolTip)

4、在CDialogBar的CPP文件中的OnInitDialog()函数内加入

EnableToolTips(TRUE);

5、在CDialogBar的CPP文件中添加OnToolTip函数

BOOL CDialogBar::OnToolTip(UINT id,NMHDR *pNMHDR,LRESULT * pResult)

{

TOOLTIPTEXT * pTTT=(TOOLTIPTEXT *)pNMHDR;

UINT uID = pNMHDR->idFrom;

if(pTTT->uFlags & TTF_IDISHWND)

uID = ::GetDlgCtrlID((HWND)uID);

if(uID == NULL) return FALSE;

switch(uID)

{

case IDC_TIP:

pTTT->lpszText="添加你的提示内容";

break;

}

return TRUE;

}

这样就可以了。

其实,上面的方法可以为任何控件添加tip提示。

 

用VC实现TOOL TIP.比较复杂,其实也简单,但MFC帮助一些窗口实现,而另一些窗口又不实现,倒搞得复杂了.最开始我用WM_MOUSEMOVE消息,然后用CToolTipCtrl::Pop,这个方法太笨.不建议用.除非需要自定义.

 

MFC对TOOL TIP的支持不错的.缺省情况CFrameWnd支持很好.然后是CWnd.主要体现在TTN_NEEDTEXT消息的支持和OnToolHitTest的支持.TTN_NEEDTEXT是在CFrameWnd中支持的.OnToolHitTest是在CWnd中支持的.有了这些支持,可以在框架窗口中很好实现ToolBar的TIP.和在一个对话框中很好实现一个控件的TOOL TIP.

 

举例.在对话框中实现TOOL TIP.

 

1.EnableToolTips( TRUE )是不可少的.建议在:CDialog::OnInitDialog 调用吧.

 

2.ON_NOTIFY_EX( TTN_NEEDTEXT, 0, OnNeedText).OnNeedText实现了TOOL TIP的文字.传入的参数idFrom是控件的ID,根据控件ID得到相应的TIP文字

 

就这么简单的两步,就实现了对话框中的TOOL TIP.其实不只对话框,任何窗口都可以用上面的方法实现自己的子窗口控件的TIP.但前提是必须是CWnd的派生类.

 

这就看出了MFC对TOOL TIP的支持很厉害

 

但这一切都是MFC实现的我们简单描述一下它的实现原理,这样看得更清楚

 

CWnd本身就带有一个CToolTipCtrl对象,是放在pThreadState中的这个不说了,知道CWnd有就行了

 

CWnd负责创建它,然后在PreTranslateMessage中调用了FilterToolTipMessage,这个函数的作用是处理WM_MOUSEMOVE,WM_NCMOUSEMOVE等消息,给CToolTipCtrl一个机会,判断鼠标是否在需要显示TIP的窗口上,如果是,就显示.FilterToolTipMessage先从CWnd::OnToolHitTest得到TOOLINFO:中的数据,比如哪个控件需要TIP等信息,然后利用ADDTOOL消息把这个需要TIP的控制加入到CToolTipCtrl的TOOL列表中,然后将鼠标移动的消息转给CToolTipCtrl处理.如果这个TIP的文字需要用回调函数来获得,就用WM_NOTIFY的TTN_NEEDTEXT从CToolTipCtrl的父窗口获取.这个过程就是CToolTipCtrl判断是否要显示TIP,到获得文字并显示TIP的全过程

 

这样一分析,就知道原来CWnd帮助实现了控件子窗口的TIP其实就是实现了OnToolHitTest这个函数,然后在PreTranslateMessage中转发消息,帮助CToolTipCtrl正确显示TIP.

 

而CFrameWnd是实现了TTN_NEEDTEXT的响应,帮助子窗口实现TIP.

 

其实我们也可以不要这些缺省实现,自己用CToolTipCtrl搞定,做法一样:

 

1.CToolTipCtrl::Create创建Tool Tip

 

2.AddTool增加一个TOOL,这里的TOOL就是需要显示TIP的一个区域或一个子窗口.如果对AddTool使用有不清楚的地方,建议查看源程序.可能会觉得直接使用TTM_ADDTOOL更方便.

 

3.在PreTranslateMessage中调用CToolTipCtrl::RelayMessage

 

4.如果在AddTool中,文字是用回调函数实现,那就要处理TTN_NEEDTEXT消息.

 

其实自己创建CToolTipCtrl和MFC做的一样.只是不需要在OnToolHitTest中给出需要显示TIP的窗口或者区域.

 

如果给子窗口用TIP.就用MFC最简单.如果给自己呢?

 

设置TOOLINFO中的uFlags = TTF_IDISHWND,然后设置uId为窗口句柄,hWnd为窗口句柄就可以了.

 

写了这么多,有不对的地方还请和我联系一下,帮助我改正错误.

 

只是有个问题还没搞明白.就是为什么MFC把CToolTipCtrl放在了pThreadState中.难道是为了用一个TOOL TIP为该线程的所有窗口服务吗?难道是一种节约资源的表现.这点还需要研究.如果哪位朋友知道答案,还希望能不吝赐教.谢谢

 

//头文件加入

CToolTipCtrl m_tooltip;

//主窗口初始化时加入

m_tooltip.Create(this);

m_tooltip.Activate(TRUE);

m_tooltip.AddTool(GetDlgItem(IDC_>name<),">text<");

//IDC_>name<为你控件的ID,>text<为显示的内容

 

利用ClassWizard建立PreTranslateMessage

BOOL CTest5Dlg::PreTranslateMessage(MSG*pMsg)

{

m_tooltip.RelayEvent(pMsg); //你加入的代码

return CDialog::PreTranslateMessage(pMsg);

}



这篇关于MFC中添加ToolTip没有响应的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/620576

相关文章

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

MFC中Spin Control控件使用,同时数据在Edit Control中显示

实现mfc spin control 上下滚动,只需捕捉spin control 的 UDN_DELTAPOD 消息,如下:  OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult) {  LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);  // TODO: 在此添加控件通知处理程序代码    if

控制台和MFC中内存泄露工具vld的使用

最近想检测下项目中内存泄露的情况,选中了vld这款。在查找使用方法的时候,大都是控制台下的示例,添加到main函数所在的源文件上。换成MFC就纠结了,不知道添加到哪里去。本文记录控制台和MFC中的使用vld过程。    vld资源:    1)、大家可以移步下边的网址下载:     http://vld.codeplex.com/releases/view/82311    2

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

PNG透明背景按钮的实现(MFC)

问题描述: 当前要在对话框上添加一个以两个PNG图片作为背景的按钮,PNG图的背景是透明的,按钮也要做出相同的透明效果。并且鼠标不在按钮上时,按钮显示"bg1.png";鼠标移动到按钮上时,按钮显示"bg2.png" 开发环境为VS2010。 解决办法: 使用GDI+库装载PNG图片,并使用MFC Button Control和CMFCButton类结合,调用CMFCButton

MFC 控件重绘(2) NM_CUSTOMDRAW, WM_DRAWITEM, 虚函数DrawItem

控件重绘有三种方法: 1 设定界面属性 2 利用Windows的消息机制,通过Windows消息映射(Message Mapping)和反映射(Message Reflecting),在合适的时机修改控件的状态和行为。此方式涉及NM_CUSTOMDRAW和WM_DRAWITEM 3 利用虚函数机制,重载虚函数。即DrawItem虚函数。 对于NM_CUSTOMDRAW,某些支持此消息的控件

git clone 仓库没有响应

解决方法:GitHub镜像域名法 将 github.com 替换为 github.com.cnpmjs.org。 如: git clone https://github.com/Abloume/ShowdownDemo.git 替换为: git clone https://github.com.cnpmjs.org/Abloume/ShowdownDemo.git

几种MFC对话框的隐藏方法

修改CXXAPP中的InitInstance函数,将原来的模态对话框改为非模态对话框,及修改 [cpp]  view plain copy INT_PTR nResponse = dlg.DoModal();     为 [cpp]  view plain copy dlg.Create(CModalHideDlg::IDD);

MFC首先要知道的--程序执行顺序

MFC的程序执行顺序 很多刚学MFC的人都会被MFC给弄的晕头转向。以前传统的C语言中的main()不见了,window sdk api 中的WinMain()函数也不见了,到底用MFC编写的程序是如何开始运行的呢?到底MFC有没有遵从最基本的C++的标准呢?到底MFC的代码运行的顺序又是怎么样的呢?那么多个文件,那么多函数,到底哪一个先运行,哪一个后运行,哪一个调用哪一个,哪一个又被哪一个调用

#error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version

昨天编译文件时出现了Building MFC application with /MD[d] (CRT dll version)requires MFC shared dll version~~~~的错误。   在网上很容易找到了解决的方案,公布如下:   对着你的项目点击右键,依次选择:属性、配置属性、常规,然后右边有个“项目默认值”,下面有个MFC的使用,选择“在共享 DLL 中使