在MFC中,通常可以通過重載CWnd::PreTranslateMessage這樣一個虛函數來實現對一些窗口消息的預處理。多用於tooltip的顯示控制。
在SOUI中也實現了類似的機制。
要在SOUI中實現PreTranslateMessage,我們首先需要實現一個接口:
struct IMessageFilter { virtual BOOL PreTranslateMessage(MSG* pMsg) = 0; };
可以看出,實現這個接口和在MFC中重載PreTranslateMessage是相同的道理。
和MFC中只需要重載這個接口不同,在SOUI中,除了需要實現IMessageFilter外,還需要向當前的MessageLoop注冊該IMessageFilter。
class SOUI_EXP SMessageLoop { public: SArray<IMessageFilter*> m_aMsgFilter; // Message filter operations BOOL AddMessageFilter(IMessageFilter* pMessageFilter); BOOL RemoveMessageFilter(IMessageFilter* pMessageFilter); //... };
上面是SMessageLoop兩個和IMessageFilter相關的方法。
SMessageLoop::AddMessageFilter向當前的message loop注冊一個IMessageFilter;
SMessageLoop::RemoveMessageFilter則向當前的message loop注銷一個IMessageFilter
剩下的問題就是如何獲得當前的MessageLoop了。
在SHostWnd 或者SHostDialog中可以調用SHostWnd::GetMsgLoop()方法獲得。
在SWindow中,則可以調用SWindow::GetContainer()->GetMsgLoop()獲得。
使用示例可以參考SDropDownWnd的實現。
class SOUI_EXP SDropDownWnd : public SHostWnd, public IMessageFilter { //... };