问题
默认情况下,按下鼠标按钮时,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 不会产生预期的结果:
怎样才能达到我想要的结果?
1条答案
按热度按时间tpgth1q71#
您正在重写
OnMouseClick
,但您已经订阅了窗体中的Click
事件。OnMouseClick
是在OnClick
之后呼叫,因此您会隐藏MouseClick
,但已经引发Click
事件。改为覆写
OnClick
。或订阅表单中的MouseClick
事件。请注意,
OnClick
方法的EventArgs
实际上是MouseEventArgs
对象,因此您可以将EventArgs
转型为MouseEventArgs
:然后,覆写
OnPaint
,而不是订阅UserControl中的Paint
事件。另外,不要在事件或方法重写中使用
Me.CreateGraphics
,这没有意义。使用
PaintVentArgs
提供的Graphics对象:作为一个建议(因为我不知道真实的的用例是什么),如果您想用颜色填充整个控件的背景,请在设计器中设置控件的背景颜色,而不是在该上下文中使用**
Graphics.Clear()
**。