2009-08-04 5 views
0

私はプログラムをC++ gdi 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.

多くの感謝!

+1

StretchDIBits()の呼び出し後にGetLastError()によって返された値で私たちを更新してください。 – arul

答えて

1

のGetLastError()の戻り8

8 "十分でないストレージは、このコマンドを処理することが可能です。" です

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

今後は、コマンドラインからWindowsエラーを参照することができます。net helpmsg <error in decimal>

+0

ありがとう!これが起こったら、どうすればGDIのために十分な記憶容量にすることができますか? – user25749

+0

非常に多くのDCを作成しないでください。なぜたくさんのビットマップの代わりにたくさんのDCが必要なのですか? – MSN

0

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

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

関連する問題