【问题标题】:How do I capture MouseWheel events in a UserControl?如何在 UserControl 中捕获 MouseWheel 事件?
【发布时间】:2015-03-02 13:46:13
【问题描述】:

我有一个UserControl 派生控件。当用户移动鼠标滚轮时,我想捕捉并响应它。

我尝试使用 Scroll 事件,但它似乎永远不会触发,我猜这是因为我的控件没有(或不需要)滚动条。

我在 Windows 窗体设计器中找不到 MouseWheel 事件,尽管 the docs 建议它应该是每个 Control 派生元素的一部分。同样,the docs 建议 UserControl 是派生的,因此它应该支持该事件。

我错过了什么?

【问题讨论】:

  • WM_MOUSEWHEEL 消息被发送到具有焦点的窗口。那永远不会是您的用户控件,它无法获得焦点。事件隐藏在设计器中的基本原因。它将是 UC 内部的一个控件。只有当它不处理消息时,它才会传递给父级。我们无法猜测您在 UC 中设置了哪些控件,或者您的问题的焦点在哪里。
  • 我的 UserControl 里面没有控件——它只是处理OnPaint 甚至做一些绘图。我查看了父 System::Windows::Forms::Form 并且似乎也没有 MouseWheel 事件。根据您的说法,父母目前正在处理该事件?
  • 如果您不将UserControl 用作其他控件的容器,您是否考虑过从PictureBox(或类似的)继承?
  • 不,我没有。这会有帮助吗?
  • 如果您没有在其中放置任何控件,那么使用 UC 就毫无意义。只需从 Control 派生您的类即可。现在它可以获得焦点并且确实有一个 MouseWheel 事件。不要使用 PictureBox,它也无法获得焦点。确保用户可以告诉您的控件有焦点,您需要绘制一个焦点矩形。

标签: .net winforms scroll user-controls


【解决方案1】:

如果其他人遇到这种情况,最后我只是在 父控件调用用户控件中的功能:

    Form1(void)
    {
        InitializeComponent();

        MouseWheel += gcnew MouseEventHandler(this, &Form1::MouseWheelHandler);
    }

    void MouseWheelHandler(Object^ sender, MouseEventArgs^ e)
    {
        m_myUserControl->MouseWheel(e->Delta);
    }

【讨论】:

  • 我不明白这一点。如果表单有 MouseWheel 事件。为什么他们没有出现在事件列表中?
  • 出于某种奇怪的原因,它们对设计师隐藏了。
【解决方案2】:

从 UserControls 获取鼠标事件的解决方案是设置控件的背景。每个面板(Grid、Canvas、...)都需要一个 Backgroundcolor 来处理鼠标事件。

所以只要给你的控件添加一个透明背景,滚动事件就会被捕获

Background="Transparent"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    相关资源
    最近更新 更多