我在主窗口上通过按下一个按钮弹出一个模式对话框,可是发现一个问题。
当我要退出这个模式对话框时,我用的是点击右上角窗口标题栏里的叉,结果关闭模式对话框的同时,主窗口也被关闭了。
这是为什么呢?
请高手指教。
当我要退出这个模式对话框时,我用的是点击右上角窗口标题栏里的叉,结果关闭模式对话框的同时,主窗口也被关闭了。
这是为什么呢?
请高手指教。
解决方案 »
- VC中出现的程序运行有时出现终止的问题,可能是多线程的原因,求大神解答,非常感谢
- mfc疑惑
- 考上研究生了,散分
- 请教关于变量间调用和非模态对话框的问题,谢谢!
- 请高手帮忙.VC6.0 中使用 MSXML2时的问题
- 如何实现鼠标反转
- 如何捕获另一个类中的按钮按下时的消息?
- 一个com对象能不能自杀?(在成员函数中delete this)
- 请大家介绍几本有关网络编程的比较好的书
- 问下高手:VC难道不支持这种写法:float mylog2(x) double x;?
- 在VC.NET里怎么调用一个封装在DLL里的COM组件啊,谢谢!!!急问!!!!!
- 请教如何使对话框和其中的BUTTON随着屏幕分辨率的改变而改变大小?
请指教
//这是我那个弹出的对话框的代码,父对话框为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();
}
在父对话框的代码中没有退出之类的函数