2013-06-06 2 views
6

세 개의 그림 상자가있는 새 폼을 만듭니다. 이 코드는 마우스가 그림 상자로 들어 와서 떠날 때 테두리를 그릴 때 사용됩니다. 결과에 일관성이 없습니다. 때로는 테두리를 그립니다. 때로는 테두리를 그립니다. 이 코드는 복잡하지 않습니다. VS 2012 사용.PictureBox MouseEnter/MouseLeave 발생하지 않는 이벤트

Private Sub PictureBox_MouseEnter(sender As Object, e As EventArgs) _ 
    Handles PictureBox1.MouseEnter, PictureBox2.MouseEnter, PictureBox3.MouseEnter 
    Dim pb As PictureBox = DirectCast(sender, PictureBox) 
    pb.BorderStyle = BorderStyle.FixedSingle 
    ' Debug.WriteLine("E " & pb.Name) 
End Sub 

Private Sub PictureBox_MouseLeave(sender As Object, e As EventArgs) _ 
    Handles PictureBox1.MouseLeave, PictureBox2.MouseLeave, PictureBox3.MouseLeave 

    Dim pb As PictureBox = DirectCast(sender, PictureBox) 
    pb.BorderStyle = BorderStyle.None 
    ' Debug.WriteLine("X " & pb.Name) 
End Sub 
+0

'PictureBox' 컨트롤에는 그 안에 자식 컨트롤이 있습니까? – EkoostikMartin

+0

아니요. 새로운 양식, 위에 세 개의 그림 상자와 코드를 추가하십시오. – dbasnett

+0

어떤 플랫폼입니까? Winforms, WPF? – OneFineDay

답변

1

또한 문제를 재현 할 수 있습니다.

  • 사용하십시오 RectangleShape 객체의 VisualBasic Powerpack 3.0 부가 기능이 제공하는 하나 : 그래서, "다른 뭔가를 그리기"대신에 PictureBox의 속성을 사용하는 방법에 대한 위의 의견을 확장, 내가이 신속하고 더러운 방법을 제안 할 수 있습니다. 단순히 그 중 하나를 귀하의 PictureBox가있는 동일한 양식에 넣고 보이지 않게합니다 (visible = false).

  • 코드는 간단하다

    Public Class Form1 
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
         Me.RectangleShape1.Location = New Point(Me.PictureBox1.Left - 1, Me.PictureBox1.Top - 1) 
         Me.RectangleShape1.Size = New Size(Me.PictureBox1.Width + 1, Me.PictureBox1.Height + 1) 
        End Sub 
    
        Private Sub PictureBox1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseEnter 
         Me.RectangleShape1.Visible = True 
        End Sub 
        Private Sub PictureBox1_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles PictureBox1.MouseLeave 
         Me.RectangleShape1.Visible = False 
        End Sub 
    End Class 
    
+0

조금 쉽지 않기 때문에 OP가 다른 방식으로하고 싶지 않은 것처럼 보입니다. 그래픽을 사용하는 몇 가지 방법이 있습니다. 문제는 BorderStyle을 토글 링하여이를 수행하는 방법입니다. 나는 1 개의 PictureBox로 테스트 해 보았지만 3 개의 PictureBox로 훌륭하게 작동합니다. Hans Passant가 설명하는 이상한 것이 있습니다. –

+0

@ KingKing 위의 의견에서 언급 한대로 해결 방법이 있음을 알고 있습니다. 나는 이유를 알고 싶었다. BorderStyle 설명서에는 부작용에 대한 언급이 없습니다. "네이티브 윈도우가 파괴되어 다시 만들어지면 이벤트가 손실되면 왜 작동합니까?" – dbasnett

+0

@KalaNag - 이벤트가 발생하지 않는 경우 발생하는 상황 인 경우 작동하지 않습니다. – dbasnett

0

내가 패널 내부에 내 PictureBox를 넣어 KalaNag 아이디어를 따라

Dim pb As PictureBox = New PictureBox 

Private Sub Form1_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter 
    pb.BorderStyle = BorderStyle.None 
End Sub 

Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove 

    pb = PictureBox1 
    pb.BorderStyle = BorderStyle.FixedSingle 

End Sub 
0

.. 당신의 양식 MouseEnter 이벤트에서 약간의 도움이 필요하고 다음과 같이하여 pciturebox에서 이벤트를 처리했습니다.

private void PictureBox_MouseEnter(object sender, EventArgs e) 
    { 
     PictureBox control = sender as PictureBox; 

     (control.Parent as Panel).Width = 20; 
     (control.Parent as Panel).Height = 20; 
     (control.Parent as Panel).BorderStyle = BorderStyle.Fixed3D; 

    } 

    private void PictureBox_MouseLeave(object sender, EventArgs e) 
    { 
     PictureBox control = sender as PictureBox; 

     (control.Parent as Panel).Width = 18; 
     (control.Parent as Panel).Height = 18; 
     (control.Parent as Panel).BorderStyle = BorderStyle.None; 

    } 

컨트롤의 크기가 변경 되었기 때문에 컨트롤의 크기가 변경되어 커서가 무기한으로 들어가고 떠날 때 마우스가 테두리를 가리키면 그림 상자가 계속 깜박입니다.

매력처럼 작동합니다!

관련 문제