gpt4 book ai didi

.net - 在控件的滚动条上移动时触发 MouseLeave 事件

转载 作者:行者123 更新时间:2023-12-03 23:06:30 28 4
gpt4 key购买 nike

由于无法解决问题,我重新发布此问题(原始 here)。

在 TreeView、ListBox 或从我的 google 搜索任何带有 ScrollBar 的内容中,ScrollBar 不被视为控件的一部分。

我有一个要放入自定义控件的 TreeView,它是 Dock Fill。因此,它充当一个自定义的 TreeView,它具有我们在一个地方管理它的所有逻辑。

在我们程序的一部分中,我们根据 MouseEnter 事件将其滑出,然后在 MouseLeave 事件上将其滑回,但是我们目前为此使用了 3rd 方库的 TreeView,我的任务是替换它。

因此,我已将所有内容移至 Windows TreeView,但找不到可靠捕获 MouseLeave 的方法——仅当它离开整个 TreeView(包括滚动条)时。

我已经看到了一种将它包装在具有几个像素的面板中并捕获面板的 MouseLeave 的黑客解决方案,但我几乎不相信这是微软在这种情况下打算让我们做的。

简而言之:

ScrollBar 不会为控件触发 MouseEnter 或 MouseLeave,这使得使用 MouseEnter/MouseLeave 滑出控件无法使用,因为用户无法使用 ScrollBar。

处理这种情况的首选方法是什么?

在上一个问题中,我得到了使用 Spy++ 并尝试附加到 WndProc() 以处理 ScrollBar 的 MouseEnter/MouseLeave 的建议。

然而,这不起作用,因为 Spy++ 显示的消息没有在 WndProc() 中在表单级别或控制级别触发。就好像 .NET 看不到 ScrollBar 一样。

对于这样一个简单的请求,使用 WndProc() 似乎也不现实,有没有其他方法可以做到这一点,或者如果 WndProc() 是唯一的方法,有没有人真的能够做到这一点并告诉我如何做到这一点?

最佳答案

对此没有干净的解决方案。您的面板技巧也不起作用,当用户快速移动鼠标时,它会完全被错过。

平底船。获得 MouseEnter 后,启动 200 毫秒计时器。在 Tick 事件中,检查鼠标是否仍然悬停在树 View 上。例如:

    private void treeView1_MouseEnter(object sender, EventArgs e) {
timer1.Enabled = true;
treeView1.Width = 220;
}

private void timer1_Tick(object sender, EventArgs e) {
Point pos = treeView1.PointToClient(Cursor.Position);
if (!treeView1.DisplayRectangle.Contains(pos)) {
timer1.Enabled = false;
treeView1.Width = 50;
}
}

顺便说一句,Application.Idle 事件也很有效,只是有点尴尬。

关于.net - 在控件的滚动条上移动时触发 MouseLeave 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3391004/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com