ピクチャコントロールにビットマップを表示するには?

解決


けーぼう  2004-09-13 22:30:58  No: 54482

VC初心者のけーぼうと申します。
画像データ(_buffer変数)を、CBitmapに変換し、ピクチャコントロールに表示しようとしています。
HPで調べて、以下のボタンクリックイベントのハンドラにコードを書いたのですが、ピクチャコントロールには何の変化もおきません。
何が問題なのか悩んでいます。

bmp = new CBitmap;
bmp->CreateBitmap(SCREEN_WIDTH, SCREEN_HEIGHT, 1, 4, _buffer);

CWnd* wnd = GetDlgItem(IDC_PICTURE);
CDC DC;
CDC* pDC = wnd->GetDC( );

DC.CreateCompatibleDC(pDC);
CBitmap* pOld;
pOld = DC.SelectObject(bmp);
pDC->BitBlt(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, &DC, 0,0, SRCCOPY);
DC.SelectObject( pOld );
wnd->ReleaseDC( pDC );

ちなみに、CreateCompatibleDC, BitBltは、正常終了値(非ゼロ)を返しています。
画像データ(_buffer変数)は、以下のコードで正しくビットマップファイルに
変換されます。

BITMAPFILEHEADER fh;
BITMAPCOREHEADER ch;
FILE * fp;

fh.bfType = *(WORD*)"BM";
fh.bfReserved1 = 0;
fh.bfReserved2 = 0;
fh.bfOffBits = (sizeof(fh) + sizeof(ch));
fh.bfSize = fh.bfOffBits + sizeof(_buffer);
ch.bcBitCount = 32;
ch.bcWidth = SCREEN_WIDTH;
ch.bcHeight = SCREEN_HEIGHT;
ch.bcPlanes = 1;
ch.bcSize = sizeof(ch);
fp = fopen(filePath, "wb");
fwrite(&fh, 1, sizeof(fh), fp);
fwrite(&ch, 1, sizeof(ch), fp);
fwrite(buffer, 1, SCREEN_WIDTH * SCREEN_HEIGHT * 4, fp);
fclose( fp );


シャノン  2004-09-13 22:41:48  No: 54483

絵にしろ文字にしろ、何かを描画する場合、描画すべきタイミングというのがあります。
MFC ならば、OnPaint や OnDraw の中で、描画処理を行うべきです。
ボタンをクリックしたときには描画の準備だけしておいて、
準備が終わったら Invalidate メソッドでも呼んで強制的に再描画させ、
描画処理の中で、準備しておいた絵を表示することになるでしょう。


けーぼう  2004-09-13 23:03:26  No: 54484

シャノンさん

早々のレスありがとうございます。
描画処理は、OnPaint等に記述しないといけないんですね。

CWnd* wnd = GetDlgItem(IDC_PICTURE);
CDC DC;
CDC* pDC = wnd->GetDC( );

DC.CreateCompatibleDC(pDC);
CBitmap* pOld;
pOld = DC.SelectObject(bmp);
pDC->BitBlt(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, &DC, 0,0, SRCCOPY);
DC.SelectObject( pOld );
wnd->ReleaseDC( pDC );

上記の処理を、OnPaintの以下の位置に移動させました。
また、ボタンクリックイベントは、CBitmapを作成し、CTestDlg::Invalidate()をコールするだけに変えました。
しかし、結果は変わりませんでした。
キャプチャコントロールの設定に問題があるのでしょうか。。

void CTestDlg::OnPaint() 
{
  if (IsIconic())
  {
    ...
  }
  else
  {
    // ここに移動して試してみました[1]
    CDialog::OnPaint();
    // ここに移動して試してみました[2]
  }
}


けーぼう  2004-09-13 23:04:33  No: 54485

訂正です。
×キャプチャコントロール
○ピクチャコントロール


けーぼう  2004-09-14 00:03:29  No: 54486

一点、コードに間違いがみつかりました。
○誤
bmp->CreateBitmap(SCREEN_WIDTH, SCREEN_HEIGHT, 1, 4, _buffer);
○正
bmp->CreateBitmap(SCREEN_WIDTH, SCREEN_HEIGHT, 1, 32, _buffer);

しかし、これを修正しても状況はかわりませんでした。

bmp->GetBitmap(&bmpInfo);
で、bmpのヘッダ情報を覗いてみたところ、bmBitsの値が0x00000000でした。
これは、ビットマップが正しく初期化されていないということでしょうか?


けーぼう  2004-09-14 02:21:06  No: 54487

CreateBitmapを使うのをやめ、LoadBitmapを使用したところ、ピクチャコントロールに画像を表示することができました。
CreateBitmapの使用方法に問題があったようです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加