winforms 停止在UserControl的特定区域引发Click事件

gj3fmq9x  于 2022-11-16  发布在  其他
关注(0)|答案(1)|浏览(131)

问题

默认情况下,按下鼠标按钮时,UserControl会引发Click事件.有没有方法可以防止在单击UserControl得特定区域时引发该事件?

代码

假设我们有一个特定的UserControl,其中有一个红色的矩形:我只想在白色区域引发click事件。
我已尝试覆写OnMouseClick子函数:

Public Class UserControl1

    Dim noClickArea As New Rectangle(100, 100, 50, 50)

    'Draw the red rectangle
    Private Sub UserControl1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
        Using gr As Graphics = Me.CreateGraphics
            gr.Clear(Color.White)
            gr.FillRectangle(Brushes.Red, noClickArea)
        End Using
    End Sub

    'This aims to prevent the mouseClick event on noClickArea
    Protected Overrides Sub OnMouseClick(e As MouseEventArgs)
        If Not noClickArea.Contains(e.Location) Then
            MyBase.OnMouseClick(e)
        End If
    End Sub

End Class

以下是使用此UserControl并在单击时显示消息框的测试窗体:

Public Class Form1

    Private Sub UserControl11_Click(sender As Object, e As EventArgs) Handles UserControl11.Click
        MessageBox.Show("Click")
    End Sub
End Class

结果

覆盖 OnMouseClick 不会产生预期的结果:

怎样才能达到我想要的结果?

tpgth1q7

tpgth1q71#

您正在重写OnMouseClick,但您已经订阅了窗体中的Click事件。
OnMouseClick是在OnClick之后呼叫,因此您会隐藏MouseClick,但已经引发Click事件。
改为覆写OnClick。或订阅表单中的MouseClick事件。
请注意,OnClick方法的EventArgs实际上是MouseEventArgs对象,因此您可以将EventArgs转型为MouseEventArgs

Protected Overrides Sub OnClick(e As EventArgs)
    If noClickArea.Contains(CType(e, MouseEventArgs).Location) Then Return
    MyBase.OnClick(e)
End Sub

然后,覆写OnPaint,而不是订阅UserControl中的Paint事件。
另外,不要在事件或方法重写中使用Me.CreateGraphics,这没有意义。
使用PaintVentArgs提供的Graphics对象:

Protected Overrides Sub OnPaint(e As PaintEventArgs)
    e.Graphics.Clear(Color.White)
    e.Graphics.FillRectangle(Brushes.Red, noClickArea)
    MyBase.OnPaint(e)
End Sub

作为一个建议(因为我不知道真实的的用例是什么),如果您想用颜色填充整个控件的背景,请在设计器中设置控件的背景颜色,而不是在该上下文中使用**Graphics.Clear()**。

相关问题