Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb6 工具提示仅在从源运行时显示_Vb6_Msflexgrid - Fatal编程技术网

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延迟后显示工具提示

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

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

我不清楚它为什么会这样做,因为正如在您的问题的评论中所指出的,如果您使用PictureBox作为容器,所有这些都是正确的

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

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


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

编译它时,它会为我显示。给我试试这个。创建一个新项目。在一个新表单中,只添加一个网格,设置一个工具提示并直接编译它。现在测试EXE文件。它在这个问题上有效吗?@SiddharthRout:是的,一个简单的测试程序没有这个缺陷。所以我的程序中肯定有其他原因导致了这个,但我不知道该找什么。这个程序有多大?你能把表格压缩后上传到wikisend.com,然后在这里分享链接吗。我不介意看一看ic:)好的,帮我试试这个。创建一个新表单,然后将
网格
(无代码)从应用程序复制到此新项目并编译它。看看工具提示现在是否显示。有趣的是,以相同的方式使用图片框(这是一个容器控件)没有问题。我不确定你的意思。我应该使container.ctl成为“Extender”对象吗?我该怎么做?我不确定该如何实施。不是我曾经合作过的东西。我很好奇,所以我计划这个周末花点时间在上面。谢谢,我会看看我能用这个做些什么