程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了TreeView vs. ListView MouseDown(长按)事件序列代码-执行-暂停差异大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决TreeView vs. ListView MouseDown(长按)事件序列代码-执行-暂停差异?

开发过程中遇到TreeView vs. ListView MouseDown(长按)事件序列代码-执行-暂停差异的问题如何解决?下面主要结合日常开发的经验,给出你关于TreeView vs. ListView MouseDown(长按)事件序列代码-执行-暂停差异的解决方法建议,希望对你解决TreeView vs. ListView MouseDown(长按)事件序列代码-执行-暂停差异有所启发或帮助;

这是一个 Excel VBA 项目(因为有人编辑了标题),我需要澄清这篇文章的内容。

我正在编写通过 VBA 代码模块遍历/工作的代码,以列出用户窗体上的过程和控件,并列出过程如何/哪些过程相互调用。

我试图在 VBA 编辑器的设计器窗口中的用户窗体上在运行时模拟用户窗体控件的抖动,以通知用户使用鼠标选择了该特定控件在无模式用户窗体上的 ListVIEw/TreeVIEw 的 ListItem/Node 上。

用文字描述很复杂,所以我附上了一张GIF。

TreeView vs. ListView MouseDown(长按)事件序列代码-执行-暂停差异

在 GIF 中,可以看到,在立即窗格中,执行 ListVIEw 中的 @H_703_7@mouseDown 和 ItemClick 事件后代码执行暂停,因为我没有释放按下的鼠标左键 (LMB) .
所以我猜 ListVIEws 中的事件顺序是这样的

  1. 鼠标按下
  2. ItemClick
    暂停
  3. @H_175_21@mouseUp
  4. 点击。

因此,我将 jiggle 例程代码放在 ListVIEw 的 ItemClick 事件中。

然而,当我尝试用 TreeVIEw 做同样的事情时,我发现代码执行在 TreeVIEw 的 MouseDown 事件之后暂停,如果我没有释放 LMB,没有继续执行 NodeClick 事件,如它与 ListVIEw 一起使用,并且是 MouseDown 事件。

由于我将抖动代码放在 TreeVIEw NodeClick 事件处理程序中,但尚未发生,因此没有抖动效果。
但是在 LMB 释放后,控件的抖动效果非常直接,引人注目,因为代码执行在 MouseDown 事件结束时暂停后继续执行,不间断,直到 MouseUp 事件结束。
这一系列事件可以在立即窗口的输出中看到,如下面的 GIF 所示。

TreeView vs. ListView MouseDown(长按)事件序列代码-执行-暂停差异

这里也很明显,如果鼠标左键被按下,则在处理 MouseDown 事件后代码执行暂停,没有进入 NodeClick 事件,就像在 ListVIEw 中那样。

  1. 鼠标按下
    暂停
  2. 节点点击
  3. @H_175_21@mouseUp
  4. 点击。

所以,情况就如上。
我试图将抖动代码放入 MouseDown 事件中。
但是,由于我需要 TreeVIEw 中的 SELEctedItem 来使我的 jiggle 代码正常工作,因此无论如何我都需要 NodeClick 事件。

我试图在 MouseDown 事件中检查 TreeVIEw 的 SELEctedItem/SELEcted-Node 但不幸的是,它只返回前一个 SELEctedItem/SELEcted-Node 而不是刚刚发生 MouseDown 事件的节点,这本身就有意义,因为 SELEctedItem 尚未设置为新节点,因为 NodeClick 事件尚未发生。

我认为,如果我可以在 MouseDown 事件时使用 HitTest 将节点置于鼠标下方,我就可以将该节点用作我的 jiggle 代码中的 SELEctedItem。
另一个障碍出现了,因为 TreeVIEw HitTest 函数使用 X,Y 作为单数,这似乎是 ?Twips 而不是像素,我可能需要使用幻数 = 88,90 和神奇的 TwipsPerPixel 函数并重新计算它以用于不同的显示器和分辨率。
所以,我寻找了不同的解决方案。

PS:作为一个缅甸人,我有责任让人们意识到缅甸目前正在发生一场反对残酷军事政变的革命,并恳请你们支持缅甸人民。谢谢。

解决方法

我以定制的 HitTest 函数的形式找到了不同的解决方案,使用对 TreeView 的 Sendmessage API 调用,而不是使用 TreeView 的默认 HitTest 函数,可用 here。
那里的代码示例被允许自由使用,但不得在其版权免责声明中提到的任何网站上发布。
所以我想我不能在这里分享代码片段,但我相信分享该网站的链接是可以的。

我不得不稍微修改一下那里提到的代码,以返回节点,而不是返回其函数中返回的节点句柄。
我使用该函数是因为它使用像素作为 X、Y 坐标,而不是 VBA 使用的 ?Twips。
如果谷歌足够努力,也可以在其他地方找到 ListViews 的类似功能。
因此,它就像一个魅力,控件现在在 MouseDown 事件内摇晃,而不使用 NodeClick 事件。

TreeView vs. ListView MouseDown(长按)事件序列代码-执行-暂停差异

我认为这里的底线是:

  • ListViews 和 TreeViews 处理鼠标点击事件的不同之处在于 ListViews 似乎将 ItemClick 事件视为 MouseDown 事件序列的一部分,而 TreeViews 将 NodeClick 事件视为与 MouseDown 事件分开
  • 我不知道这背后的原因,但怀疑这可能与他们的起源有关

我写了这个问题+答案帖子,以帮助 VBA 程序员解决 ItemClick 与 NodeClick 事件序列差异的问题,并让他们知道那里有更好的 HitTest 例程,无需转换鼠标即可使用以像素为单位的坐标。

整个 VBA 项目是我的 VBA 项目信息工具(带有代码混淆器和可视化代码流工具)的一部分,在 GitHub 上提供了基本的 Alpha RC 版本。

备注: 我一生都无法在任何地方找到 ListViews 和 TreeViews 的 MouseClick 事件序列的官方描述。因此,不得不求助于 debug.print "1.TV_MouseDown" 的东西。

PS:身为缅甸人,我恳请大家支持缅甸春季革命。
缅甸革命万岁!!!

大佬总结

以上是大佬教程为你收集整理的TreeView vs. ListView MouseDown(长按)事件序列代码-执行-暂停差异全部内容,希望文章能够帮你解决TreeView vs. ListView MouseDown(长按)事件序列代码-执行-暂停差异所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:vs.