Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Graphics fa le bizze
Forum - C# / VB.NET - Graphics fa le bizze

Avatar
Question (Normal User)
Rookie


Messaggi: 58
Iscritto: 14/12/2010

Segnala al moderatore
Postato alle 14:48
Sabato, 28/05/2011
EDIT:
modifico il topic per dirvi che ho notato che se uso pbImage.CreateGraphics invece dell'immagine diretta funge più di una volta ma la prima no O.o
Se qualcuno può spiegarmi esattamente cosa succede mi fa un gran favore :-|


Ciao a tutti,
avrei un problema con la classe graphics in quanto, dopo la prima volta, smette di disegnare sopra l'immagine di una picturebox.
Deve dipingere sopra il controllo due frecce stilizzate quando il mouse entra nella sua area per poi toglierle quando ne esce, solo che dopo la prima cancellazione smette di farlo 8-|

Vi allego il codice (i simboli vengono disegnati a destra e a sinistra della picturebox, per quello c'è il controllo sul padding):
Codice sorgente - presumibilmente VB.NET

  1. Private Sub pbImage_MouseEnter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles pbImage.MouseEnter
  2.         If pbImage.Image IsNot Nothing Then
  3.             Try
  4.                 DrawChangeImageArrow(My.Resources.Actions_arrow_left_icon, New Rectangle(0, 225, 46, 46), New Rectangle(-5, 225, 46, 46)) 'left arrow
  5.                 DrawChangeImageArrow(My.Resources.Actions_arrow_right_icon, New Rectangle(588, 225, 46, 46), New Rectangle(593, 225, 46, 46)) 'right arrow
  6.             Catch ex As Exception
  7.                 MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
  8.             End Try
  9.         End If
  10.     End Sub
  11.  
  12.  Private Sub pbImage_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles pbImage.MouseLeave
  13.         If pbImage.Padding.Left = 0 Then ChangeImage() Else pbImage.Refresh() 'remove the arrows
  14.     End Sub
  15.  
  16. Private Sub DrawChangeImageArrow(ByVal ArrowImage As Image, ByVal EllipseRect As Rectangle, ByVal ImageRect As Rectangle)
  17.         Dim Painter As Graphics
  18.         If pbImage.Padding.Left = 0 Then Painter = Graphics.FromImage(pbImage.Image) Else Painter = pbImage.CreateGraphics 'remember .left = .right always
  19.         Using Painter
  20.             With Painter
  21.                 .SmoothingMode = Drawing2D.SmoothingMode.HighQuality
  22.                 .InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
  23.                 .FillEllipse(Brushes.Black, EllipseRect)
  24.                 .DrawImage(ArrowImage, ImageRect)
  25.             End With
  26.         End Using
  27.     End Sub


N.B. ChangeImage() è una procedura che cambia l'immagine a pbImage, non l'ho riportata perché è abbastanza lunga e in teoria non dovrebbe essere la causa del problema, se volete non ho comunque problemi a postarla

Ultima modifica effettuata da Question il 28/05/2011 alle 20:02


Ma ovviamente x64
PM
Avatar
Ale96 (Member)
Pro


Messaggi: 132
Iscritto: 06/04/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 22:18
Sabato, 28/05/2011
Secondo me quando togli il mouse se changeimage restituisce nothing l'immagine della picturebox sarà nulla, quindi appena ci rimetti sopra il mouse il computer verifica la condizione che risulterà falsa e non disegnerà nulla.

pbImage.Image non è nullo e ChangeImage() è una sub, non una funzione - Question - 29/05/11 13:28


Qualunque bug sufficientemente avanzato è indistinguibile da una caratteristica del software.

Ci sono 10 tipi di persone al mondo: chi capisce il codice binario e chi no.

I veri utenti non usano mai la funzione “Help”.
(tutti anonimi)
PM