我还没有找到解决这个问题的方法,但是在一些测试和逐步执行 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是一个扩展器属性,并且扩展器属性优先于您自己编写的具有相同名称的属性。