代码之家  ›  专栏  ›  技术社区  ›  David Citron

Win32工具提示消失,不再与Commctl 6一起出现

  •  8
  • David Citron  · 技术社区  · 16 年前

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

    我有一个清单文件,使我的程序使用新的WindowsXP主题 (通讯录32第6版)。

    当我将鼠标悬停在已注册的工具上时,将显示提示。
    很好。
    当我点击鼠标时,提示消失了。
    好 啊。
    但是,离开工具并返回 不会再次出现提示。我需要在另一个工具上盘旋 然后回到我的工具那里拿小费回来。

    当我删除清单文件(使用旧的非XP comctrl32)时 问题解决了。

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

    • 新TTFA透明工具提示(当就地使用)实际上返回 如果鼠标按钮按下,则从WM ncitttest获取HTCLIENT 在消失之前,你会有片刻的专注。这会导致 应用程序的边框为flash。

    • 旧的TTFA透明工具提示总是从WMnnCtTestEnter返回HTTACK, 因此,永远不要让西蒙顿自己,也永远不要窃取焦点。(这似乎只是审美,但可能会影响到下一点……)

    • 新的工具提示似乎无法在鼠标单击后获得WM_TIMER事件,并且 只有在被取消激活和 重新激活。因此,它们不会在鼠标后重新显示提示窗口 单击并释放。

    • 旧的工具提示会在鼠标再次移动时收到WM_TIMER消息 单击/释放后,他们准备重新显示提示。

    因此,作为一个comctl32解决方案,我必须:

    • 子窗口的子窗口,总是返回 如果工具要求透明,则写入。

    • 避免使用TTF_子类,而是自己处理鼠标消息 我可以在收到WM xBUTTONUP后取消激活/重新激活。

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

    有人知道比我的子类解决方案更好的解决方案吗?我还漏掉了什么吗?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Aardvark    10 年前

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

    我也有过 只有麻烦 在可创建主题的公共控件中添加新的工具提示。在添加清单和创建应用程序主题之前,我们已经在修改鼠标消息和激活/停用提示了,所以听起来你的做法并不太疯狂。

    我们仍然面临着这样的问题:当鼠标移动时(不仅仅是在鼠标悬停时),需要不断发送TTN-u文本消息;用大提示定位问题(可能不是什么新东西);用奇怪的unicode消息代替ANSI版本(我计划在某个时候将其作为一个问题发布)。

        2
  •  0
  •   1800 INFORMATION    16 年前

    我不知道,但这听起来像是一个非常“难”的问题(从现实世界的意义上说)问题真的很难。我敢打赌,根本的问题与焦点的设置有关。手动操作的窗口是邪恶的,通常会遭受各种各样的错误。