【发布时间】:2008-09-09 02:41:26
【问题描述】:
我正在创建一个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 窗口并始终从 如果工具要求透明度,则 WM_NCHITTEST。
避免使用 TTF_SUBCLASS 而是自己处理鼠标消息 我可以在收到 WM_xBUTTONUP 后停用/重新激活。
我假设内部行为的变化是为了适应工具提示中新的“可点击”功能,如超链接,但悬停行为似乎因此被破坏。
有没有人知道比我的子类解决方法更好的解决方案?我是否遗漏了其他一点?
【问题讨论】: