MFC
PostNcDestroy の警告について


HomeProgramming TipsMFC Tips[MFC-012]

■ 原文
Warning: calling DestroyWindow in CWnd::~CWnd; OnDestroy or PostNcDestroy in derived class will not be called.

■ 意訳
警告: CWnd 派生クラスの OnDestroy や PostNcDestroy は呼ばれないでしょう。

■ 解説
CWnd の派生クラスをメンバに持っている場合、ウィンドウが閉じられないままオブジェクトが削除されると、この警告が実行時に発生します。
この問題を解決するには、削除前に明示的に DestroyWindow を呼び出してやればよいです。
例えば、CBaseWnd のメンバとして CWnd から派生した m_chdWnd オブジェクトを持っている場合、以下のように記述します。


// ウィンドウが破棄される
void CBaseWnd::PostNcDestroy()
{
    // メンバのウィンドウに破棄を通知する
    m_chdWnd->DestroyWindow();
    delete m_chdWnd;

    // 自分も削除する
    delete this;
}


もし、自爆型として m_chdWnd が作成されているのなら、delete m_chdWnd; は不要です。
自爆型とは、PostNcDestroy メンバ内にて delete this; が記述されているクラスを指します。
このようなクラスは外部から delete をすると問題が起こる可能性があります。

■ おまけ
この警告を無くすのにやたらと時間がかかりました。なんと三週間も悶々と苦しみました。
と、いうか、原文の英語を翻訳したら、あっという間に警告を消すことが出来ました(汗)。
趣味でプログラムをしていたので、のんびりと時間を掛けて問題解決に挑戦できました。
これが仕事だったら、とっくに MFC を捨てていたでしょう。

私の場合は、アプリケーションクラスから見えない基本ウィンドウクラス CBaseWnd を作り、
その CBaseWnd にメンバとして、COverlapMeter を追加した事からハマリが始まりました。
COverlapMeter も CWnd の派生クラスですから、MFC としては、このクラスを自爆型と思っているわけです。
そのため、PostNcDestroy が自動では呼ばれないのに、おいおい大丈夫かと、親切にも警告を表示したわけです。

警告が日本語化されていれば、ハマらないのにと思うと同時に、
英語圏の開発者は、きっと警告を見るだけで「なるほど」と理解できるのですから、
英語圏以外の開発者は無用な負担を強いられているのだとつくづく思いました。



 Copyright 2005 VALGUS. All Rights Reserved.