|
[VC++学习]《精通MFC》——第三章(III) 读书笔记
|
LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM,lParam)
{
//OnWndMsg 做了实际的消息处理
LRESULT lResult = 0;
If (!OnWndMsg(message, wParam, lParam, &lResult))
lResult = DefWindowProc(message, wParam, lParam);
return lResult;
}
WindowProc把消息传递给OnWndMsg处理,OnWndMsg没有处理的消息 最终传递给默认的消息处理函数CWnd::DefWindowProc。
OnWndMsg
OnWndMsg承担了绝大部分消息处理的任务。
演示代码: P88
OnCommand
OnCommand的实现代码:
演示代码: P89
ReflectLastMsg
bool PASCAL CWnd::ReflectLastMsg(HWND hWndChild, LRESULT* pResult)
{
//省略了其他代码
//找要通知的子窗口
ASSERT(pWnd != NULL)
//发送Notify消息
return pWnd->SendChildNotifyLastMsg(pResult);
}
消息反射的本质就是调用控件子窗口的SendChildNotifyLastMsg成员处理 最后一条消息。SendChildNotifyLastMsg成员内部调用OnChildNotify处理父窗 口反射回来的消息:
bool CWnd::SendChildNotifyLastMsg(LRESULT* pResult)
{
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData(); return OnChildNotify(pThreadState->m_lastSentMsg.message, pThreadState->m_lastSentMsg.wParam,
pThreadState->m_lastSentMsg.lParam, pResult);
}
如果继续追踪OnChildNotify,会发现它调用了ReflectChildNotify:
bool CWnd::OnChildNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
//其他代码
return ReflectChildNotify(uMsg, wParam, lParam, pResult);
}
ReflectChildNotify具体负责处理父窗口反射给自身的消息。 ReflectChildNotify将反射的消息分成四类进行处理。第一类是普通的窗口消息, 这类消息的标志+WM_REFLECT_BASE构成新的消息标记,然后通过 OnWndMsg处理新消息。第二类是WM_COMMAND消息(命令消息),该消 息+WM_REFLECT_BASE构成新的消息标记,用OnCmdMsg处理该消息。第 三类是WM_NOTIFY消息,该消息标志+WM_REFLECT_BASE构成新的消息 标记,用OnCmdMsg处理该消息。第四类是WM_CTLCOLOR类的消息,这 些消息转化为OCM_CTLCOLOR消息,用OnWndMsg处理新消息。具体处理 参见下面的代码:演示代码: P91
OnNotify
OnNotify负责处理WM_NOTIFY消息。它首先从通知消息参数中取得控 件ID、控件窗口句柄;接下来将把该消息反射给控件,以优先控件处理。如果 控件没有处理该消息,则以控件ID为命令ID,将该消息作为命令由OnCmdMsg 来处理:演示代码: P93 |
|
|
|