第十五篇:在SOUI中消息通讯
SOUI是一套基于Win32 SDK的窗口開發(fā)的一套DirectUI框架。在SOUI中除了有真窗口使用窗口消息通訊機(jī)制外,還有SOUI控件之間的通訊,及控件的事件處理等。
1、真窗口消息通訊
因此可以使用::SendMessage這個(gè)API來與宿主窗口通訊。在任意一個(gè)地方只要獲取到了SOUI的宿主窗口句柄就可以向該窗口發(fā)消息。
發(fā)消息以后可以在主界面的真窗口的消息映射表中響應(yīng)各種自定義消息(如下):
#define WM_MYMSG (WM_USER+100)
LRESULT OnMyMsg(UINT uMsg,WPARAM wp,LPARAM lp,BOOL & bHandled)
{
return 0;
}
//HOST消息及響應(yīng)函數(shù)映射表
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開發(fā)經(jīng)驗(yàn)的朋友應(yīng)該已經(jīng)看出來了,SOUI處理真窗口消息的形式和WTL完全一樣。
2、SOUI控件通訊
我們知道,在win32編譯中,要與一個(gè)控件(窗口)通訊能用SendMessage(PostMessage)發(fā)送一個(gè)消息給目標(biāo)窗口,目標(biāo)窗口收到后進(jìn)行處理。那么問題來了,如何向一個(gè)SOUI窗口發(fā)消息?
SOUI的窗口類和MFC的窗口類很像,和MFC使用SendMessage(PostMessage)發(fā)消息類似,在SOUI中也可以使用SWindow::SSendMessage來向目標(biāo)窗口發(fā)送一個(gè)消息來通訊,但不支持PostMessage,目標(biāo)窗口在SOUI窗口的消息映射表中響應(yīng)發(fā)送過來的消息。下面是一個(gè)內(nèi)置控件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來構(gòu)造消息處理函數(shù),但是映射表中的消息映射項(xiàng)基本和WTL的映射形式是一樣的(注意個(gè)別消息是經(jīng)過重定義的,典型的如WM_PAINT消息,在SOUI中需要使用MSG_WM_PAINT_EX來處理)。
3、SOUI的事件機(jī)制
此外SOUI中控件要發(fā)出事件交給應(yīng)用層處理使用的是一套事件機(jī)制。
每一個(gè)事件有對應(yīng)一個(gè)EventArg類,事件在控件中使用FireEvent啟動事件路由,應(yīng)用程序可以在事件響應(yīng)映射表中對各種事件統(tǒng)一處理,也可以使用subscribeEvent來直接訂閱特定SOUI窗口的一個(gè)事件,直接將事件與事件處理函數(shù)關(guān)聯(lián)。這一部分請參考前面相關(guān)章節(jié)。
總結(jié)
以上是生活随笔為你收集整理的第十五篇:在SOUI中消息通讯的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解Three.js中透视投影照相机
- 下一篇: YASM User Manual