您的位置:首页 > 其它

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

2011-01-12 11:05 411 查看
基于对话框或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(...));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