我在主窗口上通过按下一个按钮弹出一个模式对话框,可是发现一个问题。
当我要退出这个模式对话框时,我用的是点击右上角窗口标题栏里的叉,结果关闭模式对话框的同时,主窗口也被关闭了。
这是为什么呢?
请高手指教。

解决方案 »

  1.   

    刚试了一下,发现不论是用OnOK(),还是OnCancel都是这种情况。
    请指教
      

  2.   

    可是我根本没有给关闭窗口设置代码啊,那两个“OK”和“Cancel”按扭是vc++创建对话框时自动生成的。
      

  3.   

    // connDlg.cpp : implementation file
    //这是我那个弹出的对话框的代码,父对话框为ClientDlg#include "stdafx.h"
    #include "Client.h"
    #include "connDlg.h"
    #include "ClientDlg.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // connDlg dialog
    connDlg::connDlg(CWnd* pParent /*=NULL*/)
    : CDialog(connDlg::IDD, pParent)
    {
    //{{AFX_DATA_INIT(connDlg)
    m_iPort = 0;
    //}}AFX_DATA_INIT
    }
    void connDlg::DoDataExchange(CDataExchange* pDX)
    {
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(connDlg)
    DDX_Control(pDX, IDC_BConnect, m_btConnect);
    DDX_Control(pDX, IDC_SOURCETREE, m_MediaTree);
    DDX_Control(pDX, IDC_IPADDRESS, m_IPaddress);
    DDX_Text(pDX, IDC_PORT, m_iPort);
    DDV_MinMaxUInt(pDX, m_iPort, 1024, 65535);
    //}}AFX_DATA_MAP
    }
    BEGIN_MESSAGE_MAP(connDlg, CDialog)
    //{{AFX_MSG_MAP(connDlg)
    ON_BN_CLICKED(IDC_BConnect, OnBConnect)
    ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // connDlg message handlersvoid connDlg::OnBConnect() 
    {
    // BYTE nField0,nField1,nField2,nField3;
    // TODO: Add your control notification handler code here
    UpdateData(true); if(m_IPaddress.IsBlank())
    {
    MessageBox("请填入服务器IP地址!","IP地址未填",MB_OK);
    m_IPaddress.SetFocus();
    return;
    }
    if((m_iPort==0)&&(!m_IPaddress.IsBlank()))
    {
    MessageBox("请输入端口号","端口号不能为空或0",MB_OK);
    GetDlgItem(IDC_PORT)->SetFocus();
    return;
    } BYTE nField[4]; UpdateData(true);
    m_IPaddress.GetAddress(nField[0],nField[1],nField[2],nField[3]);
    CString sIP;
    sIP.Format("%d.%d.%d.%d",nField[0],nField[1],nField[2],nField[3]); m_clientSocket.Create();//客户端不用指定端口号
    m_clientSocket.Connect(sIP,m_iPort); m_btConnect.EnableWindow(FALSE);}BOOL connDlg::OnInitDialog() 
    { CDialog::OnInitDialog();

    // TODO: Add extra initialization here
    m_TreeImageList.Create(IDB_BITMAP1,16,5,TRUE); //16*16的位图序列
    m_MediaTree.SetImageList(&m_TreeImageList,TVSIL_NORMAL);

    return TRUE;  // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
    }void connDlg::LoadList(CString filename)
    {
    HTREEITEM HTItem,item;
    FILE *fp;
    TV_INSERTSTRUCT     TreeItem;  //树形控件的节点

    if (!(fp=fopen(filename,"r")))
    {
    MessageBox("文件打开失败。");
    return;
    }
    m_MediaTree.DeleteAllItems();
    char c,word[500];
    CString label,parm1,value1,parm2,value2,cmd;
    while(!feof(fp))
    {
    c=fgetc(fp);
    if(c=='\n')
    {
    label.Empty();
    }

    if(c=='<') //每一行开头
    {
    int i=0;
    // prec=c;
    c=fgetc(fp);
    while(c!='>')//取label
    {
    if(c=='<')
    {
    MessageBox("文件有错误");
    return;
    }
    word[i]=c;
    i++;
    c=fgetc(fp);
    }
    word[i]='\0';//一个词检索完 
    label=word;
    int pos=label.Find(' ',0);
    cmd=label.Left(pos);

    // MessageBox(label);//目前的word就是label。以上调试正常 if(cmd=="media_tree")
    {
    int pos1=label.Find('=',0);
    parm1=label.Mid(pos+1,pos1-pos-1); int pos2=label.Find('"',pos1+2); //第二个引号
    value1=label.Mid(pos1+2,pos2-pos1-2); if (m_MediaTree.GetRootItem()==NULL)//如果没有根结点
    {
    //建立根结点

    TreeItem.hParent=NULL;    //根结点
    TreeItem.hInsertAfter=TVI_SORT;
    TreeItem.item.iImage=0;
    TreeItem.item.iSelectedImage=0;
    TreeItem.item.pszText = (LPSTR)((LPCSTR)value1);
    TreeItem.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT; HTItem=m_MediaTree.InsertItem(&TreeItem);
    if (HTItem==NULL) 
    MessageBox("树根节点创建失败!"); // m_MediaTree.SelectItem(HTItem );
    // m_MediaTree.Select( HTItem, TVGN_CARET );
    m_MediaTree.Expand(HTItem,TVE_EXPAND);
    }//GetVersion
    /* int pos3=label.Find('"',pos2+1); //第三个引号
    // parm2=label.Mid(pos2+2,pos3-pos2-3); int pos4=label.ReverseFind('"');

    value2=label.Mid(pos3+1,pos4-pos3-1);
    // m_version=value2;
    // UpdateData(true);*/
    //GetVersion Over }
    else if(cmd=="nd")
    {
    int pos1=label.Find('"',0);
    int pos2=label.Find('"',pos1+1);
    value1=label.Mid(pos1+1,pos2-pos1-1); TreeItem.hParent=HTItem;       //作为上一个结点的子结点
    TreeItem.hInsertAfter=TVI_SORT;
    TreeItem.item.iImage=1;
    TreeItem.item.iSelectedImage=2;
    TreeItem.item.pszText =(LPSTR)((LPCSTR)value1);
    TreeItem.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT; HTItem=m_MediaTree.InsertItem(&TreeItem);
    UpdateData(false);
    if(HTItem==NULL) 
    MessageBox("node 节点插入失败"); m_MediaTree.Expand(HTItem,TVE_EXPAND);
    }
    else if(cmd=="media")
    {
    int pos1=label.Find('=',0);
    parm1=label.Mid(pos+1,pos1-pos-1); int pos2=label.Find('"',pos1+2); //第二个引号
    value1=label.Mid(pos1+2,pos2-pos1-2);
    int pos3=label.Find('"',pos2+1); //第三个引号
    int pos4=label.ReverseFind('"');
    value2=label.Mid(pos3+1,pos4-pos3-1);
    TV_INSERTSTRUCT     TreeItem;  //树形控件的节点
    TreeItem.hParent=HTItem;       //作为上一个结点的子结点
    TreeItem.hInsertAfter=TVI_LAST;
    TreeItem.item.iImage=3;
    TreeItem.item.iSelectedImage=4;
    TreeItem.item.pszText =(LPSTR)((LPCSTR)value1);
    TreeItem.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
    HTREEITEM leaf=m_MediaTree.InsertItem(&TreeItem);  //only插入结点,并不记录新的句柄HTItem,只记录临时句柄
    m_MediaTree.Expand(leaf,TVE_EXPAND); if (leaf==NULL) 
    MessageBox("插入媒体节点时失败"); //产生两个子结点
    TreeItem.hParent=leaf;    
    TreeItem.hInsertAfter=TVI_LAST;
    TreeItem.item.iImage=5;
    TreeItem.item.iSelectedImage=5;
    TreeItem.item.pszText =(LPSTR)((LPCSTR)value2);
    TreeItem.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
    HTREEITEM h=m_MediaTree.InsertItem(&TreeItem);  //only插入结点,并不记录新的句柄HTItem,只记录临时句柄
    if (h==NULL) 
    MessageBox("插入媒体节点的路径时失败");
    }
    if(label=="/nd")
    {
    HTItem=m_MediaTree.GetNextItem(HTItem,TVGN_PARENT);
    } //假设当前sml文件正确。分析sml文件的函数以后另作
    //如果parm为1,则是分类节点 <nd name="xxx">,parm[0]=name,val[0]=xxx
    //如果parm为2,并且label的第一个'='前面的三个字符为src则是媒体节点,
    //如果parm为2,并且label的第一个'='前面的四个字符为name则是树根节点
    //参数倒是容易检索出,如何判断树的父、子、兄弟情况? //下面要检索label里的参数了
    // int pos1=label.Find('=',0);
    // parm[0]=label.Mid(pos+1,pos1-pos-1);

    } }
    item=m_MediaTree.GetRootItem();
    m_MediaTree.Expand(item,TVE_EXPAND);
    }void connDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    LoadList("F:\\VOD test\\templist.sml");

    }void connDlg::OnOK() 
    {
    // TODO: Add extra validation here

    CDialog::OnOK();
    }
    在父对话框的代码中没有退出之类的函数
      

  4.   

    你弹出对话框的代码放在主对话框的哪个按钮下了,是你自己添加的按钮吗?我怀疑你是把它放在OK或Cancel里了,如果是这样的话,那么就不奇怪了