Dulib源碼淺析<二>之消息路由

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/]

相關文章
相關標籤/搜索