2013-06-06 12 views
6

Creare un nuovo modulo con tre finestre di immagini. Questo codice è destinato a disegnare un bordo quando il mouse entra nella casella immagine e rimuoverlo quando lascia. È incoerente nei risultati. A volte disegna/rimuove il bordo, a volte no. Questo codice non è complesso. Utilizzo di VS 2012.PictureBox MouseEnter/MouseLeave Eventi non attivati ​​

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

I controlli di 'PictureBox' hanno controlli figlio all'interno? – EkoostikMartin

+0

No, non lo fanno. Nuova forma, aggiungere tre caselle immagine e il codice sopra. – dbasnett

+0

Quale piattaforma; Winforms, WPF? – OneFineDay

risposta

1

È anche possibile riprodurre il problema. Così, ampliando le osservazioni di cui sopra di "disegnare qualcos'altro" invece di utilizzare la proprietà del Picturebox, vorrei suggerire questo approccio veloce e sporco:

  • Utilizzare un oggetto RectangleShape, quello fornito dal VisualBasic Powerpack 3.0 addon. Metti semplicemente uno di quelli nella stessa forma in cui si trova PictureBox e rendilo invisibile (visibile = falso).

  • il codice è anche facile:

    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

L'OP non sembra voler farlo in un altro modo, perché è un po 'facile, ci sono alcuni modi per fare con la grafica. Il problema è come farlo attivando BorderStyle. Ho provato con 1 PictureBox e funziona benissimo ma con 3 PictureBox, c'è qualcosa di strano, forse spiegato da Hans Passant. –

+0

@KingKing Come accennato nei commenti sopra, so che ci sono soluzioni alternative. Volevo sapere perché. Nella documentazione di BorderStyle non si parla di effetti collaterali. Perché funziona sempre se gli eventi vengono persi quando "la finestra nativa viene distrutta e ricreata". – dbasnett

+0

@KalaNag - se gli eventi non vengono sparati, che assomiglia a quello che sta succedendo, allora questo non funzionerà. – dbasnett

0

bisogno di aiuto da Modulo MouseEnter Evento ..

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

ho seguito KalaNag idea mettendo la mia picturebox all'interno di un pannello e gestito l'evento sul pciturebox facendo così

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; 

    } 

Ho modificato la dimensione del controllo perché altrimenti la picturebox continua a sfarfallare quando il mouse sorvola i bordi mentre il cursore entra e esce indefinitamente poiché i bordi cambiano le dimensioni del controllo.

Funziona come un fascino!

Problemi correlati