【问题标题】:VS2017 MFC Assert: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin2.inl Line:84VS2017 MFC 断言:f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin2.inl 行:84
【发布时间】:2017-11-23 15:23:58
【问题描述】:

接下来是我的代码(debug模式运行出错,release没问题):

从CFormView派生的“CControlPanel”类

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

我觉得这种做法是错误的,请问您如何解决这个问题?

【问题讨论】:

    标签: c++ mfc


    【解决方案1】:

    看起来OnSizem_CountList 的窗口创建之前或尚未附加到Windows 窗口之前被调用——没有HWND 句柄。您会从框架中获得ASSERTs,您将尝试在没有句柄的情况下调用 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

    【讨论】:

    • 非常感谢,你的方法解决了我的问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多