- ベストアンサー
c言語を使いダイアログにbmpを表示したい
はじめまして、 私は、c言語は初心者なのでが、ダイアログボックスに、画像(bmp)が表示することができません。 ソースは、 hdc = BeginPaint(hDlg, &ps); //指定ウィンドウ内での描写準備 // ビットマップをファイルからロードする hBitmap = ::LoadBitmap( NULL, _T("test.bmp") ); // ウィンドウのデバイスコンテキストハンドルを取得する hDC = GetDC( hDlg ); // メモリデバイスコンテキストを作成する hCompatDC = CreateCompatibleDC( hDC ); // ロードしたビットマップを選択する GetObject(hBitmap, sizeof(BITMAP), &bmp); // ビットマップをウィンドウに転送する(表示する) if(hBitmap != NULL){ StretchBlt( hDC, 0, 0, 100, 100, hCompatDC, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY ); SendDlgItemMessage( hDlg, IDC_STATIC, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap); } なのですが、これはメインウィンドウでは動くのですが、ダイアログボックスでは動かずこまっています。 どうか、助言のほどよろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ファイルから読み込むのですか? でしたら LoadBitmapでは読み込めないと思いますよ 読み込めていないハンドルを使って描画しようとするのですから当然失敗しますよね ファイルから読み込むのであれば LoadImageだと思いますよ また SendDlgItemMessageに対して IDC_STATICを 引数nIDDlgItemに使ってますが これではどのスタティックコントロールなのか Windowsは分かりません IDC_STATICは静的なコントロールで内容をデザイン時から変更しない場合に使います リソースエディタで ピクチャーボックスコントロールを追加したら プロパティウィンドウの『ID』を『IDC_STATIC』以外のものにしましょう たとえば『IDC_IMAGE1』とかです スタティックコントロールにビットマップを設定するなら ダイアログのDCで描画する必要は無いように思います CreateCompatibleDCでもうひとつDCを作成してそこへ 描画してやれば良いように思いますよ 使い終わった DCは GetDCならReleaseDCやCreateDC系ならDeleteDCで開放または削除しましょう 削除などする際は DC選択されている GDIオブジェクトも外しましょう
その他の回答 (2)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス ・ビットマップの表示の基本は次の2つのリンクを読んで下さい。特に(1)をどうぞ。 (1)http://wisdom.sakura.ne.jp/system/winapi/win32/win104.html→『ビットマップの表示』 (2)http://www.geocities.jp/ky_webid/win32c/022.html→『第22章 ビットマップを表示する』 >// ウィンドウのデバイスコンテキストハンドルを取得する >hDC = GetDC( hDlg ); ↑ これは必要ありません。 理由は BeginPaint() 関数でデバイスコンテキストハンドルを取得しているからです。 GDI 関数群で (1)BeginPaint、EndPaint (2)GetDC、ReleaseDC の2系とをそれぞれ混ぜて使えません。どちらか一方の関数群を使います。 >// ロードしたビットマップを選択する >GetObject(hBitmap, sizeof(BITMAP), &bmp); ↑ これも必要ありません。 その代わりに SelectObject() 関数が必要です。 つまり関数名を間違っています。 ・あとどのメッセージでビットマップを描画していますか? (1)WM_PAINTメッセージ内で記述。 (2)WM_PAINTメッセージ以外で記述。 これによりBeginPaint系か、GetDC系かが決まります。 また、WM_PAINTメッセージ以外のときは hBitmap をファイルから読み込み描画するときに WM_PAINTメッセージで処理すれば良い。このため LoadImage() 関数でファイルから読み込ん だら InvalidateRect() 関数を呼びます。 http://wisdom.sakura.ne.jp/system/winapi/win32/win35.html→『領域の消去と有効化』 ・以上。参考に。
お礼
URLを参考にさせていただき解決することができました。ありがとうございました。
- ninigi
- ベストアンサー率43% (10/23)
とりあえず提示されたソースは次の2行がおかしいです。コメントとコードが合っていません。 // ロードしたビットマップを選択する GetObject(hBitmap, sizeof(BITMAP), &bmp); 正しくはこうじゃないかな?(間の2行を追加してみました。) // ロードしたビットマップを選択する SelectObject(hCompatDC, hBitmap); // ロードしたビットマップの情報を取得する GetObject(hBitmap, sizeof(BITMAP), &bmp); ただ、これが原因だとするとダイアログボックスに限らずメインウィンドウでも動かないハズなので、原因は別のところにあるのかな? それともダイアログボックスのプロシージャにコピーする時に間違ってSelectObjectの行を消しちゃったとか?
お礼
何とか解決することができました。 ありがとうございました。また何かありましたら、よろしくお願いします。
お礼
LoadBitmapに変え、IDC_STATICも変えたところ上手くいきました。ありがとうございました。また何かありましたらよろしくお願いします。