• ベストアンサー

ビットマップの表示について

プログラムの初心者です。visual sudio net 2003でビットマップの表示の仕方について困っています。猫でもわかるwindows プログラム という本を参考にビットマップリソースをつくりソースファイルも参考書と同じようにしたのですが、肝心なビットマップが表示されません。ちなみにエラーは出ていません。ただ画像が表示されません。 これは使っているパソコンにも問題があるのでしょうか? パソコンはWinosw Vistaを使っています。 どうかご教授おねがいします。何か説明に足りないところがあればまた足しますのでよろしくおねがいします。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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を使用後に成功したのかどうかをチェックしながら実行するようにしましょう

ganfuji142
質問者

お礼

ありがとうございます。言われた通りMYBMPのIDの入力のとき"MYBMP"ではなくMYBMPとなっていました。""をつけてみたらきちんとビットマップが表示されました。本当にありがとうございました

その他の回答 (2)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

リソースはこんな感じですか ///////////////////////////////////////////////////////////////////////////// // // Bitmap // MYBMP BITMAP DISCARDABLE "my.bmp" ファイルの場所が違うのかもしれませんね

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

どこを参考にされたのでしょう? http://www.kumei.ne.jp/c_lang/ の中のどの部分なのかを明確にした方がいいように思います どこどこの第何章を参考にしたなど ・・・ VC2003が作成したスケルトンに対して変更を行った部分のソースを公開してみるとか LoadBitmap関数などでHBITMAPを取得していると思いますが これが意図したハンドルとして取得できていないなどが考えられます

ganfuji142
質問者

補足

参考にしたのは先日購入した 猫でもわかる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)); } となっています。 どこかこのソースに間違いがあるでしょうか?

