MFC中模态对话框详解

本文详细介绍了MFC中模态对话框的概念和工作原理,包括模态对话框与非模态对话框的区别,创建模态对话框的步骤,以及模态对话框的消息循环。通过对比GetMessage和PeekMessage,解析了模态对话框中局部消息循环的必要性和作用。
摘要由CSDN通过智能技术生成
  1. 模态对话框

在涉及GUI程序开发的过程中,常常有模态对话框以及非模态对话框的概念

模态对话框:在子界面活动期间,父窗口是无法进行消息响应。独占用户输入
非模态对话框:各窗口之间不影响

主要区别:非模态对话框与APP共用消息循环,不会独占用户。
模态对话框独占用户输入,其他界面无法响应

在用户层的主要逻辑如下:

TestDlg dlg;

if (dlg.DoModal() == IDOK)
{
           //处理完毕后的操作
}
.......//后续处理

在具体实现中,有如下几个步骤:
1. 让父窗口失效 EnableWindow(parentWindow, FALSE)
2. 建立模态对话框自己的消息循环(RunModalLoop)
3. 直至接收关闭消息,消息循环终止,并销毁窗口。

INT_PTR CDialog::DoModal()
{
    //对话框资源加载
    ......

    //在创建模态窗口之前先让父窗口失效,不响应键盘、鼠标产生的消息
    HWND hWndParent = PreModal();
    AfxUnhookWindowCreate();
    BOOL bEnableParent = FALSE;

    if (hWndParent && hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))
    {
        ::EnableWindow(hWndParent, FALSE);
        bEnableParent = TRUE;
                .......
    }

    //创建模态窗口,并进行消息循环,若窗口不关闭,则循环不退出
    AfxHookWindowCreate(this);
    VERIFY(RunModalLoop(dwFlags) == m_nModalResult);

    //窗口关闭,销毁窗口
    DestroyWindow();
    PostModal();

    <
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值