luni, 28 ianuarie 2008

Grafica persistenta in .NET C#

Acu' cateva zile am avut de realizat o aplicatie, pentru scoala, care sa deseneze pe suprafata unei ferestre diferite grafice. Totul parea foarte simplu si m-am pus pe treaba. Problema a aparut atunci cand pe fereastra de lucru se suprapunea o alta fereastra sau cand minimizam fereastra: graficu desenat de mine disparea. Graficul nu era persistent. In VB, PictureBox-urile aveau o proprietate Autoredraw, care odata setata pe true, rezolva problema. Aceasta proprietate NU exista in .Net C#, mediul in care lucram, iata solutia pentru problema mea:

Se creeaza un obiect Bitmap, se tine in memorie, toate desenele se fac asupra sa, si la fiecare eveniment de Paint(evenimentul apare la fiecare minimizare/maximizare, precum si la orice suprapunere cu o alta fereastra) se incarca fereastra noastra cu acest Bitmap.

Presupunem ca vrem sa desenam pe suprafata unei forme. In clasa formei adaugam un atribut Bitmap, in care vom tine graficele,desenele facute pe forma:

Bitmap m_Bitmap = null;


Pe evenimentul de load vom initializa acest obiect:

m_Bitmap = new Bitmap(this.Width,this.Height,PixelFormat.Format24bppRgb);

unde:

PixelFormat este o clasa din System.Drawing.Imaging, iar Format24bppRgb reprezinta numarul de biti pe care se vor exprima culorile. Necesita un using System.Drawing.Imaging;

In evenimentul de Paint incarcam bitmapul:

Graphics objGraphics;

objGraphics = e.Graphics;

objGraphics.DrawImage(m_Bitmap, 0, 0, this.Width, this.Height);

objGraphics.Dispose();

In acest moment tot ce trebuie sa facem este sa desenam ceva in Bitmap, Sa zicem ca executam codul urmator la evenimentul de Click a unui Buton:

Graphics objGraphics;

Pen stilou = Pens.Blue;

objGraphics = Graphics.FromImage(m_Bitmap);

objGraphics.DrawLine(stilou, 10, 10, 200,200);

objGraphics.Dispose();

this.Invalidate();


Ultima linie din cod este una importanta this.Invalidate(); deoarece forteaza apelarea evenimentului de Paint la Form.

Aplicatia este mini-minimorum, dar dorinta mea era departe de a face un Tool de desenat, ci doar de a va prezenta un exemplu prin care sa faceti grafica persistenta.


2 comentarii: