• ベストアンサー

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(); }

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

BOOL CGdiObject::Attach(HGDIOBJ hObject) { ASSERT(m_hObject == NULL); // only attach once, detach on destroy if (hObject == NULL) return FALSE; CHandleMap* pMap = afxMapHGDIOBJ(TRUE); // create map if not exist ASSERT(pMap != NULL); pMap->SetPermanent(m_hObject = hObject, this); return TRUE; } ということで、"only attach once"なんでしょう。

VitaminBB
質問者

お礼

回答ありがとうございます。 #1のお礼の方法でやったところ、crtmbox.cの中でエラーが出て止まりました。 BOOL CGdiObject::Attach(HGDIOBJ hObject) 内ではなかったのですが、やり方がまずいのでしょうか?

その他の回答 (3)

noname#5537
noname#5537
回答No.4

LoadBitmap を「2度続けるとダウンする」のは, そういう風に作ってあるからです。 DeleteObject せずに再び LoadBitmap すると, 前に LoadBitmap したのが削除されないから, 教えてくれているわけです。 # ちなみに教えてくれるのは debug 版だけで, # release 版の場合は何も言わずに動いているように見えます。 # そう見えるだけでプログラムとしては問題があります。 再び LoadBitmap を呼びたければ, その前に DeleteObject すればいいです。 CBitmap bmp; bmp.LoadBitmap(IDB_BITMAP1); bmp.DeleteObject(); bmp.LoadBitmap(IDB_BITMAP1);

VitaminBB
質問者

お礼

回答ありがとうございます。 #1~#3までの回答と合わせて大変良く分かりました。 コードを追っていったら、void CAdvancedRgnDlg::OnPaint() を抜ける時にデストラクタが呼ばれてDeleteObject(); されていることが確認できました。

回答No.3

#2787 で指摘したこと:'DeleteObject()されていない' はご理解いただけなかったのでしょうか。

VitaminBB
質問者

お礼

回答ありがとうございます。 言われていることは理解しているつもりですが、DeleteObject()を具体的にどのコードがやっているかが判りません。

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

LoadBitmapの中の、どこで落ちたかMFCのソースの内容をデバッグで追ってわかりませんか?

VitaminBB
質問者

お礼

回答ありがとうございます。 私も人に頼ってばかりいないで自分で原因を見つけたいのですが、どのようにデバッグすれば良いのでしょうか? とりあえず2個目のbmp.LoadBitmap(IDB_BITMAP1);にブレークポイントをおいて、ひたすらエラーが出るところを探しましたがそれで良いのでしょうか?

関連するQ&A