PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C#] PictureBox.CreateGraphics - flackert


DraconiX
2011-11-19, 03:28:30
hiho....

ich habe ja nun mich ein wenig in C# und Windowsprogrammierung allgemein eingearbeitet. Nun will ich mir mit C# Express ein Steuerelement basteln, funktioniert auch - jedoch stoße ich da auf ein kleines Problem. Es ist ein Zeitdiagramm, welches ich mit einer Picturebox realisieren will. Leider jedoch "flakert" es und man kann quasi beim bildaufbau zusehen, kann man das irgendwie zwischenpuffern das man das fertig aufgebaute bild an die Picturebox übergibt?!? Momentan mache ich es so:


private void PaintGraph()
{
Point[] p2 = new Point[4];
Brush myBrush = new SolidBrush(Color.DarkRed);
Pen myPen_black = new Pen(Color.DarkRed, 1);

Graphics g = pictureBox1.CreateGraphics();
g.Clear(Color.LightBlue);

for (int i = 0; i < 29; i++)
{
p2[0].X = i * 5;
p2[0].Y = werte[i];
p2[1].X = (i *5) + 5;
p2[1].Y = werte[i + 1];
p2[3].X = i*5;
p2[3].Y = 0;
p2[2].X = (i*5)+5;
p2[2].Y = 0;

g.DrawPolygon(myPen_black, p2);
g.FillPolygon(myBrush, p2);
}

pictureBox1.Update();
}

PatkIllA
2011-11-19, 08:39:26
CreateGraphics ist die LowLevel Funktion, um direkt auf dem Control zu zeichen.
Für die PictureBox solltest du ein Image erstellen darauf Graphics.FromImage aufrufen, darauf zeichnen und das dann der Image Property zuweisen.
Außerdem solltest du die ganzen GDI Objekte disposen.

xxxgamerxxx
2011-11-19, 12:32:10
Klingt nach ein Fall für Double Buffering.

DraconiX
2011-11-19, 14:37:12
CreateGraphics ist die LowLevel Funktion, um direkt auf dem Control zu zeichen.
Für die PictureBox solltest du ein Image erstellen darauf Graphics.FromImage aufrufen, darauf zeichnen und das dann der Image Property zuweisen.
Außerdem solltest du die ganzen GDI Objekte disposen.

Wenn ich ein Image erstelle... dann ja so:



Image img1 = Image.FromFile("blabal.bla");



jedoch muß ich dafür ja ein externes Image vorweisen können, sonst gibt er mir ja ein Fehler aus... dann weiter:



Graphics g1 = Graphics.FromImage(img1);
....

//auf g1 Zeichnen

...
pictureBox1.Image = img1;


Ist da was falsch in meiner Denkweise?!

Klingt nach ein Fall für Double Buffering.

Nein bringt leider auch nix.

PatkIllA
2011-11-19, 14:38:31
http://msdn.microsoft.com/en-us/library/7we6s1x3.aspx

DraconiX
2011-11-19, 14:52:36
http://msdn.microsoft.com/en-us/library/7we6s1x3.aspx

Oha :freak: Dankeschön... Bitmap statt Image...

funktioniert nun tadellos:

private void PaintGraph()
{
Point[] p2 = new Point[4];
Brush myBrush = new SolidBrush(Color.DarkRed);
Pen myPen_black = new Pen(Color.DarkRed, 1);
Bitmap bitm = new Bitmap(this.Width, this.Height);
Graphics g = Graphics.FromImage(bitm);
g.Clear(Color.LightBlue);

for (int i = 0; i < 29; i++)
{
p2[0].X = i * 5;
p2[0].Y = werte[i];
p2[1].X = (i *5) + 5;
p2[1].Y = werte[i + 1];
p2[3].X = i*5;
p2[3].Y = 0;
p2[2].X = (i*5)+5;
p2[2].Y = 0;

g.DrawPolygon(myPen_black, p2);
g.FillPolygon(myBrush, p2);
}

pictureBox1.Image = bitm;
pictureBox1.Update();
g.Dispose();
}

Nun noch alles herrumrechnen das man es halt von "unten" sieht, und schwups passt alles.

Dank dir ;)