分析mfc中cdialog的子类对象如何知道自己是model还是modeless的.
DoModal源代码关键部分如下 1
if (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
}

2

3

4

5

6

7

8

9

10

11

相对于CDialog的Create,DoModal多了一个RunModalLoop()这么一个消息循环(当然也有一些别的,比如在创建窗口之前disable父窗口)。因此关键在这个函数里,看进去,在文件VC\atlmfc\src\mfc\wincore.cpp里
1
int 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内的消息之类的略掉。。。。
17
ExitModal:
18
m_nFlags &= ~(WF_MODALLOOP|WF_CONTINUEMODAL);
19
return m_nModalResult;
20
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

看到了吧,m_nFlags & WF_MODALLOOP就是用来判断本dialog是用DoModal还是直接Create创建的。
如果为true表示为model否则为modeless
注意:以上仅为现在MFC中CDialog中可用,其他lib,如WTL并不通用