分析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并不通用

posted on 2009-03-21 00:20  cutepig  阅读(1356)  评论(0编辑  收藏  举报

导航