[置顶] 解决GetDlgItem 使用时出现ASSERT(::IsWindow(m_hWnd))断言

基于对话框或SDI的情况下,有时手动添加,或从ToolBox拖动控件(比如CEdit, CListBox等)用于工程。当使用父窗口的GetDlgItem函数对这些控件进行操作时,会有时弹出断言。比如下面的代码段:

CWnd* pwnd = GetDlgItem(IDE_EDIT_CODE); // CEdit派生类 if (pwnd != NULL ) { pwnd->DestroyWindow(); }

就会在主程序结束的时候弹出断言。断言追踪到下面代码

 CWnd* CWnd::GetDlgItem(int nID) const { ASSERT(::IsWindow(m_hWnd)); if (m_pCtrlCont == NULL) return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID)); else return m_pCtrlCont->GetDlgItem(nID); }

停止在ASSERT(::IsWindow(m_hWnd)); 这个地方

 

暂时解决的方式可以用下面代码:

if (::IsWindow(GetSafeHwnd())) { CWnd* pwnd = GetDlgItem(IDE_EDIT_CODE); // CEdit派生类 if (pwnd != NULL ) { pwnd->DestroyWindow(); } }

 

总结:看来要在父窗口中操作其内含控件的时候,或者要使用父窗口的方法的时候加上一个判断是必要的:

if (::IsWindow(m_hWnd)) { ... } // or if ( ::IsWindow(GetSafeHWnd())) { ... } // or ASSERT( ::IsWindow(...));

你可能感兴趣的:(null,ide)