Någorlunda flimmerfri grafik på en Windows.Forms.Panel

1. Skapa en Form, med en Panel panel1 mitt över.
2. Lägg en privat medlemsvariabel i Form1.cs-klassen så här:


Bitmap backbuffer = null;

3. Skapa en privat metod DrawTo(Graphics g) som ritar vad du vill rita på givet Graphics-objekt, t.ex.:


private void DrawTo(Graphics g)
{
int width = panel1.Width;
int height = panel1.Height;

for (int i = 0; i < width; i += 10)
g.DrawLine(
Pens.Purple,
new Point(i, 0),
new Point(width - i, height));
}

4. I panel1’s Paint event handler, fyll i:


if (backbuffer == null)
{
backbuffer = new Bitmap(panel1.Size.Width, panel1.Size.Height);
using (Graphics g2 = Graphics.FromImage(backbuffer))
DrawTo(g2);
}

e.Graphics.DrawImage(
backbuffer,
e.ClipRectangle,
e.ClipRectangle,
GraphicsUnit.Pixel);

5. Klart! Om du vill testa med/utan backbuffring, lägg till en CheckBox som jag gjort och en variabel UseBackbuffer som följer den CheckBoxen. Ändra sedan DrawImage-koden i Paint-event-handler till:


if (UseBackbuffer)
e.Graphics.DrawImage(
backbuffer,
e.ClipRectangle,
e.ClipRectangle,
GraphicsUnit.Pixel);
else
DrawTo(e.Graphics);

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s

%d bloggare gillar detta: