MFC教程(12)-- 对话框和对话框类CDialog(1)
2010-03-25 20:35:00 来源:WEB开发网Dialog命令消息和控制通知消息的处理
通过覆盖CWnd的命令消息发送函数OnCmdMsg,CDialog实现了自己的命令消息发送路径。在4.4.3.3节,曾经分析了CDialog::OnCmdMsg函数,这里给出其具体实现:
BOOL CDialog::OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo)
{
//首先,让对话框窗口自己或者基类处理
if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
//如果还未处理,且是控制通知消息或者状态更新消息或者系统命令
//则停止进一步的发送
if ((nCode != CN_COMMAND && nCode != CN_UPDATE_COMMAND_UI) ||
!IS_COMMAND_ID(nID) || nID >= 0xf000)
{
return FALSE; // not routed any further
}
//尝试给父窗口处理
CWnd* pOwner = GetParent();
if (pOwner != NULL)
{
#ifdef _DEBUG
if (afxTraceFlags & traceCmdRouting)
TRACE1("Routing command id 0x%04X to owner window.
", nID);
#endif
ASSERT(pOwner != this);
if (pOwner->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
}
// 最后,给当前线程对象处理
CWinThread* pThread = AfxGetThread();
if (pThread != NULL)
{
#ifdef _DEBUG
if (afxTraceFlags & traceCmdRouting)
TRACE1("Routing command id 0x%04X to app.
", nID);
#endif
if (pThread->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
}
#ifdef _DEBUG
if (afxTraceFlags & traceCmdRouting)
{
TRACE2("IGNORING command id 0x%04X sent to %hs dialog.
", nID,
GetRuntimeClass()->m_lpszClassName);
}
#endif
return FALSE;
}
从上述实现可以看出,CDialog处理命令消息遵循如下顺序:
对话框自身→父窗口→线程对象
例如,模式对话框产生的WM_ENTERIDLE消息就发送给父窗口处理。
从实现中还看到,MFC根据TRACE过滤标识afxTraceFlags的值,把有关命令消息的派发显示到调试窗口。
CDialog::OnCmdMsg不仅适用于模式对话框,也适用于无模式对话框。
更多精彩
赞助商链接