我创建了一个继承PictureBox控件的自定义控件。我想在将新的CustomControl添加到TestApp时返回的MouseMove事件中添加一些其他数据。目前,引发的事件将作为
出现在TestApp中Private Sub MyCustomControl_MouseMove(sender as object,
e as MouseEventArgs) handles MyCustomControl.MouseMove
我的第一个想法是添加其他参数,例如
Private Sub MyCustomControl_MouseMove(sender as object,
e as MouseEventArgs, MyExtraArgument as double) handles MyCustomControl.MouseMove
或者作为替代方案,将我的额外参数添加到MouseEventArgs类中,使其显示为
e.MyExtraArgument
这些方法中的任何一种都可以吗?我的印象是,如果不能修改父控件的原始源代码,则不会覆盖这些事件/对象。有没有做过这些技巧的例子?理想情况下,我希望将所有代码保存在我新创建的控件库中,以便TestApp除了将新创建的子控件放入其中之外不需要任何其他内容。
更多信息.... 我将详细说明......其他args的原因是我已经实现了自动缩放,自动转换笛卡尔坐标系到继承的图片框而不使用矩阵和GDI固有的缩放方法。为了使新的图片框控件易于访问,我希望覆盖将X / Y作为整数返回的现有事件,允许它们返回双精度或小数。在这种情况下,扩展MouseEventArgs似乎更好。
答案 0 :(得分:1)
很难想象MouseEventArgs
中缺少什么需要扩展它。但是有几个问题:
MouseMove
事件签名将不允许它。MouseEventArgs
添加第三个参数,但不能在标准MouseMove
事件中使用它,因为事件签名不允许它。您可以使用标准MouseMove
事件,并使用扩展事件args类引发新的自定义事件。但这只会阻止旧事件触发,而不会显示为可用事件。这会使每个人感到困惑,并使事件看起来像是坏了。
您可以回复标准MouseMove
并提出并允许其存在的其他事件:
Public Event MouseMoved(sender As Object, e As MouseMovedEventArgs)
Public Class MouseMovedEventArgs : Inherits MouseEventArgs
Public Property NewProperty As Double
Public Sub New(btns As MouseButtons, clicks As Integer,
x As Integer, y As Integer, delta As Integer,
newThing As Double)
MyBase.New(btns, clicks, x, y, delta)
NewProperty = newThing
End Sub
End Class
Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
MyBase.OnMouseMove(e)
RaiseEvent MouseMoved(Me, New MouseMovedEventArgs(e.Button,
e.Clicks, e.X, e.Y, e.Delta, 3.14R))
End Sub
有两个非常相似的事件不会让用户感到困惑;偶然订阅错误的一个很容易。
一般来说,我怀疑这是一个XY问题,通过添加与MyExtraArgument
代表的任何信息直接相关的事件而不是试图将更多信息压缩到现有事件中更容易解决。
我希望覆盖将X / Y作为整数返回的现有事件,允许它们返回双精度或小数。
我不知道具体是什么,仅鼠标移动相关。如果您消耗MouseMove
,则用户无法再获取相对于控件的坐标,只能缩放到图像。
然后,MouseClick会发生什么?您想要替换/覆盖/镜像所有鼠标事件吗?当用户在Mouse事件之外需要该信息时会发生什么?
更好的方法可能是向转换器提供一些转发器。
Public Property Scale As Single ' eg 0.15 to 1.95
Public Function ConvertToScale(pt As Point) As PointF
' pt == mouse loc from Click event or whatever
' relative to the control
' Returns the point relative to the image
Public Function ConvertFromScale(ptF As PointF) As Point
' does the reverse
现在,在任何时候,使用控件的代码都可以在需要时转换或获取和(X,Y)位置。 BTW Single
应该足够了,防止你重新发明轮子。