2

我有一个带有属性集的分层 flexgrid控件ToolTipText,当我从源代码运行时,工具提示会按应有的方式显示。但是当我编译它并以这种方式运行时,工具提示不会显示。

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


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

我有兴趣看看这是如何重现的......

4

2 回答 2

2

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

第一个有趣的事情是 VB6 没有使用 Windows 提供的标准工具提示显示机制。例如,它不使用WM_NOTIFY消息来显示/隐藏工具提示,或解释工具提示如何在 Windows 中工作的文档中描述的任何其他“标准”工具提示支持。

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

VB6如何做工具提示的细分:

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

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

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

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

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

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

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

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

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

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

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

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

于 2012-03-13T04:38:18.210 回答
0

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

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

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

于 2012-03-02T02:31:12.350 回答