08/11/30 10:08:09
>>735
CDialogクラスのデストラクタで呼び出しているので、(この時点では
派生クラスのメッセージマップや仮想関数テーブルを参照できない、
もしくは存在自体を知りえないため)派生クラスのOnDestroy()やPost
NcDestroy()は呼ばれないだけ。 当然ながら、CDialog::OnDestroy()
やCDialog::PostNcDestroy()の呼び出しは行われる。
派生クラスのOnDestroy()やPostNcDestroy()で独自の実装(例:閉じた
時のウィンドウサイズを取得してレジストリやINIファイルに保存する
等)を呼び出していなければ、デストラクタに処理を任せてもなんら
問題ない。
だからこそ「Error:」じゃなく、あくまで「Warning:」ってなってる。
CFileクラスのデストラクタや、CGdiObjectクラス(CPen,CBrush等の基本
クラス)のデストラクタでも同様のことをやっているけど、これらはメッセ
ージループを廻す必要がないので、TRACE記述はない。
740:732
08/11/30 10:13:43
>>736-737
こういう文句を言う連中は、MFCはおろかC++の基本的な仕様(派生クラスと
基本クラスのコンストラクタ/デストラクタが呼び出される順序や、仮想
関数など)さえロクに理解していないんだろうナァ。
方針なんて関係ない。強いて言えばデザインパターンってやつか?
コンストラクタでデフォルト値を代入してメンバ変数の初期化忘れを防ぐ
とか、デストラクタでメモリやハンドルの解放忘れを防ぐというのは、
基本中の基本。
インスタンスの消滅で確実にウィンドウを破棄し、なおかつ派生クラス
のOnDestroy()やPostNcDestroy()も呼び出されるようにしたければ、MFC
内部の実装に関係なく、派生クラスのオブジェクトが消滅するタイミング
でDestroyWindow()を呼び出せばいいだけ。
すなわち、自分が作るCDialog派生クラスで、デストラクタ関数を定義し、
m_hWndが有効ならDestroyWindow()を呼び出してやればいい。
class CMyDialog : public CDialog
{
virtual ~CMyDialog();
};
CMyDialog::~CMyDialog()
{
if(m_hWnd!=NULL)
DestroyWindow();
}
ただそれだけのことだ。
741:デフォルトの名無しさん
08/11/30 10:14:42
>>738
俺とそいつは別人だ
ちなみに「よばれてなくね?」は俺
>>739
警告の必要なくね?
742:デフォルトの名無しさん
08/11/30 10:18:33
>>740
でもヘルプでだってどういうときに
DestroyWindowを呼ばなきゃいけないのか書いてないわけだし
当然MFCの中身の都合なんてこっちはしったこっちゃないわけで
もし、自分でこういうもんを作るとしたら解放はフレームワークのほうで自動でやってほしいかな?
743:デフォルトの名無しさん
08/11/30 11:15:41
>>740のコードがまずいというのもわかりにくいしな
744:デフォルトの名無しさん
08/11/30 15:54:00
何この流れ
どうせお互いまったく譲り合わないんだから、これ以上書いても無駄だよ
745:デフォルトの名無しさん
08/11/30 18:51:38
Win7ってペイントとかワードパッドにリボン採用してるよな
今後作るソフトはリボンで作った方が惹きやすいのだろうか・・・2008SP1は持ってるが