【问题标题】:Disable all mouse messages on control禁用控件上的所有鼠标消息
【发布时间】:2018-10-19 15:22:40
【问题描述】:

我有一个绘制数据点的图形控件。数据点被绘制为每像素 1 个点。如果数据点的数量大于一定数量,或者窗口大小增加,则当您将鼠标移到控件上时,绘图的性能会受到影响。如果您快速移动,则绘图实际上会在运动过程中停止。

有没有办法在鼠标悬停在该控件上时禁用所有消息(按钮单击除外)?

我什么都没找到。

【问题讨论】:

  • 这是一个您可以访问源代码的图形控件还是您正在使用的库组件?另外,按钮点击是什么意思?
  • 我无权访问图形控件的源代码,它是一个库组件。我的意思是鼠标点击。所以我希望能够通过鼠标点击。
  • 从该控件类派生您自己的类。重写 OnMouseMove(),不要调用 base.OnMouseMove()。 Build > Build 并将其从工具箱顶部拖放到表单上,替换现有的。

标签: c# .net winforms


【解决方案1】:

根据您的描述,我认为过滤掉发送到控件的 MouseMove 消息就足够了。这可以通过让表单实现IMessageFilter 来完成,类似于下面的示例。从IMessageFilter.PreFilterMessage 返回true 可防止将消息发送到控件(示例中的面板)。已注册的过滤器在应用程序范围内处于活动状态,因此在表单激活/停用时添加/删除。

public partial class Form1 : Form, IMessageFilter
{
    private Panel pnl;

    public Form1()
    {
        InitializeComponent();
        pnl = new Panel { Size = new Size(200, 200), Location = new Point(20, 20), BackColor = Color.Aqua };
        Controls.Add(pnl);
        pnl.Click += panel_Click;
        pnl.MouseMove += panel_MouseMove;
        pnl.MouseHover += panel_MouseHover;

    }

    private void panel_MouseHover(sender As Object, e As EventArgs)
    {
        // this should not occur
        throw new NotImplementedException();
    }

    private void panel_MouseMove(object sender, MouseEventArgs e)
    {
        // this should not occur
        throw new NotImplementedException();
    }

    private void panel_Click(object sender, EventArgs e)
    {
        MessageBox.Show("panel clicked");
    }

    protected override void OnActivated(EventArgs e)
    {
        base.OnActivated(e);
        // install message filter when form activates
        Application.AddMessageFilter(this);
    }

    protected override void OnDeactivate(EventArgs e)
    {
        base.OnDeactivate(e);
        // remove message filter when form deactivates
        Application.RemoveMessageFilter(this);
    }

    bool IMessageFilter.PreFilterMessage(ref Message m)
    {
        bool handled = false;
        if (m.HWnd == pnl.Handle && (WM) m.Msg == WM.MOUSEMOVE)
        {
            handled = true;
        }
        return handled;
    }

    public  enum WM : int
    {
        #region Mouse Messages
        MOUSEFIRST = 0x200,
        MOUSEMOVE = 0x200,
        LBUTTONDOWN = 0x201,
        LBUTTONUP = 0x202,
        LBUTTONDBLCLK = 0x203,
        RBUTTONDOWN = 0x204,
        RBUTTONUP = 0x205,
        RBUTTONDBLCLK = 0x206,
        MBUTTONDOWN = 0x207,
        MBUTTONUP = 0x208,
        MBUTTONDBLCLK = 0x209,
        MOUSELAST = 0x209
        #endregion
    }
}

【讨论】:

  • 您好,您的解决方案是正确的,但是在这种情况下它不起作用。我已经确定这纯粹是图形性能问题。如果我在图表中绘制较少的项目,例如不绘制填充,那么就没有问题。我确实看到了这个解决方案,但是您的解决方案比其他解决方案更容易理解!做得很好,谢谢。
  • @Tom,您没有提到您使用的是哪个图表控件,但许多 WinForm 图表控件都是猪(尤其是 DataVisualization 命名空间中的 MS/Dundas 控件)。我已经看到一些关于 LiveCharts 的良好性能声明,但我只是自己玩过。
  • 这是来自 Mitov.com 的范围组件。我想我可能有一个解决方案,但我不确定如何实现它。鼠标在控件上移动的速度越快,绘图速度就越慢。因此,如果我能让鼠标在快速移动时不报告每个动作,它可能会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多