1

buildtexture という名前の関数で、OpenGL のイメージとビルド テクスチャをロードし、CreateDIBSection を呼び出すと、ビットマップが作成されます。関数 buildtexture が通常のメンバー関数として呼び出された場合、問題はありません。しかし、スレッドでこのメンバー関数を呼び出した場合、CreateDIBSection は 0 を返し、失敗したことを意味します。また、GetLastError でさえ、CreateDIBSection の呼び出し後に 0 を返しました。スレッドには、ビットマップを作成するのに十分なスペースがないと思います。そして、私はこの問題を解決する方法がわかりません。誰でも私を助けることができますか?どうもありがとうございました!

4

2 に答える 2

1

メモリ不足エラーである可能性は低いです。

CreateDibSection には HDC が必要です。どこで入手しましたか? 別のスレッドがそれを取得して、それをあなたに渡しましたか?

DC を取得したスレッド以外のスレッドで DC を使用することは合法です。ただし、DC を複数のスレッドで使用する場合は、DC の使用がシリアル化されていることを確認する必要があります。

DC を試して使用するときに DC がまだ有効であること、および一度に 1 つのスレッドだけが使用しようとしていることを確認してください。

于 2009-12-29T02:04:08.457 に答える
0

あなたが持っているその障害は、CreateDIBSection が新しい Hdc を削除する前に Hdc を削除しないことを意味します。しかし、どうやって!新しい HDC とは何ですか? 変更する前にまず古い HDC を入手してください。

最初の CreateDIBSection の後、フォームのサイズ変更、フォームのクローズ、フォームの最小化が行われると、Hdc が変更されます。

その CreateDIBSectio が 0 を返す場合は、Hdc を削除する必要があります

hDib = CreateDIBSection(hDCRef, bi, DIB_RGB_COLORS, lPtr, 0, 0)
if (hDib = 0) then DeleteObject hdc
if (hDib <> 0) then hBmpOld = SelectObject(hdc, hDib) 'already create not need to delete
于 2010-01-22T15:00:35.073 に答える