gpt4 book ai didi

c++ - 默认 WM_DESTROY 未正确清理子窗口

转载 作者:太空宇宙 更新时间:2023-11-04 14:28:17 26 4
gpt4 key购买 nike

我有一个用于 Windows Mobile 5 的 WTL 8.0 SDI 应用程序。在下面这个人为设计的示例中,我创建了一个 View ,销毁它,然后重新创建它。但是,当它重新创建时,WM_INITDIALOG 处理程序中的断言失败,因为控件的 HWND 无效。

我注意到我可以通过在 CMyView 中处理 WM_DESTROY 并手动销毁每个子控件来解决这个问题。但是,我认为我不必这样做。 MSDN even says :

This message is sent first to the window being destroyed and then to the child windows (if any) as they are destroyed.

有人知道发生了什么事吗?

编辑:如果我处理 WM_NCDESTROY在 CMyView 中,所有的子控件句柄仍然有效! (some_control_.IsWindow()==TRUE) 这不是应该的样子......

谢谢,保罗H

class CMyView : public CDialogImpl< CMyView >,
public CWinDataExchange< CMyView >
{
// <snip> Message Map and other standard WTL macros </snip>

LRESULT OnInitDialog( UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/ )
{
DoDataExchange( FALSE );
// assertion fails within the SetWindowText() call
// atlwin.h line 876
// ATLASSERT(::IsWindow(m_hWnd));
some_control_.SetWindowText( _T( "Foo" ) );
return 0;
};

private:
CEdit some_control_;
}; // class CMyView

class CMainFrame : public CFrameWindowImpl< CMainFrame >,
public CUpdateUI< CMainFrame >,
public CMessageFilter,
public CIdleHandler
{
public:
// <snip> Message Map and other standard WTL macros </snip>

BOOL CMainFrame::PreTranslateMessage( MSG* pMsg )
{
if( CFrameWindowImpl< CMainFrame >::PreTranslateMessage( pMsg ) )
return TRUE;

return my_view_.PreTranslateMessage( pMsg );
};

LRESULT OnCreate( UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/ )
{
CMessageLoop* pLoop = _Module.GetMessageLoop();
ATLASSERT( pLoop != NULL );
pLoop->AddMessageFilter( this );
pLoop->AddIdleHandler( this );

m_hWndClient = my_view_.Create( m_hWnd );
my_view_.DestroyWindow();
m_hWndClient = my_view_.Create( m_hWnd );
};

private:
CMyView my_view_;
}; // class CMainFrame

最佳答案

创建、销毁和重新创建同一个窗口不是好的做法,您应该考虑隐藏它并在再次显示它时重新初始化您的内容。

无论如何,您的代码在重新创建时不会断言:

virtual void CMyView::OnFinalMessage(HWND)
{
some_control_.m_hWnd = 0;
}

关于c++ - 默认 WM_DESTROY 未正确清理子窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1718430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com