mfc非模态对话框的使用

本次使用情况,在一个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是否被创建了.
用代码片出来的代码,我自己都看不懂再见

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值