私はさまざまなビットマップとアイコンのためのpng形式のまたは生のバイナリデータを表現できるデータベースからいくつかのblobデータを読み込むアプリケーションを持っています。これは格納されているstd::vector<unsigned char>
メモリバッファからHBITMAPを作成する
私はCImageList
オブジェクトを使用しています。ツリービュー、ツールバーイメージなどでさまざまなイメージを表示していますが、メモリ内のデータからビットマップを作成すると、今、私は単に一時的なファイルへのベクトルで)(データを書き込み、その後にそれをリードバックするためにLoadImageを使用して、そこからHBITMAPを作成していますこの問題を回避するには
std::vector<unsigned char> bits;
HBITMAP hbitmap = CreateBitmap(16, 16, 1, 32, bits.data());
:以下のようなものをやって。これは完全には動作しますが、それは間違いなく恥知らずのハックです。
私はオンラインで見てきましたが、メモリからhbitmapを「適切に」作成する方法の本当に良い例は見つかりませんでした。これらのビットマップを作成してファイルI/Oなしでイメージリストに追加し、可能であればデータをコピーする量を制限したいと考えています。
これを行うための最善の方法を探していて、明らかにウィンドウズ固有のコードは問題ありません。
UPDATE:JDVの答えに基づいて
私はCreateCompatibleBitmap、CreateDIBitmap、そして最終的にCreateDIBSectionで遊んで始まりました。これらのすべてが以前のファジービットマップの代わりに素敵な黒のビットマップを作成してしまったので、私はもう一度何か間違ったことをしているに違いない。このビットマップの作成は画面dcやウィンドウの概念がないオブジェクトで行われているので、GetDC(NULL)
とCreateCompatibleDC(NULL)
は良いです。サンプルコード:私は今、もちろん完全HBITMAPを避け、CBitmap
クラスを直接操作することにより、おそらくこれについて移動する簡単な方法があるように持っている考えています
BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biHeight = 16;
bmi.bmiHeader.biWidth = 16;
bmi.bmiHeader.biPlanes = 1;
HDC dc = CreateCompatibleDC(NULL);
HBITMAP hbitmap = CreateDIBSection(dc, &bmi, DIB_RGB_COLORS, (void**)blobData.GetMember<FILEDATAFIELD_DATA>().data(), NULL, 0);
?イメージをCImageList
に追加することになると、とにかくCBitmap::FromHandle(HBITMAP hbitmap, COLORREF mask)
を使用しています。誰もstd::vector<unsigned char>
からCBitmap
オブジェクトを初期化する簡単な方法を知っていますか?
ごとに変更新しい意味に質問を編集しないでください。新しい質問を投稿して古い質問にリンクしてください。 –
申し訳ありませんが、私はGDIの土地に入っていた唯一の理由は、私がCImageListに追加するときにFromHandleメソッドを使用していたことに気付いた... MFC CBitmapは単にGDI呼び出しをラップします。 – AJG85