• ベストアンサー

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