我在美化一个程序的界面,可以正常运行显示美化的界面,但关闭程序后系统弹出Debug Assertion Failed对话框,经过调试我发现问题是在LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)这个函数里,函数里没有这句 if (!::IsWindow(m_hWnd))
return lrst;时就会弹出上面的对话框,不知道这个语句作用是什么?请指教。
LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
LRESULT lrst=CFrameWnd::DefWindowProc(message, wParam, lParam);
if (!::IsWindow(m_hWnd))
return lrst;
//如果是以下消息则调用重绘函数对框架进行重绘
if(message==WM_NCPAINT||WM_NCACTIVATE||WM_MOVE||WM_NOTIFY)
{
CDC* pWinDC=GetWindowDC();
if(pWinDC)
DrawFrame(pWinDC);//这个函数是对框架进行贴图
ReleaseDC(pWinDC);
}
return lrst;
}
先谢过了~~

解决方案 »

  1.   

    能否解释下为什么不加这句就弹出弹出Debug Assertion Failed对话框,加上就不弹出哪?
      

  2.   

    if (!::IsWindow(m_hWnd)) 
    假如Not IsWindow,那么就返回了。
    你去掉了,窗口句柄无效,又继续执行,自然Debug Assertion Failed。
    看看Debug Assertion Failed对话框显示的是哪个文件第几行,去那看看是哪个函数需要用到m_hWnd。
      

  3.   

    如果没这句,如果窗口销毁无效了,你下面再对窗口句柄进行操作,MFC为了在调试时发现错误弹出Assert(也就是你看到的)。出现这种情况大多数时候你程序有问题,如果你确认没问题,可以用你所提到的IsWindow(m_hWnd)来提前返回。
      

  4.   

    经过指点搞清楚了:当我点击关闭按钮时,在CMainFrame::DefWindowProc()函数中的message为WM_CLOSE,执行LRESULT lrst=CFrameWnd::DefWindowProc(message, wParam, lParam); 这句后程序就应该结束了,m_hWnd句柄message就无效了,没有if (!::IsWindow(m_hWnd)) return lrst; 时继续往下执行就报错了。
      

  5.   

    一般正确做法把DefWindowProc()放到最后。