CStaticに関連つけたBitmapの解放?

[戻る]
ナオーバ 2002/07/29(月) 13:51:37
こんにちは、JPEGを表示するアプリを作成しています。

JPEGを連続で表示するのは問題ないのですが、途中にJPEGファイルが無い場合
JPEGが表示されなくなります

アプリの概要:
・次へのボタンを押したら次のファイルパスを取得しJPEGを表示させる
・JPEG表示時はCStaticは枠として利用(Bitmapは割り当てていない)
・JPEGファイルが無いときには下記によりBitmapを関連つけています。
    void CPhotoDlg::NoCreate()
    {
        // ビットマップ表示
        CStatic* pwndNoPhoto = (CStatic *)GetDlgItem( IDC_JPEG_PIC );
        HBITMAP hBitmap = LoadBitmap( AfxGetInstanceHandle(), MAKEINTRESOURCE( 
IDB_NOPHOTO ));
        pwndNoPhoto->SetBitmap( hBitmap );
    }

で、JPEGが表示されなくなるのはCStaticにBitmapを関連つけた為と思うですが、
ここら辺の動作がよくわかりません。

疑問:
 1.メンバでもないのに何故ずっと生きているの?
 2.1の為解放する方法がわかりません

環境:
 WIN2000 SP2
 VC6.0   SP5
 MFC使用
 
よろしくお願いします

とことんサンデー 2002/07/29(月) 14:56:57
はじめまして。

おそらく・・・
疑問1の解答
ローカル変数とビットマップのハンドルは全く別物で、
ローカル変数の寿命が尽きたからといって、ビットマップの
ハンドルは破棄されないため。

疑問2の解答
つまり、ローカル変数で、ビットマップのハンドルを
扱うなら、ローカル関数内でDeleteObjectするべき。
使いまわしたいなら、変数の寿命を考えて、メンバ変数とかに
ハンドルを取るべき。
つまり、逆に「いつ、ハンドルを破棄すべきか?」を
考えて、ハンドルを格納する変数の寿命をきめればよいのでは?

ナオーバ 2002/07/29(月) 15:37:35
回答ありがとうございます。

問題が解決しました。
いつハンドルを破棄するかは決まっていたのですが、
疑問1の為に破棄してよいかわからなかったのです。

で参考の為の質問ですが、

ローカルに宣言したCStaticにビットマップのハンドルを割り当てたとき
関数を抜けるとCStaticは破棄されるのに何故ビットマップが表示されるのでしょう?

よろしくお願いします。

とことんサンデー 2002/07/29(月) 17:03:30
CStaticのポインタは確かに、関数を抜けると破棄されますが、
コントロール自体は、DestroyWindowなどの関数で破棄されない
限りのこってるからではないでしょうか?

例えば、ボタンのキャプションを変える時に以下のような
コードをかいたりしますよね?!

BOOL CMyDialog::OnInitDialog
{

 CButton *pButton = (CButton *)GetDlgItem(IDC_BUTTON1);
 pButton->SetWindowText("abc");

 return TRUE;
}

この場合、pButtonのポインタは確かに関数抜けると破棄されますが、
だからといって、ボタンのキャプションまで元には戻らないですよね?!

なんか、上手い具合に説明できないのですが、ニュアンス的には
わかっていただけますでしょうか?

ナオーバ 2002/07/30(火) 09:04:28
ありがとうございます。
なんとなくわかります。

GetDlgItemのAPIを見たらハンドルが戻り値なので、
CWnd::GetDlgItemもきっと中でGetDlgItemのAPI使ってると考えると、

ハンドルは長生きだってことですか。

って思いました。

参考になりました。
ありがとうございます。

ナオーバ 2002/07/30(火) 09:04:55
[[解決]]
解決つけるの忘れてました

古いスレッドには追加発言できません。