第十八篇:在SOUI中實現PreTranslateMessage


在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
{
//...
};

  

 

 
        
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM