Starkes Flackern beim Zeichnen eines Bildes
-
Hallo,
ich möchte gerne eine Bitmap auf dem Bildschirm zeichnen und mit dem Stift auf dem PDA verschieben (ich arbeite mit dem Compact Framework). Das funktioniert prinzipiell auch, nur sehe ich ein starkes Flackern beim Repaint. Double buffering hab ich an sich schon realisiert, aber das ändert an der Problematik nichts. Mein Code:
protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); if(bm!=null) { System.Drawing.Graphics memDC = System.Drawing.Graphics.FromImage(bm); int newWidth = (bm.Width/100)*zoomFactor; int newHeight = (bm.Height/100)*zoomFactor; memDC.DrawImage(bm,0,0); System.Drawing.Graphics clientDC = this.CreateGraphics(); clientDC.DrawImage(bm,new Rectangle(posX,posY,newWidth,newHeight),new Rectangle(0,0,bm.Width,bm.Height),System.Drawing.GraphicsUnit.Pixel); memDC.Dispose(); clientDC.Dispose(); } } private void MainForm_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { startX = e.X; startY = e.Y; } private void MainForm_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { int deltaX = e.X-startX; int deltaY = e.Y-startY; startX=e.X; startY=e.Y; posX+=deltaX; posY+=deltaY; this.Update(); this.Invalidate(); }
Ich hab schon alle Möglichkeiten in der MouseMove-Methode ausprobiert, Refresh, Invalidate, Update etc. aber nichts hilft. Was mache ich falsch?
Vielen Dank !
-
In das Panel, oder wo du zeichnest musst du die Methode
OnPaintBackground
überschreiben (mit leerem Rumpf).
Das Flackern kommt daher, das der Inhalt erst immer gelöscht wird, was
ja bei einer Bitmap nicht nötig wäre.Jockel
-
Ah ja, genau danach habe ich gesucht. Das entspricht diesem dritten Parameter bei der InvalidateRect-Funktion in der WinAPI, da kann man auch angeben, ob der Hintergrund gelöscht werden soll.
Ich zeichne nicht in ein Panel, sondern direkt in eine Form. Gibt es da dieses Event auch? Oder macht es mehr Sinn, wenn ich ein Panel als Zeichenfläche verwende?Vielen Dank !
-
OK, das hab ich jetzt mal gemacht. Funktioniert auch an sich wunderbar. Nur jetzt habe ich das Problem, dass beim Programmstart das Fenster nicht neu gezeichnet wird, das heißt der bisherige Inhalt wird nicht gelöscht logischerweise. Dazu kommt, dass ich beim Verschieben der Bitmap natürlich auch die bisherigen Bitmaps auf dem Bildschirm nach wie vor sehe. Ich möchte natürlich trotzdem um meine Bitmap rum einen weißen Rand haben. Ich hoffe diese Erklärung war jetzt einigermaßen verständlich
Kann ich dieses Problem irgendwie umgehen?Vielen Dank !