PRB: "Warning: Calling DestroyWindow in CWnd::~CWnd" Message

ID: Q105081


The information in this article applies to:
  • The Microsoft Foundation Classes (MFC), used with:
    • Microsoft Visual C++ for Windows
    • Microsoft Visual C++ 32-bit Edition


SYMPTOMS

The following warnings are displayed when a debug version of a program is executed and TRACE() diagnostics are enabled:


   Warning: calling DestroyWindow in CWnd::~CWnd
   OnDestroy or PostNcDestroy in derived class will not be called 


CAUSE

The above warnings are displayed by the CWnd::~CWnd() destructor. The warnings indicate the following:

  • The programmer has most likely called "delete" on a CWnd object rather than DestroyWindow().


  • An object derived from CWnd is not performing a DestroyWindow() call in its destructor.


  • Because the DestroyWindow() call is executed in the destructor for CWnd, only the CWnd portion of the CWnd-derived object is remaining when the DestroyWindow() is called. Thus, if you have a CWnd-derived object and receive this warning, the derived object's virtual functions will not exist and the CWnd functions will be called instead.



RESOLUTION

MFC Technote #17 contains more information on how to properly destroy a Window object and states the following cardinal rule:


   To destroy a C++ Windows object, use DestroyWindow, not "delete". 


Also, examining CWnd::~CWnd() will reveal that the foremost task of the destructor is to ensure that the associated Windows window object has been destroyed. If a program calls DestroyWindow() before the CWnd destructor is called, the m_hWnd data member will be NULL, the TRACE0() messages will not occur, and DestroyWindow() will not be called in CWnd::~CWnd().

Additional query words:

Keywords : kbMFC kbVC kbWndw kbGrpMFCATL
Version : winnt:
Platform : winnt
Issue type : kbprb


Last Reviewed: November 25, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.