模态对话框和非模态对话框

IT教程 4年前 (2020) https://www.55wd.com

模态对话框

MFC中的模态对话框与非模态对话框

模态对话框创建:

MyDialog mydlg;
mydlg.DoModal()

当前只能运行此模态对话框,且停止主窗口的运行,直到模态对话框退出,才允许主窗口运行。

模态对话框的关闭顺序:

OnClose:按关闭符号X后,响应WM_CLOSE消息

OnKillFocus:窗口即将失去输入焦点,响应WM_KILLFOCUS消息

OnDestroy:窗口即将被销毁时,响应WM_DESTROY消息

OnNcDestroy:窗口被销毁或,响应WM_NCDESTROY消息

PostNcDestroy:由onNcDesyroy调用,是Cwnd虚函数

非模态对话框通常是通过new创建的:

MyDialog *mydlg = new MyDialog;
mydlg->Create(IDD_DIALOG1,this);
mydlg->ShowWindow(SW_SHOW);

非模态对话框关闭顺序:

OnClose:按关闭符号X后,响应WM_CLOSE消息

OnDestroy:窗口即将被销毁时,响应WM_DESTROY消息

OnNcDestroy:窗口被销毁或,响应WM_NCDESTROY消息

PostNcDestroy:由onNcDesyroy调用,Cwnd函数

为了销毁对话框指针,可以在对话框类中重载PostNcDestroy,添加delete this。

void MyDialog::PostNcDestroy()
{
    CDialogEx::PostNcDestroy();
    delete this;
}

注意:

Onclose函数结束后实际上又调用了Oncannel,Oncannel中调用的是EndDialog(),该函数用于关闭模态对话框。其工作原理为:enddialog是用来结束domodal的循环使用的,domodal内部结束后有destroywindow的调用。但是对于非模态对话框,因其没有domodal循环,故就不会自动调用destroywindow函数,也就没有后续的ondestroy等操作,所以非模态对话框要重载oncannel函数,直接执行destroywindow。

void MyDialog::OnCancel()
{
    DestroyWindow();
}

关闭非模态对话框的注意事项MSDN上也有说明[1]:

When you implementa modeless dialog box, always override the OnCancel member function and call DestroyWindow from within it. Don't call thebase class CDialog::OnCancel, because it calls EndDialog, which will make the dialog box invisible but willnot destroy it. You should also override PostNcDestroy for modeless dialog boxes inorder to delete this, since modeless dialog boxes areusually allocated with new. Modal dialog boxes are usuallyconstructed on the frame and do not need PostNcDestroy cleanup

除了点击关闭符号关闭对话框外,MFC还可以通过OnOK(),OnCancle()关闭对话框,二者分别对应默认对话框界面上的”确定”和”取消”按钮,两个函数都是CDialog类的virtual成员函数,两个函数有一个共同点,就是都会调用EndDialog。

因此,若要通过OnOK或OnCancle关闭非模态对话框,则仍需要对其进行重载,使其调用DestroyWindow。

现在实现一个应用:

在一个基于对话框的MFC程序中,点击按钮,弹出另一个子对话框,在弹出的子对话框中输入一串字符串,点击按钮,子对话框关闭,主对话框上显示输入的字符串。

右击资源视图中Dialog标签,选择插入Dialog,双击插入的对话框,进入MFC添加类向导,添加一个与该对话框绑定的对话框类:

模态对话框和非模态对话框

我们将添加的dialog编辑成如下形式。编辑框接收输入,点击button1,将从编辑框中取输入,销毁dialog,并将结果传递给父对话框。

模态对话框和非模态对话框

主对话框也编辑成相同形式,编辑框用于显示输出,点击button1将产生一个子对话框。

下面分别实现弹出模态和非模态对话框。

(1)模态对话框

父对话框按钮响应:

模态对话框和非模态对话框

void CModalTestDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    Mydialog mydlg;
    if(IDOK==mydlg.DoModal())
    {
        outstr=mydlg.instr;
    }
    GetDlgItem(IDC_EDITOUTPUT)->SetWindowText(outstr);
}

模态对话框和非模态对话框

子对话框的按钮响应:

模态对话框和非模态对话框

void Mydialog::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    GetDlgItem(IDC_EDITINPUT)->GetWindowText(instr);//取输入字符串
    CDialogEx::OnOK();//关闭对话框并返回IDOK
}

模态对话框和非模态对话框

一个MFC窗口对象包括两方面的内容:一是窗口对象封装的窗口,即存放在m_hWnd成员中的HWND(窗口句柄),二是窗口对象本身是一个C++对象。要删除一个MFC窗口对象,应该先删除窗口对象封装的窗口,然后删除窗口对象本身。当Domodal返回时,模态对话框窗口已经销毁,但对话框类仍然存在,股可以直接从mydlg中取输入变量。mydlg属于局部变量,OnBnClickedButton1执行完后,自动销毁。

