0

HBITMAPからGDI+ビットマップにBitBltを実行しようとしています。私はこれを試しましたが、何も起こりません:

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);

編集:どうやら、hDCを取得して、後でBitBltで使用すると、hDCが機能しないようです。hDCがまだ有効であることを確認する必要がありました。これが解決策です:

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);

この変更が必要な理由を誰かが知っていますか?最初の例のように以前に取得したhDCを使用しても機能しないのはなぜですか?

4

1 に答える 1

0

pinvoke.netのこのページの最後にあるサンプルを確認してください。CreateCompatibleDC と SelectObject への追加の呼び出しにより、サンプルが機能する可能性があります。

または、Graphics.DrawImageUnscalled の使用を検討することもできます。これにより、.Net 側でのみコードを実装でき、それでもかなり優れたパフォーマンスが得られます。

更新(質問が更新されたため)
しばらくして hDC が無効になる理由は正確にはわかりませんが、MSDNによると、GetHdc と ReleaseHdc をペアで呼び出し、それらの間で GDI+ コードへの呼び出しをグループ化します。メソッドはペアで表示する必要があります。GetHdc と ReleaseHdc メソッドのペアのスコープ中は、通常、GDI 関数の呼び出しのみを行います。」

したがって、ドキュメントによると、2 番目のサンプルで行った方法が適切であり、GetHdc メソッドの値をキャッシュして再利用するべきではありません。

于 2011-01-01T16:32:07.357 に答える