Graphics.DrawImage nicht immer die ganze Bitmap Farbe?
Frage
Ich habe in ein seltsames Problem führen, wenn Graphics.DrawImage
verwenden.
Wenn e.Graphics.DrawImage(Image, Point)
in OnPaint
mit der Steuer ein Bitmap ‚Puffer‘ zu malen, scheint es, dass Teile des Bildes weggelassen. Der Puffer wird in einer Hilfsmethode bevölkert, die ein Bitmap
Verwendung konstruierte daraus direkt auf die Graphics
zieht. Wenn die Steuerfarben wird die zwischengespeicherte Bitmap auf dem Steuerelement gezeichnet.
Nichts erscheint auf dem Bitmap selbst weggelassen zu werden, denn wenn ich die Bitmap auf Disc gespeichert und untersuchte sie, es ist alles da war. (Siehe Bilder unten)
Dies ist, was die Bitmap-Puffer wie folgt aussehen:
(Quelle: zachjohnson.net )
Das, was auf dem Steuerelement angezeigt wird:
(Quelle: zachjohnson.net )
Das ist alles, was ich in OnPaint
tue:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (this.bufferInvalid)
{
this.UpdateBuffer();
}
if (this.buffer != null)
{
e.Graphics.DrawImage(this.buffer, Point.Empty);
}
}
Lösung
Wenn OnPaint genannt wird, hat Windows eine ungültige Region, die es ermöglicht Malerei in und alles andere abgeschnitten wird. Wenn Sie eine rechteckige Steuer aktualisiert werden mögen, sollten Sie InvalidateRect in dem Windows-API-Aufruf das gesamte Rechteck Teil der ungültigen Region, um sicherzustellen, ist. OnPaint wird automatisch aufgerufen werden, wenn sie den Teil der Steuerung ist, die ungültig ist.
Andere Tipps
Sie könnten ein paar verschiedene Dinge ausprobieren.
- Geben Sie den Code "UpdateBuffer"
- Sie eine bitmap.save (das heißt buffer.save) nach dem updatebuffer Anruf und überprüfen, was die Bitmap aussieht.
- sicherzustellen, dass alle Kontrollen zuerst gezogen wurden und dass keine Kontrollen gezogen werden transparent etc ..
- nehmen Sie den Code von „OnPaint“ und „Update-Puffer“ und es in einer separaten Projekt Prüfung stellen, um zu sehen, ob es funktioniert.
- nehmen "base.onpaint" und überprüfen, was passiert,
- einen Anruf versuchen statt bitmap.drawimage bitmap.drawimageunscaled
- versuchen, mit neuen Punkt (0,0) anstelle von point.empty (benötigt sehr viel Schuss aber ya weiß ja nie ...)
Tonnen von Optionen für das Debuggen diese, nur eine Frage der Eingrenzung.
Schauen Sie sich die System.Windows.Forms.ControlStyles.ResizeRedraw