C++ 等同于MFC窗口的OnFinalMessage?

C++ 等同于MFC窗口的OnFinalMessage?,c++,windows,mfc,atl,C++,Windows,Mfc,Atl,ATL CWindow类有一个有用的虚拟方法OnFinalMessage,在处理窗口的最后一条窗口消息后调用该方法-此时可以安全地销毁或删除与窗口关联的任何对象。从MFCCWnd类派生的windows是否有任何等价物?是您要寻找的 顺便说一下,如果您正在实现一个无模式对话框,并且正在寻找“删除此;”的位置,那么PostNcDestroy()就是您要寻找的位置。 顺便说一句,如果您正在实现一个无模式对话框,并且正在寻找“删除此;”的位置,那么PostNcDestroy()就是这个位置。这个答案描述

ATL CWindow类有一个有用的虚拟方法
OnFinalMessage
,在处理窗口的最后一条窗口消息后调用该方法-此时可以安全地销毁或删除与窗口关联的任何对象。从MFC
CWnd
类派生的windows是否有任何等价物?

是您要寻找的

顺便说一下,如果您正在实现一个无模式对话框,并且正在寻找“删除此;”的位置,那么PostNcDestroy()就是您要寻找的位置。


顺便说一句,如果您正在实现一个无模式对话框,并且正在寻找“删除此;”的位置,那么PostNcDestroy()就是这个位置。

这个答案描述了我最终是如何解决问题的。我会注意到,尽管约翰·迪柏林的回答很有帮助,但这并不是我问题的最终解决方案。这是因为WM_NC_DESTROY消息作为最后一条消息发送到窗口,但这可以在处理完发送到窗口的最后一条消息之前进行处理。有关此问题的解释,请参见示例

  • 使用WM_CLOSE调用DialogProc()
  • ProcessWindowMessage()调用WM\u CLOSE处理程序
  • 在WM_CLOSE处理程序中,调用DestroyWindow()
  • 这将再次使用WM\u NCDESTROY调用DialogProc
  • ProcessWindowMessage()调用WM\u处理程序
  • 您在WM\u处理程序中调用“delete this”
  • 调用
    delete this
    后,对象不再有效,但从技术上讲,您仍然处于
    WM\u CLOSE
    处理程序中,因此当您最终回到那里时,可能会崩溃。这意味着假设您可以在PostNcDestroy中执行
    删除该
    ,这并不安全,因为该对象可能仍然存在于其他堆栈帧中

    /// 
    /// A window designed to allow any window to use the "OnFinalMessage" method from the ATL CWindow class
    /// You must call SubclassWindow for this instance so that the window procedure runs
    template<class T>
    class FinalMessageWindow : public CWindowImpl<FinalMessageWindow<T> >
    {
        T *_t; /// The object wanting to receive the final message notification
    public:
        BEGIN_MSG_MAP(FinalMessageWindow<T>)
        END_MSG_MAP()
    
        /// 
        /// The constructor
        /// \param t The object that wants to get the OnFinalMessage notification
        FinalMessageWindow(T *t)
            : _t(t)
        {
        }
    
        /// 
        /// Called when the final window message for the window has been processed - this is often a good time to delete the object
        /// \param hWnd The window handle
        virtual void OnFinalMessage(HWND hWnd)
        {
            _t->OnFinalMessage(hWnd);
        }
    };
    

    这个答案描述了我最终是如何解决问题的。我会注意到,尽管约翰·迪柏林的回答很有帮助,但这并不是我问题的最终解决方案。这是因为WM_NC_DESTROY消息作为最后一条消息发送到窗口,但这可以在处理完发送到窗口的最后一条消息之前进行处理。有关此问题的解释,请参见示例

  • 使用WM_CLOSE调用DialogProc()
  • ProcessWindowMessage()调用WM\u CLOSE处理程序
  • 在WM_CLOSE处理程序中,调用DestroyWindow()
  • 这将再次使用WM\u NCDESTROY调用DialogProc
  • ProcessWindowMessage()调用WM\u处理程序
  • 您在WM\u处理程序中调用“delete this”
  • 调用
    delete this
    后,对象不再有效,但从技术上讲,您仍然处于
    WM\u CLOSE
    处理程序中,因此当您最终回到那里时,可能会崩溃。这意味着假设您可以在PostNcDestroy中执行
    删除该
    ,这并不安全,因为该对象可能仍然存在于其他堆栈帧中

    /// 
    /// A window designed to allow any window to use the "OnFinalMessage" method from the ATL CWindow class
    /// You must call SubclassWindow for this instance so that the window procedure runs
    template<class T>
    class FinalMessageWindow : public CWindowImpl<FinalMessageWindow<T> >
    {
        T *_t; /// The object wanting to receive the final message notification
    public:
        BEGIN_MSG_MAP(FinalMessageWindow<T>)
        END_MSG_MAP()
    
        /// 
        /// The constructor
        /// \param t The object that wants to get the OnFinalMessage notification
        FinalMessageWindow(T *t)
            : _t(t)
        {
        }
    
        /// 
        /// Called when the final window message for the window has been processed - this is often a good time to delete the object
        /// \param hWnd The window handle
        virtual void OnFinalMessage(HWND hWnd)
        {
            _t->OnFinalMessage(hWnd);
        }
    };
    

    希望这有帮助。如果有,请接受这个答案。谢谢很抱歉,没有。似乎PostNcDestroy与OnFinalMessage不是一回事。OnFinalMessage在窗口过程的最后一次调用完成之前调用-另一方面,在接收WM_NC_DESTROY消息时调用PostNcDestroy但是,如果在处理另一个窗口消息的过程中窗口被销毁,PostNcDestroy将在另一个窗口消息处理程序完成之前出现DWM_NC_DESTROY被认为是窗口接收到的最后一条消息,并且由于窗口关闭而由框架发送。(即来自对DestroyWindow()的调用)。您是否看到了其他情况?这是窗口接收到的最后一条窗口消息-它只是在最后一次调用帮助的窗口过程希望结束之前被调用。如果有,请接受这个答案。谢谢很抱歉,没有。似乎PostNcDestroy与OnFinalMessage不是一回事。OnFinalMessage在窗口过程的最后一次调用完成之前调用-另一方面,在接收WM_NC_DESTROY消息时调用PostNcDestroy但是,如果在处理另一个窗口消息的过程中窗口被销毁,PostNcDestroy将在另一个窗口消息处理程序完成之前出现DWM_NC_DESTROY被认为是窗口接收到的最后一条消息,并且由于窗口关闭而由框架发送。(即来自对DestroyWindow()的调用)。您是否看到了其他情况?这是窗口接收到的最后一条窗口消息-它只是在窗口过程的最后一次调用结束之前被调用。这可能有助于未来的访问者描述PostNcDestroy不够晚的原因。可能有助于未来的访问者描述PostNcDestroy不够晚的原因。
    void MyWindow::OnFinalMessage(HWND hWnd)
    {
        delete this;
    }