Newsgroup: it.comp.lang.visual-basic
Titolo: [.NET] GDI+: AutoRedraw

Creo degli elementi grafici su un oggetto con i metodi di GDI+ (DrawLine
etc).
Per un qualunque motivo sovrappongo qualcosa alla finestra e... perdo
l'output!!
Con VB6 si impostava la proprietà AutoRedraw; con .net e GDI+ come si fa?
Un particolare inquietante: nei "101 
VB.NET
 samples" di M$ c'è _lo stesso
problema_!

Prova a invocare la routine che disegna gli elementi grafici nell'evento
OnPaint del form.
HTH
--
Corrado Cavalli
UGIdotNET - 
http://www.ugidotnet.org

 ha scritto nel messaggio
news:eW999.87755$n04.2...@twister2.libero.it...


MSDN non č chiaro ma credo che GraphicState memorizzi lo stato dei vari
oggetti contenuti nel device context (pens,brushes...) permettendoti cosě di
passare da una configurazione ad un altra, questo non č senz'altro quello
che vuoi tu.
Se non vuoi ridisegnare il background ad ogni OnPaint prova a copiare il
contenuto del DC (Graphics) il un MemoryBitmap e utilizza quello per
ridisegnare (che č poi quello che fa VB6 quando setti Autoredraw)


Scusa, ma non ho capito: l'oggetto MemoryBitmap non esiste (almeno credo).
Se creo una Bitmap e poi la riempio con Bitmap.FromHbitmap(Graphics.GetHdc)
mi da un errore.
Il ripristino (Graphics.DrawImage(Backup,0,0) č semplice.
C'č quel passaggio di mezzo che non capisco...
Non voglio ridisegnarla ad ogni Paint perché si tratta di parecchi elementi
e non vorrei rallentare troppo l'esecuzione.

 e non vorrei rallentare troppo l'esecuzione.
Secondo me, nel tuo caso, la cosa migliore è creare l'immagine e passarla
alla proprietà image di una picturebox.
Prova così:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
    Dim newimg As New Bitmap(20, 20)
    Dim grf As Graphics
    grf = Graphics.FromImage(newimg)
    grf.Clear(Color.White)
    ' Funzioni che creano l'immagine
    grf.DrawLine(New Pen(Color.Blue), 0, 0, 10, 10)
    grf.DrawEllipse(New Pen(Color.Blue), 5, 5, 10, 10)
    'Fine funzioni che creano l'immagine
    PictureBox1.Image = newimg
End Sub
Info da microsoft:
Proprietà AutoRedraw
Nessun equivalente. Per mantenere la grafica, inserire i metodi grafici
nell'evento Paint.
 Ciao
--
Marco Camplese
-Windows .Net Server (RC1)
-Visual Studio Standard (
VB.NET
)
-Framework Sp2

Grazie, č proprio quello che cercavo. Visto che te ne intendi, ne
approfitto: visto che si tratta soltanto di roba disegnata con DrawLine, mi
conviene una Bitmap o un MetaFile (o non fa differenza)?
NB: la guida l'ho letta anch'io :)

Con MemoryBitmap intendevo un bitmap che sta in memoria, in pratica disegni
in un canvas che sta in memoria e poi nell'evento Paint disegni l'immagine
nel DC del form.
Un esempio puņ chiarire meglio le cose:
 Private moMemBmp As Bitmap
'// Nell evento Load del form...
moMemBmp = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
Dim oMemDC As Graphics = Graphics.FromImage(moMemBmp)
oMemDC.DrawLine(Pens.Red, 0, 0, Me.ClientSize.Width, Me.ClientSize.Height)
oMemDC.DrawLine(Pens.Red, 0, Me.ClientSize.Height, Me.ClientSize.Width, 0)
'// Evento Paint del form
   Private Sub Form1_Paint(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
      e.Graphics.DrawImage(moMemBmp, 0, 0)
   End Sub


 conviene una Bitmap o un MetaFile (o non fa differenza)?
Secondo me se la l'immagine non č molto grande va bene anche una bitmap, con
i metafile non ho mai provato.
Valuta bene perň se č il caso di ridisegnare con l'evento Paint, usi meno
memoria e piů processore.
Ciao