vb6 - 工具提示仅在从源代码运行时显示

标签 vb6 msflexgrid

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

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


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

我很想看看它的重现性如何......

最佳答案

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

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

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

VB6 如何执行工具提示的详细说明:

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

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

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

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

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

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

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

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

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

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

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

但是,说起来容易做起来难,因为 ToolTipText 是扩展器属性,并且扩展器属性优先于您自己编写的同名属性。

关于vb6 - 工具提示仅在从源代码运行时显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9507847/

相关文章:

com - 无法从调用 com 可见 c# 库的传输连接 VB6 读取数据

vb6 - 如何在 VB6 中将浮点类型转换为整数类型而不进行舍入

sql - 运行时错误 '3704' 在 VB6 中使用临时表使用 SP 时关闭对象时不允许操作

excel - 无法关闭用户窗体

collections - 在VB6中实现了什么集合?

vb.net - 使用 vb 查找特定文件夹下 Excel 中的行数的脚本

vb6 - 如何解决VB6中的MSFlexGrid错误30006

vb6 - MSFlexGrid 编辑 VB6

c# - 为什么VB6.0窗体显示为C#窗体?