【关注】MFC对话框内置的ToolTip机制失效的有关问题解决

【关注】MFC对话框内置的ToolTip机制失效的问题解决!
原帖:http://topic.csdn.net/u/20100602/10/680bb5c8-bd4c-4d26-a5dc-13f346b50d31.html
也看到过一些询问类似问题的帖子,看来应该不只我一个人遇到这个问题:)

问题描述:使用EnableToolTips()方法结合ON_NOTIFY_EX(TTN_NEEDTEXT, ...)消息响应
处理ToolTip,但是只有确定/取消按钮能够触发TTN_NEEDTEXT消息,其它控件无法触发。

问题追踪
由于打断点后从调用堆栈中无法定位TTN_NEEDTEXT消息的发送者,此问题一度陷入僵局。
今天我鬼使神差的突然想看看EnableToolTips()的内部实现,结果发现其中有两行代码
是对一个函数指针的赋值:
C/C++ code

AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
pModuleState->m_pfnFilterToolTipMessage = &CWnd::_FilterToolTipMessage;


(...\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\tooltip.cpp)

于是乎继续去看_FilterToolTipMessage的实现,发现这样一个处理流程:
CWnd::_FilterToolTipMessage
 → CWnd::FilterToolTipMessage
  → CWnd::OnToolHitTest
   → _AfxChildWindowFromPoint
   → _AfxGetDlgCtrlID
   → ...

打断点一试,果不其然,问题就出在取子窗体句柄这里,居然是因为用了Group控件

问题分析
插嘴:这里必须说一下对话框控件的Tab键走位顺序问题,
Tab键走位顺序 = 控件在RC文件中的存储顺序 = 控件窗体的创建顺序 = 控件窗体的ZOrder顺序

我在做界面调整Tab键走位顺序时,习惯将Group控件的顺序放在其包含的控件之前,这样做结果
是Group控件的创建顺序也就是ZOrder顺序在前。而在上述流程中,只要光标处于Group控件区域
之内,_AfxChildWindowFromPoint就始终只会返回Group控件的窗体句柄,而Group控件的资源ID
缺省是IDC_STATIC=-1,这样OnToolHitTest后续会直接返回,也就不会有TTN_NEEDTEXT消息了。

解决方法:将Group控件的Tab键走位顺序置于其所包含的所有控件之后。


------解决方案--------------------
好帖
支持分享
推荐一下
------解决方案--------------------
路过,分享帖???
------解决方案--------------------
ding
------解决方案--------------------
支持分享
------解决方案--------------------
不错啊。。。
------解决方案--------------------
又学习了一招!帮顶!
------解决方案--------------------
学习了。。。。。。。。。
------解决方案--------------------
...........看看
------解决方案--------------------
我要分!
------解决方案--------------------
学习一下。。
------解决方案--------------------
学习一下。。
------解决方案--------------------
学习了,谢谢分享!
------解决方案--------------------
 
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
------解决方案--------------------

------解决方案--------------------
好,顶

------解决方案--------------------
使用EnableToolTips()方法结合ON_NOTIFY_EX(TTN_NEEDTEXT, ...)消息响应
处理ToolTip?楼主为何不用CToolTip类呢?我感觉更方便。
------解决方案--------------------
不错值得学习
------解决方案--------------------
好的顶
------解决方案--------------------
C++太难了呃
------解决方案--------------------
UP.........
------解决方案--------------------