【问题标题】:Capture mouse messages when a ToolStripDropDown is shown显示 ToolStripDropDown 时捕获鼠标消息
【发布时间】:2012-10-08 15:57:15
【问题描述】:

我正在尝试创建一个包含自定义控件的“工具提示”。我使用ToolStripDropDown 实现了它,它可以满足我的需要 - 当用户单击其他地方或激活另一个窗口等时关闭。

但是,即使显示 ToolStripDropDown,我也希望能够在父控件中获取 MouseMove 事件。我尝试在各个阶段设置父控件的Capture 属性(在显示下拉列表之前,在其Opened 事件处理程序等中),但它总是立即设置回false。有没有办法(不一定使用Capture 属性)在父控件中获取MouseMove 事件?不,我不想考虑像使用计时器和定期检查鼠标位置这样的丑陋技巧。

【问题讨论】:

  • 对,在下拉菜单之外单击时它会关闭。在窗口外单击时获取事件需要一些技巧。它需要捕获鼠标。你不能同时拥有它。
  • 我不需要获取MouseDown 事件,只需要获取MouseMove 事件。当显示 ToolStripDropDown 但鼠标在它之外时,哪个窗口会收到这些事件?
  • 下拉窗口获取它们。因为它捕获了鼠标。
  • 我的意思是如果我不手动设置Capture 属性,哪个窗口会获取它们,即。我只是显示下拉菜单(例如上下文菜单)。
  • 您在这件事上别无选择,下拉列表必须捕获鼠标,因此会总是得到鼠标消息。它必须或无法正常工作。不知道为什么这会让您感到困惑,除了它发生在您看不到的代码中。

标签: c# winforms toolstripdropdown mousecapture


【解决方案1】:

如果你想一直知道鼠标位置,那么你应该为父控件和ToolStripDropDown控件注册MouseDown事件,如下所示:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    lblPosition.Text = e.Location.ToString();
}

private void toolStripDropDownButton2_MouseMove(object sender, MouseEventArgs e)
{
    lblPosition.Text = e.Location.X + toolStripDropDownButton2.Bounds.Location.X + ", " + toolStripDropDownButton2.Bounds.Location.Y + e.Location.Y;
}

对于ToolStripDropDown,您应该计算与其父级的相对位置

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    相关资源
    最近更新 更多