我有ToolTipText
属性设置的hierarchical flexgrid控件,当我从源代码运行时,工具提示会显示它应该显示的内容。但是当我编译并运行时,工具提示不会显示。
我试图删除任何听MouseMove
的内容,希望能解决这个问题,当我添加一些代码将工具提示文本放入消息框时,它似乎设置正确。谁能想到为什么会发生这种情况?
更新:当我在另一个用户控件中托管网格时,似乎出现了问题。例如:make container.ctl,它只是一个空白控件,但ControlContainer = True。然后创建gridholder.ctl,它是container.ctl中的mshfg。最后,将gridholder.ctl嵌入到某种形式中。 flexgrid上的工具提示似乎没有出现。
我很想知道这是多么可重复......
答案 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