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:
Puffer
(Quelle: zachjohnson.net )

Das, was auf dem Steuerelement angezeigt wird:
Anzeigewert
(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);
    }
}
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top