• ベストアンサー

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); } なのですが、これはメインウィンドウでは動くのですが、ダイアログボックスでは動かずこまっています。 どうか、助言のほどよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

ファイルから読み込むのですか? でしたら LoadBitmapでは読み込めないと思いますよ 読み込めていないハンドルを使って描画しようとするのですから当然失敗しますよね ファイルから読み込むのであれば LoadImageだと思いますよ また SendDlgItemMessageに対して IDC_STATICを 引数nIDDlgItemに使ってますが これではどのスタティックコントロールなのか Windowsは分かりません IDC_STATICは静的なコントロールで内容をデザイン時から変更しない場合に使います リソースエディタで ピクチャーボックスコントロールを追加したら プロパティウィンドウの『ID』を『IDC_STATIC』以外のものにしましょう たとえば『IDC_IMAGE1』とかです スタティックコントロールにビットマップを設定するなら ダイアログのDCで描画する必要は無いように思います CreateCompatibleDCでもうひとつDCを作成してそこへ 描画してやれば良いように思いますよ 使い終わった DCは GetDCならReleaseDCやCreateDC系ならDeleteDCで開放または削除しましょう 削除などする際は DC選択されている GDIオブジェクトも外しましょう

meren
質問者

お礼

LoadBitmapに変え、IDC_STATICも変えたところ上手くいきました。ありがとうございました。また何かありましたらよろしくお願いします。

その他の回答 (2)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★アドバイス ・ビットマップの表示の基本は次の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:
http://wisdom.sakura.ne.jp/system/winapi/win32/win104.html
meren
質問者

お礼

URLを参考にさせていただき解決することができました。ありがとうございました。

  • ninigi
  • ベストアンサー率43% (10/23)
回答No.1

  とりあえず提示されたソースは次の2行がおかしいです。コメントとコードが合っていません。   // ロードしたビットマップを選択する GetObject(hBitmap, sizeof(BITMAP), &bmp);   正しくはこうじゃないかな?(間の2行を追加してみました。)   // ロードしたビットマップを選択する SelectObject(hCompatDC, hBitmap); // ロードしたビットマップの情報を取得する GetObject(hBitmap, sizeof(BITMAP), &bmp);   ただ、これが原因だとするとダイアログボックスに限らずメインウィンドウでも動かないハズなので、原因は別のところにあるのかな? それともダイアログボックスのプロシージャにコピーする時に間違ってSelectObjectの行を消しちゃったとか?  

meren
質問者

お礼

何とか解決することができました。 ありがとうございました。また何かありましたら、よろしくお願いします。

専門家に質問してみよう