在听孙鑫老师的课程时,在第七课讲到在模态对话框中,点击Add按钮,会动态创建一个新的按钮。按照他讲的这个代码,在VS2008中运行,总会出现断言。m_btn.Create(_T("guai"),WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,CRect(0,0,100,100),this,123);以下为断言出现的地方wincore.cpp 638ASSERT(pWnd != NULL);本人初学MFC,不懂呐,不知道该如何解决。希望得到好心高手的帮助,谢谢!另外我还没有太多的分给大家,希望能得到热心人的帮助,谢谢!

解决方案 »

  1.   

    没有用过vs。你那句ASSERT(pWnd != NULL);先注释掉试试呢。 pWnd不知道是干嘛用的。
      

  2.   

    楼主应在遇到错误的时候,点击弹出窗口的调试按钮,看看到底在什么地方触发这个错误,wincore.cpp#638到底是在做什么时候出错。根据这些猜测自己哪些条件没有满足
      

  3.   

    你第二次创建的时候m_btn已经有实例了,m_btn.m_hWnd就不是NULL,ASSERT(pWnd != NULL)当然就出问题了。
    你在Add的创建代码改成就好了
    if(NULL==m_btn.m_hWnd)
    {
    m_btn.Create(_T("guai"),WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,CRect(0,0,100,100),this,123); 
    }
    else
    {
    m_btn.DestroyWindow();
    }
      

  4.   

    我机器上wincore.cpp#638在下面函数中,我估计你需要看调用堆栈,看看这个pWnd到底是什么void AFXAPI AfxHookWindowCreate(CWnd* pWnd)
    {
    _AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
    if (pThreadState->m_pWndInit == pWnd)
    return; if (pThreadState->m_hHookOldCbtFilter == NULL)
    {
    pThreadState->m_hHookOldCbtFilter = ::SetWindowsHookEx(WH_CBT,
    _AfxCbtFilterHook, NULL, ::GetCurrentThreadId());
    if (pThreadState->m_hHookOldCbtFilter == NULL)
    AfxThrowMemoryException();
    }
    ASSERT(pThreadState->m_hHookOldCbtFilter != NULL);
    ASSERT(pWnd != NULL);
    ASSERT(pWnd->m_hWnd == NULL);   // only do once ASSERT(pThreadState->m_pWndInit == NULL);   // hook not already in progress
    pThreadState->m_pWndInit = pWnd;
    }
      

  5.   

    楼主先看看这个在学学去调试吧,看看自己到底哪儿错了
    http://blog.vckbase.com/arong/archive/2005/03/30/4231.html
      

  6.   

    谢谢大家的帮助了,搞了一天,终于搞明白了,原来是在控件创建的时候,默认选择了变量和对话框中的一个按纽关联,所以调用create的时候,就会发生句柄不为空的错误