CStaticに関連つけたBitmapの解放? – プログラミング – Home

CStaticに関連つけたBitmap...
 
通知
すべてクリア

[解決済] CStaticに関連つけたBitmapの解放?


ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

こんにちは、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使用
 
よろしくお願いします


引用未解決
トピックタグ
とことんサンデー
 とことんサンデー
(@とことんサンデー)
ゲスト
結合: 23年前
投稿: 2
 

はじめまして。

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

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


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

回答ありがとうございます。

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

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

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

よろしくお願いします。


返信引用
とことんサンデー
 とことんサンデー
(@とことんサンデー)
ゲスト
結合: 23年前
投稿: 2
 

CStaticのポインタは確かに、関数を抜けると破棄されますが、
コントロール自体は、DestroyWindowなどの関数で破棄されない
限りのこってるからではないでしょうか?

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

BOOL CMyDialog::OnInitDialog
{

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

return TRUE;
}

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

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


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

ありがとうございます。
なんとなくわかります。

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

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

って思いました。

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


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

解決つけるの忘れてました


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました