gpt4 book ai didi

vb.net - 停止在 UserControl 的特定区域引发 Click 事件

转载 作者:行者123 更新时间:2023-12-04 08:00:07 25 4
gpt4 key购买 nike

问题
UserControl 默认引发 Click按下鼠标按钮时的事件。单击 UserControl 的特定区域时,有没有办法防止事件引发?
代码
假设我们有这个特定的 UserControl。有一个红色矩形:我只想在白色区域引发点击事件。
我试图覆盖 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 不会产生预期的结果:
Output
我怎样才能达到我想要的结果?

最佳答案

您正在覆盖 OnMouseClick ,但您已订阅 Click表单中的事件。OnMouseClickOnClick 之后调用,所以你压制 MouseClick ,但 Click事件已经被提出。
覆盖 OnClick反而。或订阅 MouseClick表单中的事件。
请注意 EventArgsOnClick方法实际上是一个MouseEventArgs对象,因此您可以转换 EventArgsMouseEventArgs :

Protected Overrides Sub OnClick(e As EventArgs)
If Not noClickArea.Contains(CType(e, MouseEventArgs).Location) Then
MyBase.OnClick(e)
End If
End Sub
然后,覆盖 OnPaint而不是订阅 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() 在这种情况下。

关于vb.net - 停止在 UserControl 的特定区域引发 Click 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66515657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com