我有一个给予SDI模式的界面程序,名为client,  现在在client.cpp的BOOL CclientApp::InitInstance()函数中弹出一个登录对话框: 
     DialogLogin login_in;
INT_PTR ret;
ret=login_in.DoModal();
现在我想做的是,只有登录成功后才取消login_in 这个对话框,所以我建立了一个登录线程,在点击原来的 OnOK函数相当于启动登录线程,并不执行真正的 OnOk操作。
void DialogLogin::OnBnClickedOk()
{
……
AfxBeginThread(LoginThread, NULL);
……
}
   在登录线程成功登录后我想发送OnOK消息,但是出错, 屏蔽的语句都是出错的
UINT LoginThread(LPVOID lParam)
{
//g_hWndMain->SendMessage(WM_DESTROY,0,0);
//AfxGetMainWnd()->SendMessage(WM_DESTROY,0,0);
//GetForegroundWindow->SendMessage(WM_DESTROY,0,0);
//::SendMessage(theApp.) return 0;}
 请问OnOK的消息机制到底怎么的?现在应该怎么做, 谢谢!

解决方案 »

  1.   

    点击OK后,对话框就会自动销毁,除非不调用父类的OnOk函数,这样你重复销毁,可能会出错.
     再就是AfxGetMainWnd得到的是整个应用程序的主窗口,你给应用程序的主窗口发送销毁消息,
     而你现在产生的又是模态对话框,此时只能处理你这个对话框线程的消息,其他的窗口的消息将无法处理,
    这样也可能出错,建议使用GetParent()或者是CDialog::OnOk()
      

  2.   

    看你注释中的代码是在想主窗口发消息,你这个应该是要向那个对话框发消息吧,你可以把对话框的指针作为参数传进线程,或者作为一个全局变量,然后在线程里面调用“pDlg->SendMessage()”
      

  3.   

    不需要使用线程。
    既然要登录后才能使用,则得等待登录的结果,因此在登录对话框里直接做登录的过程。在app里
    if (dlg.DoModal() == IDOK)
    {
      //go on
    }
      

  4.   

    应该在DialogLogin类的OnOK中来判断是否登录成功,如果成功才执行 CDialog::OnOK()。OnOK这个虚函数其实是响应确认按钮的点击事件中调用的,或者当确认按钮是默认按钮,而用户按下了回车键也是激发按钮的点击事件,从而引起OnOK被调用。
      

  5.   

    不需要那么复杂吧。直接在自己的OnOK里执行登陆函数,成功就OnOK,不成功便弹出错误信息返回。
      

  6.   


    不太清楚你的真实问题何在。如果是我我会这样:OnOK() //你的"登录"
    {   
        if(登录成功)
          CDialog::OnOK();
         else
          MessageBox(_T("登录失败!"));
        //函数退出,对话框仍存在.
    }OnCancel()
    {
       CDialog::OnCancel();
    }外界只要判断 DoModal() 返回值就知道是不是登录成功了.建议把对话框的弹出放在 CApp 的初始化之中,而不是主窗口出现之后,这样你可以方便地不露痕迹地退出程序.