本次使用情况,在一个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 CMyDialog::OnCancel()
{
SHOW_DIALOGFLOAT =false;
DestroyWindow();
}
void CMyDialog::PostNcDestroy()
{
CDialog::PostNcDestroy();
delete this;//删除当前对象
}
这样就可以通过改变SHOW_DIALOG的值来判断pDlg是否被创建了.
用代码片出来的代码,我自己都看不懂
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是否被创建了.
用代码片出来的代码,我自己都看不懂