こんにちは、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使用
よろしくお願いします
はじめまして。
おそらく・・・
疑問1の解答
ローカル変数とビットマップのハンドルは全く別物で、
ローカル変数の寿命が尽きたからといって、ビットマップの
ハンドルは破棄されないため。
疑問2の解答
つまり、ローカル変数で、ビットマップのハンドルを
扱うなら、ローカル関数内でDeleteObjectするべき。
使いまわしたいなら、変数の寿命を考えて、メンバ変数とかに
ハンドルを取るべき。
つまり、逆に「いつ、ハンドルを破棄すべきか?」を
考えて、ハンドルを格納する変数の寿命をきめればよいのでは?
回答ありがとうございます。
問題が解決しました。
いつハンドルを破棄するかは決まっていたのですが、
疑問1の為に破棄してよいかわからなかったのです。
で参考の為の質問ですが、
ローカルに宣言したCStaticにビットマップのハンドルを割り当てたとき
関数を抜けるとCStaticは破棄されるのに何故ビットマップが表示されるのでしょう?
よろしくお願いします。
CStaticのポインタは確かに、関数を抜けると破棄されますが、
コントロール自体は、DestroyWindowなどの関数で破棄されない
限りのこってるからではないでしょうか?
例えば、ボタンのキャプションを変える時に以下のような
コードをかいたりしますよね?!
BOOL CMyDialog::OnInitDialog
{
CButton *pButton = (CButton *)GetDlgItem(IDC_BUTTON1);
pButton->SetWindowText(abc);
return TRUE;
}
この場合、pButtonのポインタは確かに関数抜けると破棄されますが、
だからといって、ボタンのキャプションまで元には戻らないですよね?!
なんか、上手い具合に説明できないのですが、ニュアンス的には
わかっていただけますでしょうか?
ありがとうございます。
なんとなくわかります。
GetDlgItemのAPIを見たらハンドルが戻り値なので、
CWnd::GetDlgItemもきっと中でGetDlgItemのAPI使ってると考えると、
ハンドルは長生きだってことですか。
って思いました。
参考になりました。
ありがとうございます。
解決つけるの忘れてました