工具提示仅显示从源运行时

时间:2012-02-29 22:43:58

标签: vb6 msflexgrid

我有ToolTipText属性设置的hierarchical flexgrid控件,当我从源代码运行时,工具提示会显示它应该显示的内容。但是当我编译并运行时,工具提示不会显示。

我试图删除任何听MouseMove的内容,希望能解决这个问题,当我添加一些代码将工具提示文本放入消息框时,它似乎设置正确。谁能想到为什么会发生这种情况?


更新:当我在另一个用户控件中托管网格时,似乎出现了问题。例如:make container.ctl,它只是一个空白控件,但ControlContainer = True。然后创建gridholder.ctl,它是container.ctl中的mshfg。最后,将gridholder.ctl嵌入到某种形式中。 flexgrid上的工具提示似乎没有出现。

我很想知道这是多么可重复......

2 个答案:

答案 0 :(得分:2)

我还没有找到解决这个问题的方法,但是我更好地了解了为什么在经过一些测试并在WinDBG中逐步完成一些VB6运行时代码之后会发生这种情况。

第一个有趣的事情是VB6不使用Windows提供的标准工具提示显示机制。例如,它不会使用 WM_NOTIFY 消息来显示/隐藏工具提示,或documentation explaining how tooltips work in Windows中描述的任何其他“标准”工具提示支持。

相反,VB6运行时有自己的方式来管理和显示工具提示。原则上,它在某些方面类似于处理工具提示的标准Windows方式,但在很多方面也有所不同。

VB6如何处理工具提示的细分:

  • 当VB6程序启动时,运行时使用SetWindowsHookEx为程序的主线程安装鼠标挂钩。

  • 鼠标钩子拦截发送到程序的所有鼠标消息,特别是所有 WM_MOUSEMOUSE 消息

  • 每当鼠标钩子运行时,它会调用VB6运行时中的内部方法来获取鼠标当前位于其上方的控件的对象指针(HCTL)。请注意,这是一个实际的COM接口指针,而不是窗口句柄。

  • 它将HCTL转换为相应的窗口句柄(HWND)。

  • 检查鼠标位置是否在该窗口的矩形内。

  • 如果是这样,它会检索控件的 ToolTipText 属性。如果这不是空的,它会创建一个工具提示窗口,并在700ms延迟后显示工具提示。

MSHFlexGrid的问题(我想象其他非标准VB6控件的控件)是当您将鼠标悬停在控件上并且它位于自定义容器中时,此代码不会检索正确的HCTL。

在这种情况下,代码检索自定义容器的HCTL,而不是MSHFlexGrid本身的HCTL。因此,它检索容器的 ToolTipText 属性(为空)而不是网格的 ToolTipText ,因此不会显示工具提示。

我不确定为什么它会这样做,因为正如您对问题的评论中所述,如果您使用 PictureBox 作为您的所有内容,这一切都能正常工作容器

我怀疑 PictureBox 有正确处理此问题的代码,在您创建自己的容器时未包含此代码。

如果我找到一个,我会用实际的解决方法更新这个答案。我现在唯一能想到的就是以某种方式将容器的 ToolTipText 属性与网格的 ToolTipText 属性“同步”,这样当VB6请求容器的 ToolTipText时/ strong>,它将返回网格的 ToolTextTip 属性的值。

然而,这说起来容易做起来难,因为 ToolTipText 是扩展程序属性,扩展程序属性优先于您自己编写的具有相同名称的属性。

答案 1 :(得分:0)

经过一番研究后,我发现了我认为的根本问题。您的用户控件未实现控件与之交互的任何方法。作为容器控件的用户控件需要实现扩展器功能。这两个链接是迄今为止我在这个主题上找到的最好的链接。

http://www.justvb.net/obook/ch7.htm#UsingtheExtenderObject

http://msdn.microsoft.com/en-us/library/aa733622(v=vs.60).aspx