Frage

Ich versuche, von einer Hbitmap zu einer GDI+ Bitmap zu bitblt. Ich habe es versucht, aber nichts passiert:

Bitmap Buffer = New Bitmap(608, 392)
Graphics BufferGraphics = Graphics.FromImage(Buffer);
IntPtr hBufferDC = BufferGraphics.GetHdc();

...

BitBlt(hBufferDC, x, y, width, height, hInputDC, 0, 0, SRCCOPY);

BEARBEITEN: Anscheinend funktioniert der HDC nicht, wenn ich ihn erwerbe und dann viel später mit Bitblt benutze. Ich musste sicherstellen, dass der HDC noch gültig war. Dies ist die Lösung:

Bitmap Buffer = New Bitmap(608, 392)
Graphics BufferGraphics = Graphics.FromImage(Buffer);

...

IntPtr hBufferDC = BufferGraphics.GetHdc();
BitBlt(hBufferDC, x, y, width, height, hInputDC, 0, 0, SRCCOPY);
BufferGraphics.ReleaseHdc(hBufferDC);

Weiß jemand, warum diese Änderung notwendig ist? Warum könnte es nicht funktionieren, ein HDC zu verwenden, das früher wie im ersten Beispiel geworden ist?

War es hilfreich?

Lösung

Überprüfen Sie die Stichprobe am Ende davon Seite auf Pinvoke.net. Die zusätzlichen Anrufe bei CreateCompatibledC und SelectObject können Ihre Beispiele zum Laufen bringen.

Alternativ können Sie in Betracht ziehen, Grafiken zu verwenden.

Aktualisieren (Aufgrund aktualisierter Frage)
Ich weiß nicht genau, warum der HDC nach einer Weile ungültig wird, aber nach Angaben Msdn Sie rufen GETHDC und ReleaseHDC in Paaren an und gruppieren die Aufrufe zum GDI+ -Code zwischen ihnen: "Anrufe an die Gethdc- und ReleaseHDC -Methoden müssen paarweise angezeigt werden. Während des Umfangs eines Gethdc- und ReleaseHDC -Methodenpaars tätigen Sie normalerweise nur Aufrufe an GDI -Funktionen. "

Laut der Dokumentation ist die Art und Weise, wie Sie es in Ihrem zweiten Beispiel getan haben, der richtige Weg und Sie sollten keine Werte aus der GETHDC -Methode zwischenspeichern und wiederverwenden.

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