2013-06-06 5 views
6

Utwórz nowy formularz z trzema ramkami graficznymi. Ten kod służy do rysowania obramowania, gdy mysz wchodzi do ramki graficznej i usuwa ją, gdy opuszcza. Jest niespójne w wynikach. Czasami rysuje/usuwa granicę, czasem nie. Ten kod nie jest skomplikowany. Używając VS 2012.PictureBox MouseEnter/MouseLeave Events not Firing

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

Czy kontrolki "PictureBox" mają w nich elementy podrzędne? – EkoostikMartin

+0

Nie, nie robią tego. Nowy formularz, dodaj trzy ramki obrazkowe i powyższy kod. – dbasnett

+0

Jaka platforma; WinForm, WPF? – OneFineDay

Odpowiedz

1

Mogę również odtworzyć problem. Tak, rozszerzając się na komentarzach powyżej o „rysowanie czegoś innego”, a nie za pomocą właściwości PictureBox jest, pozwól mi zaproponować to szybki i brudny podejście:

  • użyć obiektu RectangleShape, to dostarczane przez VisualBasic Powerpack 3.0 dodatku. Po prostu umieść jedną z nich w tej samej formie, w której znajduje się twój PictureBox, i spraw, aby była niewidoczna (widoczna = fałsz).

  • Kod jest również proste:

    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 nie chce tego robić w inny sposób, ponieważ jest trochę łatwy, jest kilka sposobów na zrobienie tego z grafiką. Problem polega na tym, jak to zrobić, przełączając BorderStyle. Testowałem z 1 PictureBoxem i działa świetnie, ale z 3 PictureBoxami jest coś dziwnego, może wytłumaczyć Hans Passant. –

+0

@KingKing Jak wspomniano w komentarzach powyżej wiem, że istnieją obejścia. Chciałem wiedzieć dlaczego. W dokumentacji BorderStyle nie ma wzmianki o żadnych skutkach ubocznych. Dlaczego kiedykolwiek zadziała, jeśli zdarzenia zostaną utracone, gdy "okno rodzime zostanie zniszczone i odtworzone". – dbasnett

+0

@KalaNag - jeśli zdarzenia nie są uruchamiane, co wygląda na to, co się dzieje, to nie zadziała. – dbasnett

0

Potrzebujesz pomocy z formularza MouseEnter Event ..

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

Śledziłem KalaNag ideę poprzez umieszczenie mojego PictureBox wewnątrz panelu i poradził sobie z wydarzeniem na pciturebox, robiąc to tak:

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; 

    } 

Zmieniłem rozmiar kontrolki, ponieważ w przeciwnym razie skrzynka obrazowa będzie migać, gdy mysz unosi ramkę podczas wkraczania kursora i pozostawia ją w nieskończoność, ponieważ granice zmieniają rozmiar kontrolki.

Działa jak urok!