我需要制作"工作计划栏"。
在MainForm中有一个栏。当用户点击栏时。将创建一个ctrlPin。 (ctrlPin是自定义控件具有拖放方法。所以它与Mousedown,MouseMove和MouseUp事件复合)
(我很抱歉。我的帐户无法附加图片。但您可以通过此链接看到屏幕截图。)
- 问题点击>>> http://imgur.com/3lxfB2b 和http://imgur.com/mG6L5lD
在mainFrom.vb中将创建我的自定义控件的新瞬间。
[MainForm.vb]
Private Sub picBar_Day01_MouseClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles picBar_Day01.MouseClick
Dim ctrlPin_01 As New ctrlPin(picBar_Day01, e.Location, "Break")
ctrlPin_01.Ctrl_mouseDown(Me)
ctrlPin_01.Ctrl_mouseMove(Me)
ctrlPin_01.Ctrl_mouseUp(Me)
ctrlPin_01.Location = New System.Drawing.Point(e.Location.X , e.Location.Y )
lblCtrlX.Text = ctrlPin_01.Location.X
Me.Controls.Add(ctrlPin_01)
End Sub
在我的自定义控件(ctrlPin.vb)中有三个拖放事件:mouseDown,mouseMove和mouseUpEvent。我需要调用Mainfrm.vb中的All events,所以我创建了通过addHandle发送mainform然后通过addressOf调用event的方法。
[ctrlPin.vb]
Public Sub Ctrl_mouseMove(ByVal frm As Form)
AddHandler frm.MouseMove, AddressOf ctrlPin_MouseMove
End Sub
AddressOf会像这样调用自定义控件的内部事件。
Private Sub ctrlPin_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If isDrag Then
Me.Left += e.X - Me.m_intPosPin.X
End If
End Sub
好的,可以通过点击mainForm来拖动和移动。但是,如果我将光标移到自定义控件之外,那么它就会消失。
解决: 我只是使用Capture函数来检测鼠标而不是内部布尔标志(isDrag) 在mainForm.vb中,只需创建新的自定义控件即时。
[mainForm.Vb]
Private Sub picBar_Day01_MouseClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles picBar_Day01.MouseClick
Dim ctrlPin_01 As New ctrlPin(picBar_Day01, e.Location, "Break")
Me.Controls.Add(ctrlPin_01)
End Sub
重要的是,在客户控制(ctrlPin.vb)中,只需将标志变量(isDrag)更改为" Me.Capture"。 它的工作!!!!!!
[ctrlPin.vb]
Private Sub ctrlPin_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
If Me.Capture Then
Me.Left += e.X - Me.m_intPosPin.X
End If
End Sub