• ベストアンサー

LoadBitmapでCStringを使いたい

VC++.NETでMFCアプリケーションを作っています。 CBitmap::LoadBitmapの定義では  BOOL LoadBitmap(LPCTSTR lpszResourceName); とあるのですが、リソースネームはCString型の変数では指定できないのでしょうか? ビットマップリソースがIDB_BMP1~IDB_BMP5まであり、状況により表示する画像を切り替える、ということをしたいのですが。   (略)  int n=1;  CString fname;  CBitmap bmp;  fname.Fromat("IDB_BMP%d",n);  bmp.LoadBitmap(fname);  pOldbmp = myDC.SelectObject(&bmp);  pDC->BitBlt(0, 300, 50, 77, &myDC, 0, 0, SRCCOPY);   (略) とすると画像が読み込まれません。 なお、LoadBitmapのfnameの部分を IDB_BMP1 と置き換えれば、画像は正常に表示できます。 MFC自体が初めてなので、分かりやすいご説明をいただけると嬉しいです。

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

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

リソースを指定するには defineで指定されたID(整数)を指示するのが一般的です LoadBitmap( LPCTSTR lpszResorceName )を使いたいのであれば リソースの定義でリソースIDを文字列で指示する必要があります リソースIDを文字列で表現するのはWindows3.1などの古い方式です 普通に ビットマップをインポートすると整数が割り当てられます リソースビューで IDB_BMP1を選択します プロパティウィンドウのID行の IDB_BMP1を "IDB_BMP01" (""も入力する) としてEnterを押します fname.Format("IDB_BITMAP%02d",n); といった具合にして見ましょう ほかの # "IDB_BMP1"といったdefineで設定したID名と同じ文字列では # コンパイラがうまく認識しないようです... ほかも同じように変更してみてください No1氏の回答のように IDを配列にしておいてアクセスするほうが一般的ですよ

beni_sakura
質問者

お礼

""が必要だったんですね! 見事表示されました。 そして確かにdefineと同じIDではだめでした…。 ご丁寧な説明ありがとうございます。

その他の回答 (1)

  • clsdi99
  • ベストアンサー率63% (31/49)
回答No.1

CBitmapには BOOL LoadBitmap( UINT nIDResource ); というメソッドもありますよ。 UINT ids[] = {IDB_BMP1, IDB_BMP2, IDB_BMP3}; int n = 1; CBitmap bmp; bmp.LoadBitmap (ids[n]); でいけますよ。

beni_sakura
質問者

お礼

なるほど、そうやればIDを代入できるんですね。 そこすら分かっていませんでした…。 とても参考になりました。 ありがとうございます。

