Win32 ToolTip消失,再也不会与Commctl 6一起出现

时间:2020-03-05 18:49:48  来源:igfitidea点击:

我正在创建一个工具提示窗口,并使用标志向其中添加工具
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返回HTTRANSPARENT。
  • 避免使用TTF_SUBCLASS,而是自己处理鼠标消息,以便在收到WM_xBUTTONUP后可以停用/重新激活。

我认为内部行为的变化是为了容纳工具提示中的新"可单击"功能(如超链接),但是悬停行为似乎因此被破坏。

有谁知道比我的子类解决方法更好的解决方案?我还有其他要点吗?

解决方案

回答

我不知道,但这听起来像是一个非常"棘手的"问题(从某种意义上说,是所有现实世界中的问题)都非常棘手。我敢打赌,潜在的问题与焦点的设置有关。手动执行此操作的Windows是有害的,通常会遭受各种错误。

回答

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

除了可使用的通用控件中的新工具提示外,我也没有什么麻烦。在添加清单和主题化我们的应用程序之前,我们一直在忙于鼠标消息和激活/停用提示,因此听起来工作并不太疯狂。

我们仍然面临着TTN_NEEDTEXT消息随着鼠标移动而不断发送的问题(不仅仅是在悬停时),带有大笔尖的定位问题(可能不是新的东西)以及奇怪的unicode消息(而不是ANSI版本)被发送的问题。计划在某个时间发布为问题)。