0

私は c++ gdi gdi+ でプログラムを書いています。gdi+ API を使用すると、gdi+ ビットマップに大きな画像を描画するのが遅くなります。そこで、次の方法で描画しました。

Bitmap img(xxx);
Graphics gr(&img);
HDC dc = gr.GetHDC();
::StretchDIBits( 
    dc,
    rec.left, rec.top, 
    (rec.right - rec.left), (rec.bottom - rec.top),
    m_recRegin.left , m_recRegin.top,
    m_recRegin.right - m_recRegin.left, m_recRegin.bottom - m_recRegin.top,
    XXX, XXX, DIB_RGB_COLORS, SRCCOPY);
gr.ReleaseHDC(dc);

このコードはしばらくの間完全に実行されます。ただし、CBitmap のサイズが大きい互換性のある DC を多数作成して、システム全体のプールがいっぱいになった場合。ビットマップには何も描画できないようです。

どうしたの?コードのこの部分が失敗した場合でも、GDI+ API を使用してグラフィックスを描画できます

GetLastError() は 8 を返します。

どうもありがとう!

4

2 に答える 2

1

GetLastError() は 8 を返します

8 は「このコマンドを処理するのに十分なストレージがありません。」

そのため、GDI が実行に使用するストレージが不足しています::StretchDIBits

将来的には、コマンド ラインから次のコマンドを使用して Windows エラーを検索できますnet helpmsg <error in decimal>

于 2009-08-04T04:39:46.903 に答える
0

他の人が言ったことに加えて、グラフィックスオブジェクトはIDisposableを実装します。これは、彼らが限られたリソースを保持している可能性が高い(そして実際に保持している)ことを意味します。「gr.Dispose()」を呼び出すか、「using」ブロックに配置していることを確認してください。これを行わないと、オブジェクトがいつファイナライズされ、それらのリソースが解放されるかを決定するのはガベージコレクターに任されます。これは、グラフィックスなどのリソースを大量に消費するオブジェクトにとっては悪い習慣です。

サイズによっては、ビットマップは大量のRAMを消費する可能性があるため、リソースを大量に消費する可能性もあります。コードサンプルで使用されているビットマップがその後参照されない場合は、それらが破棄されていることも確認してください...

于 2009-11-21T17:14:19.017 に答える