Win32 ToolTip消失,永远不会重新出现在Commctl 6中

时间:2008-09-09 02:41:27

标签: windows winapi

我正在创建一个ToolTip窗口并使用标志向其添加工具 TTF_IDISHWND | TTF_SUBCLASS。 (c ++,win32)

我有一个清单文件,以便我的程序使用新的WindowsXP主题 (comctrl32版本6)。

当我将鼠标悬停在已注册的工具上时,会出现提示 好。
当我点击鼠标时,尖端消失 好吧。
但是,远离工具并返回 再次不会使提示重新出现。我需要将鼠标悬停在不同的工具上 然后回到我的工具,让小费回来。

当我删除我的清单文件(使用较旧的非XP comctrl32)时, 问题消失了。

在做了一些实验之后,我发现了以下不同之处 在Comctl32版本5(旧版)和Comctl32版本6(新版)中的工具提示之间:

  • 新的TTF_TRANSPARENT工具提示(在就地使用时)实际返回 来自WM_NCITTEST的HTCLIENT,如果鼠标按钮关闭,从而得到 WM_LBUTTONDOWN并在消失前偷走焦点片刻。这导致 应用程序与闪存的边界。

  • 旧的TTF_TRANSPARENT工具提示始终从WM_NCHITTEST返回HTTRANSPARENT, 因此永远不会自己获得WM_LBUTTONDOWN并且永远不会窃取焦点。 (这似乎只是审美,但可能影响下一点......)

  • 点击鼠标后,新的工具提示似乎没有得到WM_TIMER事件 仅在取消激活后恢复获取(一堆)计时器事件 重新激活。因此,它们不会在鼠标之后重新显示其尖端窗口 点击并发布。

  • 旧工具提示会在鼠标再次移动后立即收到WM_TIMER消息 点击/释放后,他们就可以重新显示他们的提示了。

因此,作为一个comctl32解决方法,我不得不:

  • 子类化TOOLTIPS_CLASS窗口并始终从中返回HTTRANSPARENT WM_NCHITTEST,如果该工具要求透明度。

  • 避免使用TTF_SUBCLASS而是自己处理鼠标消息 我可以在收到WM_xBUTTONUP后取消激活/重新激活。

我认为内部行为的变化是为了适应工具提示中的新“可点击”功能,如超链接,但悬停行为似乎因此而被破坏。

有没有人知道比我的子类解决方案更好的解决方案?我错过了其他一些观点吗?

2 个答案:

答案 0 :(得分:1)

您并不是唯一一个在这些DLLS之间遇到工具提示的兼容性问题的人。

我也可以使用可用的通用控件中的新工具提示只有麻烦。在添加清单和主题申请之前,我们已经使用鼠标消息进行了修改并激活/停用了提示 - 所以听起来你的行为并不太疯狂。

我们仍然遇到问题,当鼠标移动时(不仅仅是悬停时)不断发送TTN_NEEDTEXT消息,定位大提示问题(可能不是新的),并发送奇怪的unicode消息而不是ANSI版本(我计划在某个时候发布一个问题)。

答案 1 :(得分:0)

我不知道,但这听起来像是一个非常“困难”的问题(从所有现实世界的角度来看)问题真的很难。我敢打赌,潜在的问题与焦点的设置有关。手动执行此操作的Windows是邪恶的,通常会遇到各种各样的错误。