http://community.csdn.net/Expert/topic/3416/3416073.xml?temp=.5062525
问了好几天,都不见有人会啊,怎么了????

解决方案 »

  1.   

    我说的意思就是先启动一个dialog,当dialog消失的时候,再生成一个窗口。可是生成这个窗口的时候一闪就不见了呢?为什么 
    BOOL CConferClientApp::InitInstance()
    {
            CPLoginDialog pLogin;
             m_pMainWnd=&pLogin;
    int nResponse = pLogin.DoModal();
    if (nResponse == IDOK)
    {
              CShowControlWnd *pWnd=new CShowControlWnd;
              pWnd->Create();
     pWnd->ShowWindow(SW_SHOW);
              pWnd->UpdateWindow();
     m_pMainWnd=pWnd;
    }
    else if (nResponse == IDCANCEL)
    {
       IsInMain=false;
       PostQuitMessage(0);
    }    
        delete pLogin;
        return true;
    }
    可是这个窗口只闪一下就不见了呢?
      

  2.   

    很显然啊,因为你前面的dialog是模态对话框,当调用DoModal()后,主线程会等待这个对话框运行结束才退出,所以这时候你可以很轻松的操作login对话框。但你创建的pWnd可不是这样啊。如果CShowControlWnd是个对话框的话,那么,你用Create方式创建就是建立了一个非模态对话框。非模态对话框是不阻塞主线程的。因此在pWnd->ShowWindow(SW_SHOW)后,程序是继续向下执行的!!!一直执行到return true后,整个应用程序就结束了!因此你只能看到窗口闪一下而已。
    要想不退出,你就必须想办法阻塞主线程,要么用模态对话框,要么就要做个循环之类的,总之程序不能运行到return true,否则就整个应用程序运行结束了。
    明白了么???
      

  3.   

    明白了,那怎么让他阻塞呢?如果设置为m_pMainWnd就可以阻塞着,但是如果那样生成的dialog就不能在里面实现窗口的WM_PAINT()调用了,我是发送消息让重会的,必须AfxGetApp->m_pMainWnd->SendMessage()。如果this->SendMessage()就不行,出现异常,说是找不到这个窗口IsWindow(m_hWnd)?,我觉得就出在这里了
      

  4.   

    BOOL CConferClientApp::InitInstance()
    {
    CPLoginDialog pLogin; int nResponse = pLogin.DoModal();
    if (nResponse == IDOK)
    {
    CShowControlWnd oWnd;
    oWnd.DoModal(); m_pMainWnd=&oWnd;
    }
    else if (nResponse == IDCANCEL)
    {
    } return true;
    }
      

  5.   

    有两点注意:
    1、去掉pWnd->Create();后,资源ID是否已经给对话框绑定
    2、return true;是有问题的
    应该是return FALSE;
      

  6.   

    CShowControlWnd oWnd;
    oWnd.DoModal();
    ???????
    CShowControlWnd:public CWnd;
    那里来的DoModal??
      

  7.   

    奇怪,在OnInitDialog()里面
    我HWND hWnd=GetSafeHwnd();了
    可是在SendMessage(hWnd,....);却出现这个hWnd=NULL的异常呢?为什么?
      

  8.   

    //靠,你仿照一下也不行?????????????????
    BOOL CConferClientApp::InitInstance()
    {
    CPLoginDialog pLogin;
    //m_pMainWnd=&pLogin; //你把这行去掉
    int nResponse = pLogin.DoModal();
    if (nResponse == IDOK)
    {
    CShowControlWnd *pWnd=new CShowControlWnd;
    pWnd->Create();
    pWnd->ShowWindow(SW_SHOW);
    pWnd->UpdateWindow();
    m_pMainWnd=pWnd;
    }
    else if (nResponse == IDCANCEL)
    {
    }    
        //delete pLogin;
        return TRUE;
    }
      

  9.   

    我改了好几次了,如果把m_pMainWnd=&pLogin;去掉,我在这个dialog里面有个SendMessage()要发送一个消息去更新我的对话筐界面,就会出现异常操作,ASSERT(IsWindow(m_hWnd)); 这个窗口可能不存在了。所以无法更新界面。只能设置为m_pMainWnd,然后AfxGetApp->m_pMainWnd->SendMessage();
      

  10.   

    我后来找了一个跟我做的基本上一样的东西看了看,可是他的里面就可以直接调用RedrawWindwo()来更新界面,我的一更新就异常,只能这样发送消息。
      

  11.   

    sorry,国庆这几天出去了。。