如何在用户控件中捕获鼠标滚轮事件?

4

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

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

我在Windows Forms Designer中找不到MouseWheel事件,尽管文档建议它应该是每个Control派生元素的一部分。同样,文档建议UserControl是一个派生类,因此应该支持该事件。

我漏掉了什么?


WM_MOUSEWHEEL消息被发送到具有焦点的窗口。这永远不会是您的UserControl,因为它无法获得焦点。这就是事件在设计器中隐藏的基本原因。它将成为UC内部的控件。只有当它不处理消息时,才会将其传递给父级。我们无法从您的问题中猜测您放置在UC中的控件或焦点所在的位置。 - Hans Passant
我的UserControl里面没有控件 - 它只是处理OnPaint事件来进行一些绘图。我已经查看了父级System::Windows::Forms::Form,但似乎也没有MouseWheel事件。根据你的说法,父级目前会处理这个事件? - Jon Cage
你是否考虑过,如果你的UserControl不作为其他控件的容器,而是继承自PictureBox(或类似控件)? - Rowland Shaw
我没有。那会有帮助吗? - Jon Cage
如果您不在用户控件中添加任何控件,那么使用用户控件就毫无意义。最好从Control类派生您的类。这样,它就可以获得焦点并具有MouseWheel事件。不要使用PictureBox,因为它也无法获得焦点。确保用户能够知道您的控件已经获得了焦点,您需要绘制一个焦点矩形。 - Hans Passant
2个回答

4

如果有其他人遇到了同样的问题,最终我只是在父控件中添加了一些处理来调用用户控件中的功能:

    Form1(void)
    {
        InitializeComponent();

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

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

2
我不理解这个。如果表单有一个“MouseWheel”事件,为什么它们不会显示在事件列表中? - Jonathan Wood
由于某些奇怪的原因,它们被隐藏在设计师视图中。 - Adam

2

获取UserControls的鼠标事件的解决方案是设置控件的背景。每个面板(Grid,Canvas等)都需要背景颜色来处理鼠标事件。

因此,只需为您的控件添加透明背景即可捕获滚动事件。

最初的回答:

Set the Background of your UserControl to transparent to capture mouse events.

Background="Transparent"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接