EndDialog()方法怎么不能立即关掉对话筐,那么还有什么办法么?

解决方案 »

  1.   

    谢谢楼上的两位,但试了一下仍然不行啊:
    CCdburnerDlg dlg;
    int nResponse = dlg.DoModal();
    dlg.SendMessage( WM_CLOSE );//(或者:dlg.OnClose();
      

  2.   

    ft
    在InitDialog里settimer
    在ontimer里enddialog
      

  3.   

    Mr. goodsong :能给出具体代码么
      

  4.   

    Mr, Wind_Arrow_Hot(风之箭):谢谢以时间作触发条件,具体怎么处理
      

  5.   

    CCdburnerDlg dlg;
    int nResponse = dlg.DoModal();
    SendMessage( WM_CLOSE );
      

  6.   

    另,在
    CCdburnerDlg dlg;
    ...
    中,dlg的句柄怎么获得
      

  7.   

    canoe_eyes(阿里)先生:
    SendMessage( WM_CLOSE );编译通不过,参数怎么具体处理
      

  8.   

    在你的Dlg的OnInitDialog()中添加:
    SetTimer(1, 1000, NULL);//这里1000是一秒,你看也就是一秒钟会调用OnTimer()函数一次,你想多长时间关闭,就设多长时间;
    然后给该Dlg添加OnTimer()函数,在这它的函数体里处理:
    if(nIDEvent == 1)
        EndDialog(IDOK);//是IDOK还是IDCANCEL,由你自己选择,相当于点击了Ok或Cancel按钮;这样就没有问题了
      

  9.   

    十分感谢fengqinggao(风清高)先生,
    请看下列对话筐类的部分实现:
    BOOL CCdburnerDlg::OnInitDialog()
    {
    CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE);
    SetIcon(m_hIcon, FALSE);
    SetTimer(1,1000,NULL);   ////////
    return TRUE;  
    }afx_msg void CCdburnerDlg::OnTimer( UINT nIDEvent )
    {
    if(nIDEvent == 1)
        EndDialog(IDOK);   ////////////
    }
    然而,对话框仍不能自行关闭!
      

  10.   

    from MSDN:  EndDialog does not close the dialog box immediately. Instead, it sets a flag that directs the dialog box to close as soon as the current message handler returns.then how to implement that the current message handler returns ?
      

  11.   

    你的这个函数:
    afx_msg void CCdburnerDlg::OnTimer( UINT nIDEvent )
    {
    if(nIDEvent == 1)
        EndDialog(IDOK);   ////////////
    }
    样子很奇怪,是写错了还是?它前面不应该有“afx_msg”这个关键字啊,如果有,肯定不会调用的啊,你跟踪一下(在该函数中设断点),看看这个函数执行了没有?如其他各位所说,将EndDialog(IDOK);改为OnOK();也可以,但是这应该不是真正的问题,我的都是用前面的,没有出过错顺便提一下,这个你的OnTimer()是用ClassWizard产生的吗?
      

  12.   

    十分感谢fengqinggao(风清高)先生,
    根据你和各位的指导,问题已经解决,
    另外,
    1.怎么在对话筐类的外部而不时在OnInitDialog()中设置时间?因为我要根据外部情况决定时间长短
    2.dlg的句柄怎么获得?
      

  13.   

    有一个简单的方法:
    在你的Dlg类里定义一个:
    int m_iYourTime;
    的成员变量,然后在DoModal()之前给他赋值,用它代替你的SetTimer()函数中的1000,这样你就可以大概控制时间了。其他更科学的方法也有,可能设计到创建线程之类的,比较麻烦,呵呵
      

  14.   

    你定义的时候就有了Dlg的句柄了啊,如果你其他的地方也要用这个句柄的话,一、可以将该句柄保存(即做成类的成员变量,通过类调用);二、用FindWindow()、GetWindow()之类的函数去找。
      

  15.   

    直接发送SendMessage(WM_CLOSE);
    即可!
      

  16.   

    如果是非模态对话框,直接用SendMessage(WM_CLOSE);是可以的,如果是模态的,要用这个语句,只能另外开线程,否则只有对话框关闭之后该语句才被执行,不会起作用。
      

  17.   

    十分感谢各位,十分感谢fengqinggao(风清高)先生看来fengqinggao(风清高)先生是位高手,能不能提供出你的email地址呀?!另,话筐类上有一 ComboBox控件,对应的成员变量为mcbxCSDlg dlg;dlg.mcbx.AddString("xxxxx");int nResponse = dlg.DoModal();为何第二句出错?
      

  18.   

    此初始化句可以在OnInitDialog里写,因为它需要对话框的窗口句柄
      

  19.   

    也可以这样,pDlg->SetTimer(ID_XXX,TIME_1000,NULL);
    这里如果你以前设了timer,就killtimer
    然后调用。
      

  20.   

    如果一定要在外面,估计只能这样(在不新开线程、而且使用模态对话框的情况下):
    在你的Dlg中定义一个CStringArray的变量,设为m_saComboStr;
    然后在你的CSDlg类的OnInitDialog()函数中后面添加:
    for(int i = 0; i < m_saComboStr.GetSize(); i++)
        dlg.mcbx.AddString(m_saComboStr[i]);然后这么使用就可以了:
    CSDlg dlg;
    dlg.m_saComboStr.Add("1");
    dlg.m_saComboStr.Add("2");
    dlg.m_saComboStr.Add("3");//当然可以用循环赋值;
    …………
    int nResponse = dlg.DoModal();这种方法也只能在DoModal()前使用,其他地方也是不行的,也就是说不是任意的“外面”都可以。原因是:在DoModal()之前,对话框还没有建立,之后对话框又消失了,上面的控件也是一样,所以在DoModal()之前和之后都不能对其中的控件操作,切记切记;但是可以对它的和控件无关的成员变量操作,因为在定义的时候,他们就已经存在了,而不象控件还要生成。只是这个问题我以前碰到过而已,离高手还远呢,呵呵,互通有无吧。我的EMAIL:[email protected]