第十五篇:在SOUI中消息通訊


SOUI是一套基於Win32 SDK的窗口開發的一套DirectUI框架。在SOUI中除了有真窗口使用窗口消息通訊機制外,還有SOUI控件之間的通訊,及控件的事件處理等。

1、真窗口消息通訊

因此可以使用::SendMessage這個API來與宿主窗口通訊。在任意一個地方只要獲取到了SOUI的宿主窗口句柄就可以向該窗口發消息。

發消息以后可以在主界面的真窗口的消息映射表中響應各種自定義消息(如下):

#define WM_MYMSG (WM_USER+100)
    LRESULT OnMyMsg(UINT uMsg,WPARAM wp,LPARAM lp,BOOL & bHandled)
    {
        return 0;
    }
    //HOST消息及響應函數映射表
    BEGIN_MSG_MAP_EX(CMainDlg)
        MESSAGE_HANDLER(WM_MYMSG,OnMyMsg)
        MSG_WM_CREATE(OnCreate)
        MSG_WM_INITDIALOG(OnInitDialog)
        MSG_WM_DESTROY(OnDestory)
        MSG_WM_CLOSE(OnClose)
        MSG_WM_SIZE(OnSize)
        MSG_WM_COMMAND(OnCommand)
        MSG_WM_SHOWWINDOW(OnShowWindow)
        CHAIN_MSG_MAP(SHostWnd)
        REFLECT_NOTIFICATIONS_EX()
    END_MSG_MAP()

注意上面代碼的紅色部分。有WTL開發經驗的朋友應該已經看出來了,SOUI處理真窗口消息的形式和WTL完全一樣。

2、SOUI控件通訊

我們知道,在win32編譯中,要與一個控件(窗口)通訊能用SendMessage(PostMessage)發送一個消息給目標窗口,目標窗口收到后進行處理。那么問題來了,如何向一個SOUI窗口發消息?

SOUI的窗口類和MFC的窗口類很像,和MFC使用SendMessage(PostMessage)發消息類似,在SOUI中也可以使用SWindow::SSendMessage來向目標窗口發送一個消息來通訊,但不支持PostMessage,目標窗口在SOUI窗口的消息映射表中響應發送過來的消息。下面是一個內置控件STabCtrl的消息映射表:

        SOUI_MSG_MAP_BEGIN()
            MSG_WM_PAINT_EX(OnPaint)
            MSG_WM_DESTROY(OnDestroy)
            MSG_WM_LBUTTONDOWN(OnLButtonDown)
            MSG_WM_MOUSEMOVE(OnMouseMove)
            MSG_WM_MOUSELEAVE(OnMouseLeave)
            MSG_WM_KEYDOWN(OnKeyDown)
        SOUI_MSG_MAP_END()

和真窗口的映射表使用WTL的映射宏不一樣,SOUI窗口的映射宏使用SOUI_MSG_MAP_BEGIN 和SOUI_MSG_MAP_END來構造消息處理函數,但是映射表中的消息映射項基本和WTL的映射形式是一樣的(注意個別消息是經過重定義的,典型的如WM_PAINT消息,在SOUI中需要使用MSG_WM_PAINT_EX來處理)。

3、SOUI的事件機制

此外SOUI中控件要發出事件交給應用層處理使用的是一套事件機制。

每一個事件有對應一個EventArg類,事件在控件中使用FireEvent啟動事件路由,應用程序可以在事件響應映射表中對各種事件統一處理,也可以使用subscribeEvent來直接訂閱特定SOUI窗口的一個事件,直接將事件與事件處理函數關聯。這一部分請參考前面相關章節。

 


免責聲明!

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



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