- ベストアンサー
ビットマップの表示について
プログラムの初心者です。visual sudio net 2003でビットマップの表示の仕方について困っています。猫でもわかるwindows プログラム という本を参考にビットマップリソースをつくりソースファイルも参考書と同じようにしたのですが、肝心なビットマップが表示されません。ちなみにエラーは出ていません。ただ画像が表示されません。 これは使っているパソコンにも問題があるのでしょうか? パソコンはWinosw Vistaを使っています。 どうかご教授おねがいします。何か説明に足りないところがあればまた足しますのでよろしくおねがいします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ビットマップリソースの指示の仕方がまずいのではと思います リソースビューで見た際にツリーを開いてBitmapの項目に "MYBMP"と"付でリソースが定義されていないとお示しのコードでは期待した結果が得られません MYBMPといった具合の"無しのタイプなら hBmp = LoadBitmap( hInst, MAKEINTRESOURCE( MYBMP ) ); // Bitmapハンドルが取得できたかチェック if ( hBmp != NULL ) { GetObject(hBmp, (int)sizeof(BITMAP), &bmp_info); w = bmp_info.bmWidth; h = bmp_info.bmHeight; hdc_mem = CreateCompatibleDC(hdc); // DCの作成に成功したかをチェック if ( hdc_mem != NULL ) { HBITMAP HBmpOld = (HBITMAP)SelectObject(hdc_mem, hBmp); BitBlt(hdc, 0, 0, w, h, hdc_mem, 0, 0, SRCCOPY); // 選択を元に戻してからDCを削除 SelectObejct( hdc_mem, hBmpOld ); DeleteDC(hdc_mem); } DeleteObject(hBmp); } といった具合に APIを使用後に成功したのかどうかをチェックしながら実行するようにしましょう
その他の回答 (2)
- php504
- ベストアンサー率42% (926/2160)
リソースはこんな感じですか ///////////////////////////////////////////////////////////////////////////// // // Bitmap // MYBMP BITMAP DISCARDABLE "my.bmp" ファイルの場所が違うのかもしれませんね
- redfox63
- ベストアンサー率71% (1325/1856)
どこを参考にされたのでしょう? http://www.kumei.ne.jp/c_lang/ の中のどの部分なのかを明確にした方がいいように思います どこどこの第何章を参考にしたなど ・・・ VC2003が作成したスケルトンに対して変更を行った部分のソースを公開してみるとか LoadBitmap関数などでHBITMAPを取得していると思いますが これが意図したハンドルとして取得できていないなどが考えられます
補足
参考にしたのは先日購入した 猫でもわかるWinodws プログラミング(第2版)の本の方でp212からp215のソースをそのままVC2003で同じように作ったつもりなのですがビットマップだけなぜか表示されないありさまです。言われる通りウィンドウプロシージャの中を hBmp = LoadBitmap(hInst, "MYBMP"); でビットマップを読み込み SelectObject(hdc_mem, hBmp); でメモリデバイイスコンテキストにビットマップを選択して後はBitBlt関数でデバイスコンテキストにおくりました。 プロシージャのなかは LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { HDC hdc, hdc_mem; PAINTSTRUCT ps; HBITMAP hBmp; BITMAP bmp_info; int w, h; switch (msg) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); hBmp = LoadBitmap(hInst, "MYBMP"); GetObject(hBmp, (int)sizeof(BITMAP), &bmp_info); w = bmp_info.bmWidth; h = bmp_info.bmHeight; hdc_mem = CreateCompatibleDC(hdc); SelectObject(hdc_mem, hBmp); BitBlt(hdc, 0, 0, w, h, hdc_mem, 0, 0, SRCCOPY); DeleteDC(hdc_mem); DeleteObject(hBmp); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } となっています。 どこかこのソースに間違いがあるでしょうか?
お礼
ありがとうございます。言われた通りMYBMPのIDの入力のとき"MYBMP"ではなくMYBMPとなっていました。""をつけてみたらきちんとビットマップが表示されました。本当にありがとうございました