2008-09-09 72 views
8

我正在创建ToolTip窗口并使用标志向其添加工具 TTF_IDISHWND | TTF_SUBCLASS。 (C++,win32)Win32 ToolTip消失再也不会出现在Commctl中6

我有一个清单文件,使我的程序使用新的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时取消激活/重新激活。

我假定在内部行为变化为以适应像的超链接工具提示新的“可点击”的特点,但悬停行为似乎是由此破碎。

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

回答

0

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

1

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

我也有没有什么,但麻烦与可编程通用控件中的新工具提示。在添加清单并对我们的应用程序进行主题化之前,我们已经在使用鼠标消息和主动/停用提示,这听起来像你所做的事情不是太疯狂。

我们仍然生活在TTN_NEEDTEXT消息随着鼠标移动而不断发送(不仅仅是悬停时),定位问题时使用大提示(可能不是新事物),而是发送奇数unicode消息而不是ANSI版本(我计划在某个时候发布一个问题)。

+0

我有`tooltip`控件的类似问题。我的问题似乎很简单,但没有人提供解决方案。我提供了一个赏金,但得到了1个答案,这对我没有帮助。我问你,如果你可以看看[我的问题](http://stackoverflow.com/questions/21238449/tooltip-is-never-shown-again-after-i-click-on-the-button-rephrased-to - 反映)并告诉我你是否遇到过并解决过这样的问题。我为这样的打扰而道歉,通常我不会以这种方式寻求帮助,但我绝望。谢谢。最好的祝福。 – AlwaysLearningNewStuff 2014-01-29 21:32:15

相关问题