本次使用情况,在一个view中通过点击按钮,产生非模态对话框 1.创建非模态对话框 MyView.h CMyDialog*pDlg;//在头文件声明全局指针,方便调用 MyView.cpp CMyView::CMyView(Void) { ... pDlg =NULL;//构造函数初始化 } CMyView::CreateDialog()//产生对话框 { pDlg=new CDialogFloat; pDlg->Create(IDD_MYDIALOG); SHOW_DIALOGFLOAT =true; pDlg->ShowWindow(SW_SHOW); } MyDialog.h //重载OnCancel(),PostNcDestroy()函数 virtual void OnCancel(); virtual void PostNcDestroy(); MyDialog.cpp //销毁对话框 void CMyDialog::OnCancel() { DestroyWindow(); } void CMyDialog::PostNcDestroy() { CDialog::PostNcDestroy(); delete this;//删除当前对象 } 这样写,最基本的创建和销毁就能实现了,但这样点击第二次就会出现重复创建,这个时候一般用pDlg!=NULL,pDlg->IsWindowVisible()判断,因为pDlg在头文件被声明,又没有经过构造函数初始化,因为view没有重新构造,所以符合pDlg!=NULL,但是没有定义,所以判断pDlg->IsWindowVisible()就会报错.我一开始认为是delete的时候没有初始化,但是因为CMyDialog并不是CMyView的子类,不能用getparent()得到pDlg最后也就不了了之,至于是不是,我也无法得知,最后我选择使用一个全局的bool变量解决问题,extern也许会拖慢程序速度,但考虑良久,还是没有想出好的办法,最后也无奈妥协,希望有好的办法的朋友能够告知一下,感激不尽.本人邮箱18352538433@163.com temporary.cpp bool SHOW_DIALOG; MyView.cpp extern bool SHOW_DIALOG; CMyView::CMyView(Void) { ... SHOW_DIALOG =false;//构造函数初始化 } CMyView::CreateDialog()//产生对话框 { if (!SHOW_DIALOG) { pDlg=new CDialogFloat; pDlg->Create(IDD_MYDIALOG); SHOW_DIALOGFLOAT =true; pDlg->ShowWindow(SW_SHOW); } }
void CViewUserDefIndex::SendDlgData()//调用pDlg
{ if(SHOW_DIALOGFLOAT)
{
if(pDlg->IsWindowVisible())
{ pDlg->m_temp1.SetWindowText(m_text1);
pDlg->m_temp2.SetWindowText(m_text2);
}
}
}
MyDialog.cpp //销毁对话框 void CMyDialog::OnCancel() { SHOW_DIALOGFLOAT =false; DestroyWindow(); } void CMyDialog::PostNcDestroy() { CDialog::PostNcDestroy(); delete this;//删除当前对象 } 这样就可以通过改变SHOW_DIALOG的值来判断pDlg是否被创建了. 用代码片出来的代码,我自己都看不懂
转载请注明原文地址: https://ju.6miu.com/read-1302002.html