VS2017 MFC断言:f:\ dd \ vctools \ vc7libs \ ship \ atlmfc \ include \ afxwin2.inl行:84

时间:2017-11-23 15:23:58

标签: c++ mfc

接下来是我的代码(调试模式运行错误,发布没问题):

  

" CControlPanel"从CFormView派生的类

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
    m_wndSplitterFrame.CreateStatic(this, 2, 1);
    m_wndSplitterFrame.CreateView(0, 0, RUNTIME_CLASS(CControlPanel), CSize(0, 180), pContext);  //assert error line
    m_wndSplitterSchema.CreateStatic(&m_wndSplitterFrame, 1, 2, WS_CHILD | WS_VISIBLE, m_wndSplitterFrame.IdFromRowCol(1, 0));
    m_wndSplitterSchema.CreateView(0, 0, RUNTIME_CLASS(CTabView), CSize(250, 200), pContext);
    m_wndSplitterData.CreateStatic(&m_wndSplitterSchema, 1, 2, WS_CHILD | WS_VISIBLE, m_wndSplitterSchema.IdFromRowCol(0, 1));
    m_wndSplitterData.CreateView(0, 0, RUNTIME_CLASS(CItemsListView), CSize(700, 0), pContext);
    m_wndSplitterData.CreateView(0, 1, RUNTIME_CLASS(CDetailHtmlView), CSize(0, 0), pContext);
    ....
}

但我评论说" OnSize"没有断言错误!

void CControlPanel::OnSize(UINT nType, int cx, int cy)
{
    CFormView::OnSize(nType, cx, cy);
#ifndef _DEBUG
    RECT rect1;
    m_CountList.GetWindowRect(&rect1);
    ScreenToClient(&rect1);
    ....
    m_CountList.MoveWindow(&rect1);
    ....
#endif
}

搜索说添加以下代码来解决。

AfxWinInit(::GetModuleHandle(NULL),NULL,::GetCommandLine(),0);

但是这个错误:f:\ dd \ vctools \ vc7libs \ ship \ atlmfc \ src \ mfc \ appinit.cpp

我认为这种方法有误,请问您如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

OnSize的窗口创建或尚未附加到Windows窗口之前看起来m_CountList被调用 - 没有HWND句柄。您将ASSERT形成框架,您将尝试在没有句柄的情况下调用API。在发布版本中,断言被删除,这就是您没有得到这些错误的原因。

MFC CWnd派生类有一个对应的 Windows 窗口对象HWND,它们调用它们附加操作。

在调用调用需要窗口句柄的Windows API函数的方法之前,您可以通过检查其句柄来测试控件/窗口对象是否附加了窗口对象。

void CControlPanel::OnSize(UINT nType, int cx, int cy)
{
    CFormView::OnSize(nType, cx, cy);

    if (m_CountList.GetSafeHwnd())
    {
        RECT rect1;
        m_CountList.GetWindowRect(&rect1);
        ScreenToClient(&rect1);
         ....
        m_CountList.MoveWindow(&rect1);
     }
     ....
 }

另见ASSERT(::IsWindow(m_hWnd)) fails in Afxwin2.inl