リソースのビットマップをHBITMAP型に変換する

[戻る]
TURARA 2003/12/10(水) 02:56:08
はじめまして、TURARAという者です。
プログラム開発初心者のために分かりにくいところもありますが、
最後まで読んでもらえましたら幸いです。

今回はDIBSectionを利用して、
リソースのビットマップをHBITMAP型に変換するやり方を探しています。

リソースからのビットマップの取り出す方法は分かるのですが、
そのビットマップをHBITMAP型に変換できません。
CreateDIBSection関数を利用して、
ファイルからビットマップを読み込む方法は分かります。

もしご存知方がおりましたら、教えて頂きたいと思い書き込みました。
よろしくお願いします。


開発環境は
WinXP
Microsoft Visual C++ 6.0
です。

wood 2003/12/10(水) 06:18:45
CreateDIBSectionの戻り値がHBITMAP型になっているけどこれじゃダメなの?

n [E-Mail] 2003/12/10(水) 10:58:38
LoadImage()にLR_CREATEDIBSECTIONを渡して戻り値をHBITMAPにキャスト、では?

TURARA 2003/12/11(木) 10:42:06
ご返答ありがとうございます。
言い方が悪くうまく伝わらなかったようですが、
CreateDIBSection関数を利用して、
もともとプログラムにリソースされている
CBitmap型のビットマップ(IDB_BULE)を
HBITMAP型に変換したかったのですが、
CreateDIBSection関数の仮引数の設定の仕方がよく分からないです…(汗)

今のところ、プログラムはこのようになっています。
CBitamap myBitmap;
myBitmap.LordBitmap(IDB_BULE);
HBITMAP hBmp;
unsigned char *dispData;

//hBmp = (HBITMAP)myBitmap;→コレでは無理ですよね^^;

BITMAPINFO bmih;         //IDB_BULEの画像情報を入力してみます
bmih.biSize = sizeof(BITMAPINFOHEADER);
bmih.biWidth = 40;
bmih.biHeight = 40;
bmih.biPlanes = 1;
bmih.biBitCount = 8;
bmih.bmiHeader.biCompression = BI_RGB;
bmih.bmiHeader.biSizeImage = 0;
bmih.bmiHeader.biXPelsPerMeter = 0;
bmih.bmiHeader.biYPelsPerMeter = 0;
bmih.bmiHeader.biClrUsed = 0;
bmih.bmiHeader.biClrImportant = 0;

hBmp = CreateDIBSection(NULL,(BITMAPINFO *)&bmih,   //HBITMAP型に変換?
    DIB_RGB_COLORS,(void **)&dispData,NULL,0);

CreateDIBSection関数の4つ目仮引数は、
ビットマップの実体が格納されている場所へのポインタを
格納する変数へのポインタを指定します。
となっているのですが、
結局、CBitmap型のビットマップ(IDB_BULE)はどこで設定したらよいのでしょう?
分かりにくい例でごめんなさい。
設定の仕方をご存知の方はぜひ教えてもらえませんか?


LoadImage関数は調べてみましたが、
リソースでは設定できないようですが、
そのところはどうなのでしょうか?

sugar 2003/12/11(木) 11:47:54
> CBitmap型のビットマップ(IDB_BULE)を
> HBITMAP型に変換したかったのですが、
> 
ということであれば、
CBitmapはoperator HBITMAPが定義されているので、

HBITMAP hBmp (HBITMAP)myBitmap;

でいいと思うのですが。
CreateDIBSectionにこだわる理由がありますか?

sugar 2003/12/11(木) 11:49:59
> HBITMAP hBmp (HBITMAP)myBitmap;

HBITMAP hBmp = (HBITMAP)myBitmap;
※代入演算子が抜けてしまいました。

n [E-Mail] 2003/12/11(木) 12:42:59
イメージバイト配列が欲しいのでしょうか?

これでリソースからビットマップをDIB形式でロードできます。
 HBITMAP hbitmap=(HBITMAP)::LoadImage(
  アプリケーションのインスタンスハンドル,
  MAKEINTRESOURCE(リソースID),IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION);

イメージバイト配列へのポインタはDIBSECTIONと::GetObject()で取得できます。
 DIBSECTION dibsection;
 ::GetObject(hbitmap,sizeof(dibsection),&dibsection);
 //dibsection.dsBm.bmBitsがイメージ配列へのポインタ

CBitmapにするにはこのようにできます。
 CBitmap cbitmap;
 HBITMAP hbitmap=(HBITMAP)::LoadImage(〜);
 cbitmap.Attach(hbitmap);

古いスレッドには追加発言できません。