打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
实现非模态对话框
userphoto

2011.08.16

关注

(Abbey发表于2004-2-1 2:14:00)

具体实现步骤如下:

在资源IDE中新建一个对话框IDD_ModelssDlg,并设置为可见;
利用Wizard为这个对话框建立一个类CModelessDlg;
为CModelessDlg添加一个数据成员CDialog * m_pParent;
为CModelessDlg添加一个新的构造子CModelessDlg(CDialog * pParent),在其中将pParent赋值给m_pParent;

CModelessDlg::CModelessDlg(CDialog *pParent)
{
  m_pParent = pParent;
}

为CModelessDlg添加一个成员函数Create(),在其中调用CDialog::Create(CModelessDlg::IDD);
BOOL CModelessDlg::Create()
{
  return CDialog::Create(CModelessDlg::IDD);
}

重载OnOK()和OnCancel(),添加对DestroyWindow()的调用以销毁非模态对话框本身。
void CModelessDlg::OnOK() 
{
  UpdateData();
  DestroyWindow();
}


void CModelessDlg::OnCancel() 
{
  UpdateData(FALSE);
  DestroyWindow();
}

在CVCDlg中添加一个数据成员CModelessDlg * m_MDlg;
在CVCDlg的构造子中调用m_MDlg = new CModelessDlg(this)以构造非模态对话框对象;

CVCDlg::CVCDlg(CWnd* pParent) : CDialog(CVCDlg::IDD, pParent)
{
  m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  m_MDlg = new CModelessDlg(this);
}
在CVCDlg的析构子中调用delete m_MDlg以析构非模态对话框对象;

CVCDlg::~CVCDlg()
{
  if (m_MDlg != NULL) 
      delete m_MDlg;
}

在应用程序对话框模板中增加一个按钮并映射其点击消息至OnOpenDlg(),并在OnOpenDlg()中调用m_MDlg->Create()来创建并显示非模态对话框,将m_MDlg与显示的非模态窗口绑定;

void CVCDlg::OnOpenDlg() 
{
  if (m_MDlg->GetSafeHwnd() == NULL)
      m_MDlg->Create();
  else
      m_MDlg->SetWindowPos(&wndTopMost,300,400,NULL,NULL,SWP_NOSIZE);
}

在OnOK()中调用if (m_MDlg->GetSafeHwnd() != NULL) m_MDlg->OnOK()以实现可能已经打开的非模态对话框的数据交换。注意要进行这样的调用必须将CModelessDlg中OnOK()设置为public型,并且此时m_MDlg可能非NULL,但其可能已未与任何窗口绑定,故不能用m_MDlg != NULL来作为测试条件。在OnCancel()中同样处理。
void CVCDlg::OnOK()
{
  //此时m_MDlg可能非NULL,但其可能已未与任何窗口绑定,故不能用m_MDlg != NULL来作为测试条件,下同
  if (m_MDlg->GetSafeHwnd() != NULL) 
      m_MDlg->OnOK(); //要进行这样的调用必须将CModelessDlg中OnOK()设置为public型
      
  CDialog::OnOK();
}

void CVCDlg::OnCancel()
{
  if (m_MDlg->GetSafeHwnd() != NULL)
      m_MDlg->OnCancel();  //要进行这样的调用必须将CModelessDlg中OnCancel()设置为public型

  CDialog::OnCancel();
}

另有:利用SetWindowPos()函数以设置窗口的位置,用CenterWindow()使窗口自动居中(基于VC++2.0以上版本)。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
CLRCDlg::CLRCDlg(CWnd* pParent /*=NULL*/): CDialog(CLRCDlg::IDD, pParent)
【原创】如何在VC++中两个对话框相互传递信息
非模态对话框
第一次在VS2010下MFC采用ADO方式连接ACCESS数据库(详细过程)
转贴:vc的模态对话框和非模态对话框
VC对话框隐藏运行 (四)悬浮窗
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服