(2)非模态对话框

父对话框按钮响应:

模态对话框和非模态对话框

void CModelessTestDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    Mydialog *mydlg = new Mydialog;
    mydlg->Create(IDD_DIALOG1, this);
    mydlg->ShowWindow(SW_SHOW);
}

模态对话框和非模态对话框

子对话框按钮响应:

模态对话框和非模态对话框

void Mydialog::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    CString *instr=new CString;
    GetDlgItem(IDC_EDITINPUT)->GetWindowText(*instr);
    HWND parhwnd=GetParent()->m_hWnd;//取得父窗口句柄
    ::PostMessage(parhwnd,WM_UPDATE,(WPARAM)instr,0);//向父窗口发消息
    OnCancel();
}

模态对话框和非模态对话框

为了将字符串从子对话框向父对话框传递,我们使用了Postmessage发送自定义消息WM_UPDATE。因为父对话框Create了一个非模态对话框后就立即返回了,并不能像对模态对话框那样等待其结束直接取结果。

在子对话框中使用了OnCancle关闭对话框,故需要对其进行重载:

模态对话框和非模态对话框

void Mydialog::OnCancel()
{
    // TODO: 在此添加专用代码和/或调用基类

    //CDialogEx::OnCancel();
    DestroyWindow();
}

模态对话框和非模态对话框

另外还需重载PostNcDestroy:

模态对话框和非模态对话框

void Mydialog::PostNcDestroy()
{
    // TODO: 在此添加专用代码和/或调用基类

    CDialogEx::PostNcDestroy();
    delete this;
}

模态对话框和非模态对话框

可以通过MFC类向导找到要重载的虚函数:

模态对话框和非模态对话框

在父对话框类中定义消息响应函数,将子对话框发来的消息参数转为字符串显示:

模态对话框和非模态对话框

//消息响应函数
LRESULT CModelessTestDlg::Onupdate(WPARAM wParam, LPARAM lParam)
{
    CString * outstr =(CString*)(wParam);
    GetDlgItem(IDC_EDITOUTPUT)->SetWindowText(*outstr);
    delete outstr;
    return true;
}

模态对话框和非模态对话框

源码:MFC模态非模态对话框

模态对话框和非模态对话框

京东店铺自营和非自营到底有什么区别?

网络的发展,也造就了电商的发展,到现如今,可以说很多人都是喜欢在网上进行物品的购买。不过网上购买商品的话,对于商品的质量也是需要

O2O是营销方式非商业模式?

摘要 : 在O2O商业模式无法成立的情况下,O2O作为营销的方式是个不错的选择,但这只是短暂的争取实体店进行以上进化的时间罢了,毕竟“

2018腾讯实习生招聘面经(非提前批、后台开发岗)已拿offe

博主坐标哈尔滨,哈尔滨工程大学本硕。4月9号收到的面试通知。地点在正明锦江大酒店12层,4月11日9:40一面。 一面: 产品岗、技术岗都

ps非主流树下黑丝美女教程

我们需要的主色是青色,调色的时候可以把素材中的绿色都转为青色,暗部则转为青蓝色,然后把整体颜色调淡一点,局部柔化处理即可。最终效

开机显示文件BOOT.INI非法正从C:\windows\启动怎么

当我们开启我们的电脑的时候,会开到加载开机启动项时提示文件BOOT.INI非法正从C:\windows\启动这个情况。出现这个情况我们该怎

文章回顾

大家看了本文模态对话框和非模态对话框的精彩教程资源内容,是不是对模态对话框和非模态对话框了解更多,真心希望模态对话框和非模态对话框能帮助到你, 小编会一直给你带来更多教程资源文章信息。

版权声明: 发表于 2020-01-12 17:12:03。

本文由第三方用户分享仅代表作者观点,不代表本网站立场,秉承互联网开放分享的精神,目的在于传递更多信息,加强各行业互通交流,但对内容不作任何保证或承诺,请读者自行参考斟酌。网站发布的信息(包含但不限于版式、图片、字体、文章等素材)由第三方用户分享,版权归原作者所有,本站不承担任何相关的版权纠纷等相关责任。如您认为本篇内容侵犯了您的权益,请与我们联系,我们会及时处理。

豌豆资源网专注分享全网综合资源网站大全,致力于超实用的内容资源搜索。

转载请注明:
本文标题:模态对话框和非模态对话框
本文地址:https://www.55wd.com/s43713/