関連するQ&A

  • ビットマップの2値化

    モノクロビットマップ画像を2値化したいのです。 出来れば可変閾値を使ったもの、 あるいは2値化の前にエッジを強調する処理を施してからと言う物を作りたいと思っています。 何か参考なるソース、どんな風なプログラムを組めばいいかなど教えてくださるとうれしいです。

  • Bitmap表示について WIN32

    「猫でもわかるwindowsプログラミング 第4版」を参考にして、ビットマップを表示するプログラムを作っています。 開発環境はVisual Studio Express 2015(Visual C++)です。 読み込んだビットマップを表示させようと、下記のように(本の内容をそっくりそのまま)コードとリソースを書いてみたのですがデバッグすると何も表示されないウィンドウが出てしまいます。 メッセージボックスで確かめてみると、 ビットマップリソースを読み込んだ際、hBmpにNULLが返っていました。 コードもリソースも本の通りに書いたので間違いはないと思います。 となると、うまくいかない理由はリソースとビットマップをプロジェクトに追加させるまでの過程にあると考えます。 本で扱っている環境はVisual c++ 2010 だったのですが、リソースの追加に関してバージョンの差が関係しているのでしょうか? リソースの追加に関してはネットや本にたくさん説明がありますが、それらの通り書いてもうまくいきません。 どうか、リソースのプロジェクトへの追加方法を教えていただけないでしょうか。 また、ソースコード・リソースに関して間違いがあるのならばアドバイスもらえるとありがたいです。 // ウィンドウプロシージャ 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); // ビットマップリソース「MYBMP」を読み込む hBmp = LoadBitmap(hInst, TEXT("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); StretchBlt(hdc, w, 0, w * 2, h * 2, hdc_mem, 0, 0, w, h, SRCCOPY); DeleteDC(hdc_mem); // メモリデバイスコンテキストを破棄 DeleteObject(hBmp); // ビットマップオブジェクトを破棄 EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; default: return (DefWindowProc(hWnd, msg, wp, lp)); } return 0; } //リソース MYBMP BITMAP "bitmap1.bmp"

  • ビットマップの表示ができません。

    Visual Studio.net 2003 MFCを使用しています。 ビットマップの表示とフォームのサイズ変更はできたのですが、 以下のソースのように フォームのサイズをビットマップのサイズに変更すると ビットマップが表示されません。 一瞬表示はされているようですが、 真っ白になります。 フォームをきちんとビットマップのサイズに変更し、 ビットマップを表示するにはどうすればいいでしょうか? int num=35; void CProject1View::OnLButtonUp(UINT nFlags, CPoint point) {   // TODO : ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。   char str[128];   wsprintf(str,"c:\\test\\%d.bmp",num);num++;   HBITMAP hbm = (HBITMAP)LoadImage(NULL, str, IMAGE_BITMAP,0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION );   CBitmap *pBmp = CBitmap::FromHandle( hbm );   BITMAP bmp;   GetObject(hbm,sizeof(bmp),&bmp );   CDC bmpdc;   CDC *mydc=GetDC();   bmpdc.CreateCompatibleDC(mydc);   CBitmap *pOldBmp = bmpdc.SelectObject(pBmp);   GetParentFrame()->SetWindowPos(&wndTop,0,0,bmp.bmWidth,bmp.bmHeight,SWP_NOMOVE);   mydc->BitBlt( 0, 0,bmp.bmWidth, bmp.bmHeight, &bmpdc, 0, 0, SRCCOPY );   bmpdc.SelectObject(pOldBmp);   DeleteObject(hbm);   CView::OnLButtonUp(nFlags, point); }

  • ビットマップ画像表示

    いつもお世話になっております。 VS2005でC++を用いてWindowsアプリケーションの作成をしています。 子ウィンドウにビットマップ画像(ファイル名:HELP.bmp)を 表示させようとプログラムを組んだのですが、 子ウィンドウを出してもビットマップ画像が表示されません。 以下のようなプログラムを追加しました。 --------------------------------- ///リソーススクリプト/////////////////////////////////  IDB_BITMAP1  BITMAP DISCARDABLE  "HELP.bmp" ///ヘッダースクリプト/////////////////////////////////  #define IDB_BITMAP1   3000 ///ソーススクリプト/////////////////////////////////// void ShowMyBMP(HWND hWnd, HDC hdc){   HDC hmdc;   HBITMAP hBitmap;   BITMAP bmp;   HINSTANCE hInst;   int BMP_W, BMP_H;   hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE);   hBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1));  //インスタンスハンドル取得   GetObject(hBitmap, sizeof(BITMAP), &bmp);  //ビットマップの情報を得る   BMP_W = (int)bmp.bmWidth;  //画像の幅   BMP_H = (int)bmp.bmHeight;  //画像の高さ   hmdc = CreateCompatibleDC(hdc);  //メモリデバイスコンテキストハンドルを取得   SelectObject(hmdc, hBitmap);   BitBlt(hdc, 0, 0, BMP_W, BMP_H, hmdc, 0, 0, SRCCOPY);   StretchBlt(hdc, 0, BMP_H, BMP_W / 2, BMP_H / 2, hmdc, 0, 0, BMP_W, BMP_H, SRCCOPY);   DeleteDC(hmdc); //デバイスコンテキストハンドルを開放   DeleteObject(hBitmap);   return; } --------------------------------- ShowMyBMP関数は子ウィンドウを表示するときに実行されます。 全て載せられないので追加した部分のみプログラムを載せましたが、 この部分だけでも、プログラムの間違い等はありませんでしょうか。 ご教授お願いいたします。

  • BCC5.5.1とBCCFormを使い、ビットマップを表示するプログラムを書いたが、ビットマップが表示されません。

    いつもお世話になっております。 小生、只今BCC5.5.1とBCCFormを使い、Win32APIを勉強しています。 今回、"猫でもわかるWindowsプログラミング第2版"の第9章を参考にビットマップを表示するプログラムを書き、 以下の手順で実行ファイルを作成、実行してみましたが、ビットマップが表示されません。 1.bcc32 -W source.cpp 2.brc32 Bitmap.rc source.exe 以下にソースを記述します。 source.cpp ※WndProc関数以外は猫でもわかると同じなので省略させていただきます。 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, MAKEINTRESOURCE(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)); } return 0; } そしてリソーススクリプトです Bitmap.rc //----------------------------------------- // BCCForm Ver 2.41 // An Easy Resource Editor for BCC // Copyright (c) February 2002 by ysama //----------------------------------------- #include "ResBitmap.h" //-------------------------- // イメージ(MYBMP) //-------------------------- MYBMP BITMAP DISCARDABLE "C:\Documents and Settings\ShuNakagawa\My Documents\C\test.bmp" そしてリソースヘッダです(記述の無い箇所は省いています) ResBitmap.h //----------------------------------------- // BCCForm Ver 2.41 // Header File for Resource Script File // Copyright (c) February 2002 by ysama //----------------------------------------- //--------------------- // イメージリソース //--------------------- #define MYBMP 100

  • ソースコードの表示

    市販のソフトのソースコードの表示の仕方を教えてください。 Visual Basicでプログラムされていると思います。 よろしくお願いします。

  • ビットマップボタンを押したときの処理についてなんですが

    環境はVC++6.0 MFC ダイアログベースです。 MFC初心者なんですが、 HBITMAP hBitmap; hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), (LPCTSTR)csBMPFile,      IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE|LR_CREATEDIBSECTION); を使いビットマップハンドルをし取得しました。 ビットマップの貼り付けは出来たのですが、ボタンを押したときにビットマップの画像を変える処理の仕方がわかりません>< loadbitmapsなら容易に出来るのですが、どうしてもloadimageを使って表示したいのですが、どのようにすれば良いでしょうか? 御教授よろしくお願いします><

  • 【VC++2005】複数ビットマップの表示方法

    【VC++2005】複数ビットマップの表示方法 BMPファイルを読み込み、ピクチャーコントロールに表示する方法を以下を参考に作成しました。 →http://www-higashi.ist.osaka-u.ac.jp/~k-maeda/vcpp/sec4-1bmpfile.html そこから今度は、複数のBMPを読み込み、画面に連結して表示させたいと思いましたが、どのように行えば実現可能なのか検討もつきません・・・。 参考になりそうなサイト等、ご存知の方がおられましたらご教授お願いいたしますm(__)m

  • visual basic6.0の起動

    今windows vista使ってます。本はme用の本を読んでます。本によるとプログラム→visual basic6で表示されるはずなのですが、vistaではプログラムの中に入ってません。visual vasicのソフト画面はどうしたら表示されますか。よろしくお願いします。

  • ツールバーの作成について

    Visual Studio net 2003 でプログラミングを始めたばかりの初心者です。リソースファイルにツールバーとそこにボタンをどうやって追加するのかがわかりません。リソースの追加 でツールバーを選択して、ビットマップと同じ作成画面がでてきました。これはビットマップが必要なのでしょうか? そしてどうやってツールバー上にボタンを追加するかわかりません。どうかご教授をお願いします。 説明に不足があれば追加いたしますのでよろしくお願いします。

専門家に質問してみよう