单击外部时,自定义控件的即时消失

时间:2014-11-14 04:31:05

标签: c# vb.net visual-studio mousemove

我需要制作"工作计划栏"。

在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

0 个答案:

没有答案