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 );
絵にしろ文字にしろ、何かを描画する場合、描画すべきタイミングというのがあります。
MFC ならば、OnPaint や OnDraw の中で、描画処理を行うべきです。
ボタンをクリックしたときには描画の準備だけしておいて、
準備が終わったら Invalidate メソッドでも呼んで強制的に再描画させ、
描画処理の中で、準備しておいた絵を表示することになるでしょう。
シャノンさん
早々のレスありがとうございます。
描画処理は、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]
}
}
訂正です。
×キャプチャコントロール
○ピクチャコントロール
一点、コードに間違いがみつかりました。
○誤
bmp->CreateBitmap(SCREEN_WIDTH, SCREEN_HEIGHT, 1, 4, _buffer);
○正
bmp->CreateBitmap(SCREEN_WIDTH, SCREEN_HEIGHT, 1, 32, _buffer);
しかし、これを修正しても状況はかわりませんでした。
bmp->GetBitmap(&bmpInfo);
で、bmpのヘッダ情報を覗いてみたところ、bmBitsの値が0x00000000でした。
これは、ビットマップが正しく初期化されていないということでしょうか?
CreateBitmapを使うのをやめ、LoadBitmapを使用したところ、ピクチャコントロールに画像を表示することができました。
CreateBitmapの使用方法に問題があったようです。
ツイート | ![]() |