C++ 为什么CTOLTIPCTRL父项很重要?

C++ 为什么CTOLTIPCTRL父项很重要?,c++,winapi,mfc,tooltip,gdi,C++,Winapi,Mfc,Tooltip,Gdi,最近,我遇到了一个奇怪的UI问题,找到了解决方案,但仍然不确定问题的原因 先决条件: MFC MDI应用程序打开了两个无模式对话框,两个对话框都有一个子第三方网格和CTOLTIPCTRL。对话框窗口相互交叉(即活动对话框是非活动对话框的重叠部分)CTOLTIPCTRL与示例类似,工具提示的唯一工具集是网格。工具提示的父项是有相应对话框的网格,TTS_ALWAYSTIP样式设置为允许在非活动对话框上显示工具提示 问题: 当鼠标悬停在非活动对话框的网格上时,将显示工具提示,并在活动对话框上绘制非活动

最近,我遇到了一个奇怪的UI问题,找到了解决方案,但仍然不确定问题的原因

先决条件

MFC MDI应用程序打开了两个无模式对话框,两个对话框都有一个子第三方网格和
CTOLTIPCTRL
。对话框窗口相互交叉(即活动对话框是非活动对话框的重叠部分)<代码>CTOLTIPCTRL与示例类似,工具提示的唯一工具集是网格。工具提示的父项是有相应对话框的网格
TTS_ALWAYSTIP
样式设置为允许在非活动对话框上显示工具提示

问题

当鼠标悬停在非活动对话框的网格上时,将显示工具提示,并在活动对话框上绘制非活动对话框。换句话说,非活动窗口在不激活的情况下被置于顶部。它是完整绘制的,包括标题、按钮、网格等

我检查了Z顺序,发现非活动对话框仍然处于非活动状态,即使显示在顶部。没有改变Z顺序。然后,当工具提示出现时,我使用Spy++收集整个非活动对话框的消息日志,发现没有
WM\u ACTIVATE
WM\u FOCUS
WM\u ACTIVATE
,等等。然后我执行了关于如何在不激活和记录SetWindowPos调用的情况下打开窗口的搜索-仅对
CTOLTIPCTRL
的窗口执行调用。因此,对于调用的对话框,没有
SetWindowPos
。也没有调用bringtop()

解决方案

我已经将工具提示的父窗口从对话框的网格更改为对话框本身,并且解决了这个问题。然而,我仍然不知道发生了什么,以及为什么更改父属性很重要

问题

谁能给我一个提示,说明我遗漏了什么?也许,工具提示会导致网格重绘,而重绘有一个bug会导致在活动窗口上重绘,但我还并没有找到任何证据

在MSDN中也没有找到有关工具提示父属性的特定内容。也许,我必须读一些关于Windows GDI的文章