1. 消息入口
窗口過程是在註冊窗口類中綁定的,咱們找到註冊窗口類的代碼,以下:windows
bool CWindowWnd::RegisterWindowClass() { WNDCLASS wc = { 0 }; wc.style = GetClassStyle(); wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hIcon = NULL; wc.lpfnWndProc = CWindowWnd::__WndProc; wc.hInstance = CPaintManagerUI::GetInstance(); wc.hCursor = ::LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = GetWindowClassName(); ATOM ret = ::RegisterClass(&wc); ASSERT(ret!=NULL || ::GetLastError()==ERROR\_CLASS\_ALREADY_EXISTS); return ret != NULL || ::GetLastError() == ERROR\_CLASS\_ALREADY_EXISTS; }
即綁定了窗口過程"CWindowWnd::__WndProc",跟進這個函數看看,這裏截取關鍵代碼:函數
return pThis->HandleMessage(uMsg, wParam, lParam);this
這裏的pThis是CWindowWnd的對象,起始指向的是子類"C360SafeFrameWnd",即咱們本身定義的主窗口類,是在函數"CWindowWnd::Create"中在調用"CreateWindowEx"經過最後一個參數傳進來的。那麼經過這一步,就把消息經過函數"HandleMessage」傳進了UI層,這是個虛函數,最終進入到C360SafeFrameWnd::HandleMessage()函數。好了,到這裏就已經將windows窗口消息和咱們本身的窗口類聯繫起來了,消息已經進入了咱們的窗口類了,如今你能夠在函數"HandleMessage"中處理消息響應。code
整理下上面的流程:xml
WinMain()-->對象
pFrame->Create()-->blog
CWindowWnd::Create()-->教程
CWindowWnd::RegisterWindowClass()-->事件
CWindowWnd::__WndProc()-->路由
C360SafeFrameWnd::HandleMessage()-->
2.控件消息
消息如何進入控件的呢?在xml中配置了一個Buttom,點擊這個按鈕,按鈕是如何捕捉到消息的呢?下面接着分析。
(1) UI管理器CPaintManagerUI
在主窗口"C360SafeFrameWnd"中定義了一個成員變量"CPaintManagerUI m_pm",顧名思義就叫它UI管理器,管理UI消息。
在消息入口這一節中,咱們看到消息路由到了函數"HandleMessage",接着看這個函數,能夠看到有下面的調用:
*if( m_pm.MessageHandler(uMsg, wParam, lParam, lRes) ) return lRes;*
即將消息傳入進了UI管理器"CPaintManagerUI::MessageHandler",這裏管理全部的UI消息,而後將相應的消息傳遞給對應的控件,這裏就解釋了開頭的疑問,消息是如何傳遞到UI控件的。
(2) 消息通知監聽
在OnCreate函數中添加事件監聽m_pm.AddNotifier(this);
bool CPaintManagerUI::AddNotifier(INotifyUI* pNotifier) { if (pNotifier == NULL) return false; ASSERT(m_aNotifiers.Find(pNotifier)<0); return m_aNotifiers.Add(pNotifier); }
分發消息通知*CPaintManagerUI::SendNotify*,向添加了監聽的窗口發送消息通知。
(3) 通知處理
重寫虛函數*Notify*,在這裏接收消息事件,處理本身的消息事件。
以單擊按鈕爲例,看看是如何流程:
CPaintManagerUI::MessageHandler-->
pClick->Event--> 分發事件
CControlUI::Event-->
CButtonUI::DoEvent--> 響應事件
CButtonUI::Activate-->
CPaintManagerUI::SendNotify-->
CPaintManagerUI::SendNotify--> 分發消息通知
C360SafeFrameWnd::Notify--> 響應消息通知
基礎教程推薦
最後推薦個系列基礎入門教程,之前看過,新手再適合不過了,[http://www.cnblogs.com/Alberl/]