Vb6 工具提示仅在从源运行时显示
我有一个带有Vb6 工具提示仅在从源运行时显示,vb6,msflexgrid,Vb6,Msflexgrid,我有一个带有ToolTipText属性集的控件,当我从源代码运行时,工具提示将按其应有的方式显示。但当我编译它并以这种方式运行时,工具提示不会显示 我尝试删除任何收听MouseMove的内容,希望这能解决问题,当我添加一些代码将工具提示文本放入消息框时,它似乎设置正确。有人能想到为什么会发生这种情况吗 更新:当我将网格托管在另一个用户控件中时,问题似乎出现了。例如:make container.ctl,它只是一个空白控件,但ControlContainer=True。然后生成gridholde
ToolTipText
属性集的控件,当我从源代码运行时,工具提示将按其应有的方式显示。但当我编译它并以这种方式运行时,工具提示不会显示
我尝试删除任何收听MouseMove
的内容,希望这能解决问题,当我添加一些代码将工具提示文本放入消息框时,它似乎设置正确。有人能想到为什么会发生这种情况吗
更新:当我将网格托管在另一个用户控件中时,问题似乎出现了。例如:make container.ctl,它只是一个空白控件,但ControlContainer=True。然后生成gridholder.ctl,它是container.ctl中的mshfg。最后,将gridholder.ctl嵌入到某种形式中。flexgrid上的工具提示似乎不会显示
我很想看看这是多么的重复…经过一点研究,我发现了我认为根本的问题。您的用户控件未实现控件与之交互的任何方法。作为容器控件的用户控件需要实现扩展程序功能。这两个链接是迄今为止我在这个主题上找到的最好的链接
我还没有找到解决此问题的方法,但在WinDBG中进行了一些测试并逐步执行了一些VB6运行时代码之后,我对为什么会发生这种情况有了更好的了解 第一件有趣的事情是VB6没有使用Windows提供的标准工具提示显示机制。例如,它不使用WM_NOTIFY消息来显示/隐藏工具提示,也不使用中描述的任何其他“标准”工具提示支持 相反,VB6运行时有自己的管理和显示工具提示的方法。原则上,它在某些方面与标准Windows处理工具提示的方式类似,但在许多方面也有所不同 VB6如何执行工具提示的细分:
- 当VB6程序启动时,运行时使用为程序的主线程安装鼠标挂钩
- 鼠标钩子截取发送到程序的所有鼠标消息,特别是所有WM\u MOUSEMOUSE消息
- 每当鼠标挂钩运行时,它都会在VB6运行时调用一个内部方法,以获取鼠标当前位于其上方的控件的对象指针(HCTL)。请注意,这是一个实际的COM接口指针,而不是窗口句柄
- 它将HCTL转换为相应的窗口句柄(HWND)
- 它检查鼠标位置是否在该窗口的矩形内
- 如果是,则检索控件的ToolTipText属性。如果此选项不为空,则会创建一个工具提示窗口,并在700ms延迟后显示工具提示
但是,这说起来容易做起来难,因为ToolTipText是一个扩展程序属性,并且扩展程序属性优先于您自己编写的同名属性。编译它时,它会为我显示。给我试试这个。创建一个新项目。在一个新表单中,只添加一个网格,设置一个工具提示并直接编译它。现在测试EXE文件。它在这个问题上有效吗?@SiddharthRout:是的,一个简单的测试程序没有这个缺陷。所以我的程序中肯定有其他原因导致了这个,但我不知道该找什么。这个程序有多大?你能把表格压缩后上传到wikisend.com,然后在这里分享链接吗。我不介意看一看ic:)好的,帮我试试这个。创建一个新表单,然后将
网格
(无代码)从应用程序复制到此新项目并编译它。看看工具提示现在是否显示。有趣的是,以相同的方式使用图片框(这是一个容器控件)没有问题。我不确定你的意思。我应该使container.ctl成为“Extender”对象吗?我该怎么做?我不确定该如何实施。不是我曾经合作过的东西。我很好奇,所以我计划这个周末花点时间在上面。谢谢,我会看看我能用这个做些什么