1. 程式人生 > >DUILIB訊息處理過程

DUILIB訊息處理過程

DUILIB訊息處理機制

方法一、

首先視窗基類建立 CWindowWnd->Create()

呼叫 CWindowWnd->RegisterWindowClass() 註冊 CWindowWnd->__WndProc() 為本介面視窗訊息處理函式

 __WndProc()呼叫 虛擬函式 CWindowWnd->HandleMessage() 處理訊息

WinImplBase繼承 CWindowWnd 並重寫了 HandleMessage()處理訊息 該函式攔截 WM_CREATE 、WM_MOUSEMOVE等常見訊息,並轉發至 該類對應的虛擬函式 WinImplBase::OnCreate(),WinImplBase::OnMouseMove()等 ,

之後WinImplBase::HandleMessage()函式呼叫 該類虛方法 WinImplBase::HandleCustomMessage()

此時我們可以自己重寫視窗的 HandleCustomMessage(),OnCreate(), OnMouseMove()等 方法進行訊息過程處理

 

最後WinImplBase::HandleMessage()函式呼叫該類的成員CPaintManagerUI  m_pm的MessageHandler()方法;

 在m_pm的MessageHandler()方法中首先呼叫了LRESULT lResult = static_cast<IMessageFilterUI*>(m_aMessageFilters[i])->MessageHandler(uMsg, wParam, lParam, bHandled);

 此時我們可以實現 IMessageFilterUI介面並呼叫CPaintManagerUI::AddPreMessageFilter()  新增到m_aMessageFilters過濾佇列中,在IMessageFilterUI::MessageHandler(uMsg, wParam, lParam, bHandled);中處理訊息

 之後呼叫了 static_cast<INotifyUI*>(m_aNotifiers[j])->Notify(*pMsg);

此時我們可以實現INotifyUI,呼叫CPaintManagerUI::AddNotifier,將自身加入Notifier佇列。

方法 二、

CPaintManagerUI::MessageLoop() 訊息泵  呼叫 CPaintManagerUI::TranslateMessage(const LPMSG pMsg)來進行分發訊息

該函式會呼叫 該類 PreMessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& /*lRes*/)

之後在PreMessageHandler() 中呼叫 LRESULT lResult = static_cast<IMessageFilterUI*>(m_aPreMessageFilters[i])->MessageHandler(uMsg, wParam, lParam, bHandled);

 

此時我們可以實現IMessageFilterUI介面並呼叫CPaintManagerUI::AddPreMessageFilter()  過濾佇列中,通過此方法可以 在視窗處理之前 先對訊息進行預處理