分析MFC中CDialog的子类对象如何知道自己是model还是modeless的

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

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

看到了吧, m_nFlags & WF_MODALLOOP就是用来判断本dialog是用DoModal还是直接Create创建的。
如果为true表示为model否则为modeless
注意:以上仅为现在MFC中CDialog中可用,其他lib,如WTL并不通用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值