BOOL CWnd::Attach(HWND hWndNew)
{
ASSERT(m_hWnd == NULL); // only attach once, detach on destroy//出现在这一行
ASSERT(FromHandlePermanent(hWndNew) == NULL);//还有这一行也出现断言错误
// must not already be in permanent map
// now hook into the AFX WndProc
WNDPROC* lplpfn = GetSuperWndProcAddr();
WNDPROC oldWndProc = (WNDPROC)::SetWindowLongPtr(hWnd, GWLP_WNDPROC,
(INT_PTR)AfxGetAfxWndProc());
ASSERT(oldWndProc != AfxGetAfxWndProc());//这一行也出现了 if (*lplpfn == NULL)
*lplpfn = oldWndProc;
else if (*lplpfn != oldWndProc)
{
TRACE(traceAppMsg, 0, "Error: Trying to use SubclassWindow with incorrect CWnd\n");
TRACE(traceAppMsg, 0, "\tderived class.\n");
TRACE(traceAppMsg, 0, "\thWnd = $%08X (nIDC=$%08X) is not a %hs.\n", (UINT)(UINT_PTR)hWnd,
_AfxGetDlgCtrlID(hWnd), GetRuntimeClass()->m_lpszClassName);
ASSERT(FALSE);//还有这一行
// undo the subclassing if continuing after assert
::SetWindowLongPtr(hWnd, GWLP_WNDPROC, (INT_PTR)oldWndProc);
}
给位麻烦给我分析分析原因
{
ASSERT(m_hWnd == NULL); // only attach once, detach on destroy//出现在这一行
ASSERT(FromHandlePermanent(hWndNew) == NULL);//还有这一行也出现断言错误
// must not already be in permanent map
// now hook into the AFX WndProc
WNDPROC* lplpfn = GetSuperWndProcAddr();
WNDPROC oldWndProc = (WNDPROC)::SetWindowLongPtr(hWnd, GWLP_WNDPROC,
(INT_PTR)AfxGetAfxWndProc());
ASSERT(oldWndProc != AfxGetAfxWndProc());//这一行也出现了 if (*lplpfn == NULL)
*lplpfn = oldWndProc;
else if (*lplpfn != oldWndProc)
{
TRACE(traceAppMsg, 0, "Error: Trying to use SubclassWindow with incorrect CWnd\n");
TRACE(traceAppMsg, 0, "\tderived class.\n");
TRACE(traceAppMsg, 0, "\thWnd = $%08X (nIDC=$%08X) is not a %hs.\n", (UINT)(UINT_PTR)hWnd,
_AfxGetDlgCtrlID(hWnd), GetRuntimeClass()->m_lpszClassName);
ASSERT(FALSE);//还有这一行
// undo the subclassing if continuing after assert
::SetWindowLongPtr(hWnd, GWLP_WNDPROC, (INT_PTR)oldWndProc);
}
给位麻烦给我分析分析原因
可能是两次 DDX_Control 关联了同一个控件
比如,断言(正常人每天吃三餐),如果你吃了三餐,那就是正常的,否则,你就会饿肚子ASSERT(m_hWnd == NULL),在函数执行前的时刻,断定,m_hWnd是空的,也就是你的窗口类还没有跟别的窗口关联,如果m_hWnd 不为空,意味着你的程序发生了错误