接下来是我的代码(调试模式运行错误,发布没问题):
" 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
我认为这种方法有误,请问您如何解决这个问题?
答案 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);
}
....
}