【问题标题】:Win32 ToolTip disappears never to re-appear with Commctl 6Win32 ToolTip 消失后永远不会在 Commctl 6 中重新出现
【发布时间】: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 后停用/重新激活。

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

有没有人知道比我的子类解决方法更好的解决方案?我是否遗漏了其他一点?

【问题讨论】:

    标签: windows winapi


    【解决方案1】:

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

    我也对主题通用控件中的新工具提示遇到了麻烦。在添加清单和主题化我们的应用程序之前,我们已经在处理鼠标消息和激活/停用提示 - 所以听起来你的所作所为并不太疯狂。

    我们仍然遇到以下问题:随着鼠标移动(不仅仅是悬停时),TTN_NEEDTEXT 消息不断发送,大提示的定位问题(可能不是新事物),以及发送奇怪的 unicode 消息而不是 ANSI 版本(我计划在某个时候将其作为问题发布)。

    【讨论】:

    • 我对@9​​87654322@ 控件也有类似的问题。我的问题看起来很简单,但没有人提供解决方案。我提供了赏金,但得到了 1 个对我没有帮助的答案。请问您是否可以查看my question 并告诉我您是否曾经遇到并解决过此类问题。我很抱歉这样打扰你,通常我不会这样寻求帮助,但我很绝望。谢谢你。最好的问候。
    • @AlwaysLearningNewStuff,我看了这个问题。自从我完成 win32 后,已经过了太多时间来帮助我解决如此具体的问题,抱歉。
    【解决方案2】:

    我不知道,但这听起来像是一个非常“难”的问题(从某种意义上说,所有现实世界的问题都非常难)。我敢打赌,根本问题与焦点的设置有关。手动执行此操作的 Windows 是邪恶的,并且通常会遇到各种错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多