自定义控件事件传递过程
本人使用自定义控件发现如果自定义控件被另一个控件全部覆盖,当双击或 单击窗体时,事件引起控件事件不是主体事件,多次测试才找到这个技巧。
首先加一个自定义控件,然后在自定义控件窗体上添加一个PANEL控件,并让控件FILL全部面板,当控件实例化时,我们在操作拖拉主界面的上的控件时,能实现自定义控件,在自定义控件中首先要重写事件
Shadows Event MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs)
Shadows Event MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs)
Shadows Event MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs)
‘新的事件要用shadows来覆盖原事件。接下来要对事件进行加载操作,并将panel对应的事件传递给主窗体对应的事件,这里需要'注意的传递事件,在传递时sender不是panel主体而是自定义控件的自身。所以要用ME来替代sender.
Private Sub UcShow_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
AddHandler PanelTItle.MouseDown, AddressOf UcShow_MouseDown
AddHandler PanelTItle.MouseUp, AddressOf UcShow_MouseUP
AddHandler PanelTItle.MouseMove, AddressOf UcShow_MouseMove
End Sub
Private Sub UcShow_MouseDown(sender As Object, e As MouseEventArgs)
RaiseEvent MouseDown(Me, e)
End Sub
Private Sub UcShow_MouseUp(sender As Object, e As MouseEventArgs)
RaiseEvent MouseUp(Me, e)
End Sub
Private Sub UcShow_MouseMove(sender As Object, e As MouseEventArgs)
RaiseEvent MouseMove(Me, e)
End Sub
在主窗体中,使用时还要对相应的事件进行再次重写
AddHandler ctlUcshow.MouseMove, AddressOf PictureBox_MouseMove
AddHandler ctlUcshow.MouseUp, AddressOf PictureBox_MouseUp
AddHandler ctlUcshow.MouseDown, AddressOf PictureBox_MouseDown
另要还要对委托执行的事件再次重写一下,这样此过程才能完成 、
Public X, Y As Integer
Private Sub PictureBox_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
X = e.X : Y = e.Y
End Sub
Private Sub PictureBox_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
End Sub
Private Sub PictureBox_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
If Not MoveEnable Then Exit Sub
If X = e.X And Y = e.Y Then Exit Sub
If e.Button = Windows.Forms.MouseButtons.Left Then
sender.Left = sender.Left + e.X - X
sender.Top = sender.Top + e.Y - Y
End If
End Sub