関連するQ&A

  • 画像の印刷について

    環境はWIN98 VC++6.0 MFCです。 初めて印刷に挑戦します。 TextOut()で書いた文字は印刷プレビューでちゃんと表示されましたが、以下のようにして取りこんだ画像を印刷プレビューで見ても何も表示されません。 どうしたら印刷できるようになりますか? void CXxxView::OnDraw(CDC* pDC) { CXxxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: この場所にネイティブ データ用の描画コードを追加します。 CDC myDC; CBitmap myBMP; myBMP.LoadBitmap(IDB_BITMAP3); myDC.CreateCompatibleDC(pDC); CBitmap* oldBMP=myDC.SelectObject(&myBMP); pDC->BitBlt(10,10,60,100,&myDC,0,0,SRCCOPY); myDC.SelectObject(oldBMP); }

  • ビューにビットマップファイルを描画する方法

    MFCのプログラムで(マルチウィンドウ)ビュー上に指定したビットマップファイルをオープンして描画したいと思ってます。 Bitmapリソースを指定して描画する方法はわかりましたが、ビットマップファイル名を指定して、そのファイルをオープンしてビュー上に描画する方法はどのようすればよいのでしょうか? 今は以下のようにOnDraw()内で以下のように実装しています。 -------------------------------------------------------- CBitmap kaitaGazou; kaitaGazou.LoadBitmap(IDB_BITMAP1); CDC MemDC; MemDC.CreateCompatibleDC(pDC); CBitmap *pTmpBitmap; pTmpBitmap = MemDC.GetCurrentBitmap(); MemDC.SelectObject(&kaitaGazou); pDC->BitBlt(0, 0, 100, 100, &MemDC, 10, 10, SRCCOPY); MemDC.SelectObject(pTmpBitmap); kaitaGazou.DeleteObject(); --------------------------------------------------------

  • VisualC++6.0にてボタンにビットマップを表示させる方法

    VisualC++6.0のダイアログベースのアプリにおいて、 フォーム上に配置したボタン上にビットマップを表示 させたいと思ってます。OnPaint()の中で、以下のコード を書いたのですが、うまくいきません。  CWnd* myWnd = GetDlgItem(IDC_BUTTON1);  CDC* pDC = myWnd->GetDC();  CDC myDC;  CBitmap myBMP;  myBMP.LoadBitmap(IDB_BITMAP);  myDC.CreateCompatibleDC(pDC);  CBitmap* oldBMP = myDC.SelectObject(&myBMP);  pDC->BitBlt(0,0,100,100,&myDC,0,0,SRCCOPY);  myDC.SelectObject(oldBMP); ビットマップはちゃんと書かれてはいますが、その上にボタンが 描かれてしまうので、ビットマップが隠されてしまいます。 解決方法を教えてくださいますでしょうか。 よろしくお願いします。 % 絵をクリックするとアクションを起こすようにしたいので、 % ピクチャーボックスでも試してみました。これだとビット % マップはちゃんと表示されますが、BN_CLICKEDを書いて % ピクチャーボックスをクリックしてもOnPict()に処理が % 移りません。

  • オブジェクトの削除について

    環境 WIN98 VC++6.0 MFC にて オブジェクトを使い終わってから削除している場合としていない場合が有るのですが、どうしてなのですか? 作ったオブジェクトはなんでもかんでも削除したほうが無難な気がしますが、本にのっているコードで削除してない場合も良く見かけます。 <削除していない>//著名な本のコード void Cxxx::OnDraw(CDC* pDC) {  CBitmap bmp;  bmp.LoadBitmap(nID);  略  //bmp.DeleteObject(); //■この記述が無い } <削除している>//ネット上でみかけたコード void CMainFrame::_SetBmp(CWnd* pBox,int nID,int  width,int height) // 単品 {  CDC* pDC=pBox->GetDC();  CDC memDC;  CBitmap bmp;  bmp.LoadBitmap(nID);  memDC.CreateCompatibleDC(pDC);  CBitmap* pOldBmp=memDC.SelectObject(&bmp);  pDC->BitBlt(0,0,width,height,&memDC,0,0,SRCCOPY);  memDC.SelectObject(pOldBmp);  bmp.DeleteObject();  memDC.DeleteDC(); }

  • LoadBitmapについて

    環境 WIN98 VC++6.0 MFC にて 下記のようにbmp.LoadBitmap(IDB_BITMAP1);を2度続けるとダウンしますがどうしてですか? void CAdvancedRgnDlg::OnPaint() { CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); bmp.LoadBitmap(IDB_BITMAP1);//2度続けるとダウンする CDialog::OnPaint(); }

  • ダイアログにビットマップを貼り付けた時にフリーズしてしまう

    お世話になります、fujicafeです。 現在、MFCにてダイアログベースのアプリケーションを作成中なのですが、ダイアログにビットマップを貼り付けてOnPaint()で表示するようにプログラムを作成したのですが、何度かダイアログの表示を繰り返すとOnPaintでのビットマップの読み込みが途中まででフリーズしてしまう現象が起きてしまいました。 プログラムは以下のように作成しています void C****Dlg::OnPaint() {  CDC* pDC = this->GetDC(); CDC myDC; CBitmap newbitmap; CBitmap* oldbitmap; CRect rc; GetClientRect(rc); newbitmap.LoadBitmap(IDB_BITMAP); myDC.CreateCompatibleDC( pDC ); oldbitmap=myDC.SelectObject( &newbitmap ); pDC->BitBlt( 0, 0, rc.Width(), rc.Height(), &myDC, 0, 0, SRCCOPY ); myDC.SelectObject(oldbitmap); } としています。 初めにこのダイアログを表示時は、ちゃんとビットマップが表示されるのですが、他のダイアログでこのダイアログを表示させた時にビットマップが上半分まで表示されて、動作がフリーズしてしまう現状です。 なにかよい打開策がありましたら、教えていただけたらと思っています。宜しくお願いいたします。

  • VC++にてボタン作成について(長文)

    VC++にて実行画面でボタンを表示させたいのですが、(表示するのはボタンだけではありません。)どのようにソースを書いたらいいのでしょう?Bitmapだったら、Viewクラスで ------------------------------------------------ CDC myDC; CBitmap newBitmap; CBitmap *pOldBitmap; newBitmap.LoadBitmap(画像の名前); myDC.CreateCompatibleDC(pDC); pOldBitmap=myDC.SelectObject(&newBitmap); pDC->BitBlt(10,10,320,240,&myDC,0,0,SRCCOPY); myDC.SelectObject(pOldBitmap); ------------------------------------------------ こんな感じかと思いますが、ボタンだったらどういった感じでソースを書いたらよいのでしょうか? また、こういったことを自分で調べたい場合には「ヘルプ」で何をキーワードにして検索したらよいのでしょう? VCを独学するのにどこか良いサイトはありますか?(できたら「ボタン」について詳しく説明してくれるサイトがいいです。) VCはほとんど素人なので簡単なことなのかも知れませんが、まったく分かりません。 ご存知の方、ご教授願います。

  • クリックした位置に画像を貼り付ける方法

    開発環境はWinXP、C++、MFCを使っています。 C++を勉強し始めた初心者です。 画面上で左クリックされた位置に画像(ビットマップ画像)を表示させる簡易プログラムを作ろうとしています。 ここで、マウスの位置を取得する方法がわかりません。理解しやすい方法があれば押してください。 ちなみにこんな感じでつくってます。。。↓ void Canvas::MakeStamp() //Canvas ・MaskStamp共に任意の名前 { // //ここでマウスの位置を取得したいです // //画像を貼り付け CClientDC cdc(this); CDC bmpCDC; bmpCDC.CreateCompatibleDC(&cdc); CBitmap bmp; bmp.LoadBitmap(STAMP); //STAMPは任意の名前 bmpCDC.SelectObject(bmp); cdc.BitBlt(X,Y,60,60,&bmpCDC,0,0,SRCCOPY); //ここのX,Yはクリックした座標を当てはめるつもりです。 } よろしくお願いします。

  • 画像表示について

    画像を表示させたいのですがうまくいきません。 途中まで打ってみたのでご意見お願いします。 (リソースから読み込んで表示させる方法) 環境:MicrosoftVisualC++ SDK ******省略********* case WM_PAINT:   hdc = BeginPaint(hWnd,&ps);   //ビットマップリソースハンドルの取得   hBmp = LoadBitmap( hInst, MAKEINTRESOURCE(IDB_BITMAP1));   if(hBmp == NULL){     MessageBox(hWnd,"ファイルの読み込みに失敗しました。","エラー",MB_ICONWARNING | MB_OK);     exit(1);   }   //ビットマップの大きさの情報取得   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; ******リソース(img.rc)****** // // Bitmap // IDB_BITMAP1 BITMAP DISCARDABLE "bitmap1.bmp" #ifdef APSTUDIO_INVOKED

  • ビットマップ画像表示

    いつもお世話になっております。 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関数は子ウィンドウを表示するときに実行されます。 全て載せられないので追加した部分のみプログラムを載せましたが、 この部分だけでも、プログラムの間違い等はありませんでしょうか。 ご教授お願いいたします。

専門家に質問してみよう