zoukankan      html  css  js  c++  java
  • 分析MFC中CDialog的子类对象如何知道自己是model还是modeless的

    DoModal源代码关键部分如下
     1if (CreateDlgIndirect(lpDialogTemplate,
     2                        CWnd::FromHandle(hWndParent), hInst))
     3        {
     4            if (m_nFlags & WF_CONTINUEMODAL)
     5            {
     6                // enter modal loop
     7                DWORD dwFlags = MLF_SHOWONIDLE;
     8                if (GetStyle() & DS_NOIDLEMSG)
     9                    dwFlags |= MLF_NOIDLEMSG;
    10                VERIFY(RunModalLoop(dwFlags) == m_nModalResult);
    11            }

    相对于CDialog的Create,DoModal多了一个RunModalLoop()这么一个消息循环(当然也有一些别的,比如在创建窗口之前disable父窗口)。因此关键在这个函数里,看进去,在文件VC\atlmfc\src\mfc\wincore.cpp里
     1int CWnd::RunModalLoop(DWORD dwFlags)
     2{
     3    ASSERT(::IsWindow(m_hWnd)); // window must be created
     4    ASSERT(!(m_nFlags & WF_MODALLOOP)); // window must not already be in modal state
     5
     6    // for tracking the idle time state
     7    BOOL bIdle = TRUE;
     8    LONG lIdleCount = 0;
     9    BOOL bShowIdle = (dwFlags & MLF_SHOWONIDLE) && !(GetStyle() & WS_VISIBLE);
    10    HWND hWndParent = ::GetParent(m_hWnd);
    11    m_nFlags |= (WF_MODALLOOP|WF_CONTINUEMODAL);
    12    MSG *pMsg = AfxGetCurrentMessage();
    13
    14    // acquire and dispatch messages until the modal state is done
    15    for (;;)
    16。。。。。。for内的消息之类的略掉。。。。
    17ExitModal:
    18    m_nFlags &= ~(WF_MODALLOOP|WF_CONTINUEMODAL);
    19    return m_nModalResult;
    20}

    看到了吧,
    m_nFlags & WF_MODALLOOP就是用来判断本dialog是用DoModal还是直接Create创建的。
    如果为true表示为model否则为modeless
    注意:以上仅为现在MFC中CDialog中可用,其他lib,如WTL并不通用
  • 相关阅读:
    类中代码执行顺序 及 组合
    初识面向对象
    内置函数及匿名函数 补充
    生成器 补充
    再回首 基本数据类型和 if语句
    day 023-python 包
    day022 python (re模块和 模块)
    day021python 正则表达式
    day 020 常用模块02
    android studio 菜鸟实战项目 之 点击事件以及动态添加
  • 原文地址:https://www.cnblogs.com/cutepig/p/1418106.html
Copyright © 2011-2022 走看看