專利名稱:一種軟件界面的消息路由方法
技術領域:
本發(fā)明屬于計算機應用領域,尤其涉及一種軟件界面的消息路由方法。
背景技術:
隨著計算機技術的發(fā)展,用戶對軟件界面的要求越來越高,不僅要求界面 友好,還需要界面美觀大方、交互性好等,這就對軟件界面的開發(fā)提出了更高 的要求。為了迎合市場的需求,軟件生產商也對軟件產品進行了界面美化,在 軟件生產過程中,界面開發(fā)占總工作量的比例越來越大,項目的開發(fā)成本也越 來越高,但是代碼的重用性卻沒有得到改善,往往需要專業(yè)的界面開發(fā)工程師 負責開發(fā)界面。
在現(xiàn)有的軟件界面生成中,控件的消息處理非常復雜,每次的消息路由都 是特定化的,只能針對當前的控件設計,前面控件接收到的消息不能被后續(xù)要 響應該消息的控件所調用,造成軟件界面開發(fā)時的重復工作量很大,增加了代 碼出錯的幾率,延長了項目開發(fā),代碼的可維護性也比較差。
發(fā)明內容
本發(fā)明實施例的目的在于提供一種軟件界面的消息路由方法,旨在解決現(xiàn) 有技術中前面控件接收到的消息不能被后續(xù)要響應該消息的的控件所調用,造 成軟件界面開發(fā)時的重復工作量大,代碼出錯的幾率高,可維護性較差的問題。
本發(fā)明實施例是這樣實現(xiàn)的, 一種軟件界面的消息路由方法,所述方法包
括以下步驟
窗口事件類將收到的系統(tǒng)窗口消息分配給事件派發(fā)器類; 事件派發(fā)器類將所述系統(tǒng)窗口消息派發(fā)給與該系統(tǒng)窗口綁定的虛擬窗口 ;所述虛擬窗口將接收到的窗口消息分配給該虛擬窗口內部的事件派發(fā)器類;
所述虛擬窗口內部的事件派發(fā)器類將所述系統(tǒng)窗口消息派發(fā)給該虛擬窗口內部的事件處理器類;
所述虛擬窗口內部的事件處理器類調用相應的虛擬窗口響應所述窗口消息
本發(fā)明實施例通過將接收到的系統(tǒng)窗口消息派發(fā)給相應的虛擬窗口 ,該虛 擬窗口又將系統(tǒng)窗口派發(fā)的消息發(fā)送到該虛擬窗口內部的事件處理器類,該事 件處理器類調用最終的虛擬窗口來響應該窗口消息,使得前面控件接收到的消 息能夠被后續(xù)要響應該消息的的控件所調用,從而〗吏得軟件界面的實現(xiàn)更加靈 活,縮短了軟件界面創(chuàng)建的時間,提高了代碼的可維護性和運行效率。
圖1是本發(fā)明實施例提供的軟件界面消息路由方法的實現(xiàn)流程圖。
具體實施例方式
為了使本發(fā)明的目的、技術方案及優(yōu)點更加清楚明白,以下結合附圖及實 施例,對本發(fā)明進行進一步詳細說明。應當理解,此處所描迷的具體實施例僅 僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
本發(fā)明實施例通過將接收到的系統(tǒng)窗口消息派發(fā)給相應的虛擬窗口 ,該虛 擬窗口又將接收到的系統(tǒng)窗口派發(fā)的消息發(fā)送到該虛擬窗口內部的事件處理器 類,該事件處理器類調用最終的虛擬窗口來響應該系統(tǒng)窗口消息。
在本發(fā)明實施例中,將系統(tǒng)窗口和虛擬窗口的消息進行統(tǒng)一管理,為了便 于管理,將系統(tǒng)窗口并入虛擬窗口的管理, 一個系統(tǒng)窗口綁定一個虛擬窗口對象,當有消息來時,都;^欠到外層窗口及其對應的虛擬窗口處理,不涉及虛擬窗 口內部的處理,例如編輯(edit)等。
本發(fā)明實施例通過窗口類接管窗口的所有消息,使用事件分發(fā)器類派發(fā)消 息到對應的虛擬窗口 ,每個虛擬窗口內部再次使用事件派發(fā)器將消息派發(fā)給事 件處理器類,事件處理器類調用最終的虛擬窗口響應消息。
圖1示出了本發(fā)明實施例提供的消息路由的處理流程,特別的,如果該虛
擬窗口 (Frame)是一個皮膚控件類(Ctrl Skinner),則先調用皮膚控件類的消 息處理函數(shù)(CtrlSkinnerWndProc)處理,使得皮膚控件類的特性得到實現(xiàn)。最 終消息還要通知到腳本,對應腳本中的執(zhí)行函數(shù),例如〈Prelnit^ <OnClick>、 <OnShortCut> 、 〈OnDefaultAction〉等函數(shù)。
1. 窗口事件類(WinEvent)接收系統(tǒng)窗口 (例如Windows)消息,將這些 消息分配給事件派發(fā)器類(EventDispatcher)。
2. 事件派發(fā)器類接收到窗口事件類派發(fā)的消息后,將消息發(fā)送到對應的虛 擬窗口。
3. 虛擬窗口將接收到的系統(tǒng)窗口消息分配給該虛擬窗口內部的事件派發(fā)器類。
4. 該虛擬窗口內部的事件派發(fā)器類將該系統(tǒng)窗口消息派發(fā)給該虛擬窗口 內部的事件處理器類(EventHandler)。
5. 虛擬窗口內部的事件處理器類調用相應的虛擬窗口響應該窗口消息。 在本發(fā)明實施例中,將虛擬窗口消息進行分類,例如分為一般事件
(GeneralEvent)、鍵盤事件(KeyboardEvent)、鼠標事件(MouseEvent)、 對象嵌入拖拉事件(OleDragEvent)、對象嵌入下拉事件(OleDropEvent)、 非客戶端事件(NonClientEvent)、拖拉事件(DraggingEvent)、拖拉尺寸事 件(DragSizingEvent)、拖拉移動事件(DragMovingEvent)、窗口創(chuàng)建事件
(RawWinMsgEvent)、雙擊事件(DoubleClickEvent)等。每種分類都有各自 的選擇最終調用的虛擬窗口的方式。
在本發(fā)明實施例中,事件處理器類在調用虛擬窗口時, 一種方式是依據(jù)當 前焦點所屬的虛擬窗口,另一種方式是依據(jù)事件產生時鼠標的坐標。這樣,事
件處理器類在調用最終的虛擬窗口來響應窗口消息時,是#4居當前焦點所屬的 虛擬窗口 ,或者才艮據(jù)事件產生時鼠標的坐標來確定所調用的虛擬窗口 。
當才艮據(jù)當前焦點所在的虛擬窗口來確定所調用的虛擬窗口時, 一個虛擬窗
口可以擁有一個焦點對象(Focus),用于管理焦點在該虛擬窗口的子虛擬窗口 (ChildFrame)之間切換,更常見的情況是一個對話框只有一個焦點類,用于 管理整個對話框的焦點切換。因此,焦點類使用一個靜態(tài)成員變量記錄當前唯 一的一個焦點虛擬窗口。當有系統(tǒng)窗口消息事件發(fā)生而導致焦點變化時,焦點 類就會調整焦點,同步數(shù)據(jù),消息路由機制通過焦點類得到焦點虛擬窗口,將 系統(tǒng)窗口消息事件發(fā)送給該虛擬窗口 ,并根據(jù)返回結果確定是否需要繼續(xù)路由。 例如,當用戶按下鍵盤按鍵"A",鍵盤按鍵消息首先被發(fā)送到窗口事件 類,窗口事件類通過上文描述的派發(fā)等環(huán)節(jié),最終找到焦點,向焦點詢問當前 的焦點虛擬窗口,如果得到的虛擬窗口非空,那么該虛擬窗口響應按鍵"A" 消息。
在具體實施過程中, 一個對話框有一個快捷鍵(Shortcut)對象,該快捷 鍵對象在對話框創(chuàng)建時注冊所有具有快捷鍵的子虛擬窗口 (ChildFrame)。這 樣,當有按鍵消息事件發(fā)生時,快捷鍵就在記錄表(map)中查找注冊了的子 虛擬窗口,如果找到了對應的子虛擬窗口,則調用該子虛擬窗口的默認事件。 該子虛擬窗口的默認事件一般具有優(yōu)先順序,例如優(yōu)先順序是響應快捷鍵 (OnShortCut),響應默認動作(OnDefaultAction),響應點擊(OnClick), 按鈕響應(OnLButtonDown),只要這些事件中的任意一個響應,返回結果就 為是(true),即標志著該^l建消息事件響應完畢。
為了讓虛擬窗口組合出來的復雜界面支持選擇,實現(xiàn)類似于組的概念,本 發(fā)明實施例添加了選擇(Select)支持,使得父虛擬窗口 ( ParentFrame )具有支 持方向鍵控制選中(enableDirKeyCtrlSelect)的屬性,而子虛擬窗口則具有支 持選中(enableSelect)的屬性。父虛擬窗口支持焦點,方向鍵消息都發(fā)給父虛 擬窗口,父虛擬窗口處理該方向鍵消息,切換當前選中的子虛擬窗口。如果用
戶按下回車4建,則消息就發(fā)送給當前選中的子虛擬窗口,由子虛擬窗口處理。
以即時通信軟件為例,在進行聊天功能時,假設當前選中的子虛擬窗口是
一個抽屜控件的一個子項(Folder),名稱為"我的聯(lián)系人",按"回車鍵", 則將調用該子項對應的虛擬窗口的默認處理函數(shù),例如點擊(OnClick),此時 收起該子項,如果再次按下"回車鍵",該子項又將展開。如果選中的是一個 "好友",那么調用對應的虛擬窗口的處理函數(shù),則將彈出一個和好友聊天的 窗口。
對于排布整齊的支持焦點的虛擬窗口集合,則具有支持方向鍵切換焦點的 功能。在具體實施過程中,如用戶按下方向鍵"左"時,會根據(jù)焦點序號(tabOrder) 找到上一個支持焦點的子虛擬窗口 ,如果找到的子虛擬窗口在當前焦點虛擬窗 口的左邊,那么就將焦點切換到剛找到的子虛擬窗口上。
其中,焦點虛擬窗口對普通^4建的處理類似于上述快捷4囊的處理,具有相 同的響應函it用^尤先級,即OnShortCut > OnDefaultAction > OnClick > OnLButtonDown 。
當根據(jù)事件產生時鼠標的坐標來確定所調用的虛擬窗口時,作為本發(fā)明的 實施例,首先根據(jù)鼠標的坐標,采用深度優(yōu)先算法計算出對應的虛擬窗口,將 系統(tǒng)窗口消息發(fā)送給該虛擬窗口 ,最后根據(jù)返回的虛擬窗口結果確定是否需要 繼續(xù)路由。
以一個使用了三層虛擬窗口疊加而成的按鈕為例,上面兩層(Fl, F2)都 是尺寸(size)比較小的圖片,最低層的虛擬窗口 (F3)是和按鈕的尺寸大小 相同的圖片,因此讓最低層的F3接受鼠標事件,此處的F1和F2的屬性鼠標 選中(enableMouse)就設置為否(false ), F3的屬性鼠標選中就設置為是(true), 在深度優(yōu)先遍歷的過程中,找到了屬性鼠標選中為是的虛擬窗口后,就立即返 回該虛擬窗口 (F3)。
作為本發(fā)明的實施例,對于需要消息反射的虛擬窗口,在虛擬窗口的腳本 中指定屬性反射命令(reflectCommand)和反射通知(reflectNotify)為是(true),
則本來發(fā)送給窗口的消息就會被發(fā)送到該虛擬窗口 了 。
例如ComboBox控件,默認都是加上上述兩個屬性的。當ComboBox的選 中項發(fā)生變化的時候,原來是發(fā)消息給父窗口 WM一NOTIFY , CBN—SELCHANGE,但是設置了 reflectNotify后,父窗口不處理這個消息,而 是將消息發(fā)送給ComboBox控件。這樣,ComboBox控件就可以在實例對應的 腳本段中響應事件了。
本發(fā)明實施例中,事件的派發(fā)順序是從父虛擬窗口到子虛擬窗口 ,在具體 實施過程中,事件的派發(fā)順序也可以從子虛擬窗口到父虛擬窗口 ,例如當子虛 擬窗口的大小改變時,父虛擬窗口的大小也會才艮據(jù)子虛擬窗口來作相應的改變, 此時子虛擬窗口將會變化情況通知父虛擬窗口 ,父虛擬窗口則才艮據(jù)子虛擬窗口 的變化作相應的調整。
采用本發(fā)明實施例提供的消息路由方案時,界面可以使用腳本任意組合, 消息的路由不需要再次實現(xiàn), 一個通用的路由機制保證了系統(tǒng)窗口和虛擬窗口 的混合消息管理。另外,消息從程序到lua(—種可嵌入式腳本語言)腳本,或 者從lua到程序是通暢的,足以保證程序強大的功能。該消息路由機制使得界 面最小元素的定義在原有基礎上有了很大的擴展,原來是系統(tǒng)窗口,本發(fā)明實 施例中可以不是系統(tǒng)窗口,可以是比系統(tǒng)窗口更小的虛擬窗口對象,改變了界 面響應消息的最小單位,使軟件界面開發(fā)者在創(chuàng)建一個對話框時^_用更少的系 統(tǒng)窗口,甚至僅使用一個虛擬窗口就能實現(xiàn)非常復雜的界面效果,使得軟件界 面的實現(xiàn)更加靈活,縮短了軟件界面創(chuàng)建的時間,提高了軟件的運行效率。
以上所述僅為本發(fā)明的較佳實施例而已,并不用以限制本發(fā)明,凡在本發(fā) 明的精神和原則之內所作的任何修改、等同替換和改進等,均應包含在本發(fā)明 的保護范圍之內。
權利要求
1、一種軟件界面的消息路由方法,其特征在于,所述方法包括以下步驟窗口事件類將收到的系統(tǒng)窗口消息分配給事件派發(fā)器類;事件派發(fā)器類將所述系統(tǒng)窗口消息派發(fā)給與該系統(tǒng)窗口綁定的虛擬窗口;所述虛擬窗口將接收到的窗口消息分配給該虛擬窗口內部的事件派發(fā)器類;所述虛擬窗口內部的事件派發(fā)器類將所述系統(tǒng)窗口消息派發(fā)給該虛擬窗口內部的事件處理器類;所述虛擬窗口內部的事件處理器類調用相應的虛擬窗口響應所述窗口消息。
2、 如權利要求1所述的軟件界面的消息路由方法,其特征在于,所述事件 處理器類依據(jù)當前焦點所屬的虛擬窗口確定所調用的虛擬窗口 。
3、 如權利要求2所述的軟件界面的消息路由方法,其特征在于, 一個虛擬 窗口配置有一個焦點類,所述焦點類管理焦點在所述虛擬窗口的子虛擬窗口之 間的切換。
4、 如權利要求2或3所述的軟件界面的消息路由方法,其特征在于,所述 虛擬窗口內部的事件處理器類調用相應的虛擬窗口響應所述窗口消息的步驟具 體為虛擬窗口內部的事件處理器類通過焦點類得到焦點虛擬窗口; 所述焦點虛擬窗口將系統(tǒng)窗口消息發(fā)送給該虛擬窗口 ; 虛擬窗口內部的事件處理器類根據(jù)返回的虛擬窗口的結果確定是否需要繼 續(xù)路由。
5、 如權利要求1所述的軟件界面的消息路由方法,其特征在于,所述事件 處理器類依據(jù)事件產生時鼠標的坐標確定所調用的虛擬窗口 。
6、 如權利要求5所述的軟件界面的消息路由方法,其特征在于,所述虛擬 窗口內部的事件處理器類調用相應的虛擬窗口響應所述窗口消息的步驟具體 為根據(jù)鼠標的坐標,采用深度優(yōu)先算法計算出對應的虛擬窗口 ; 將系統(tǒng)窗口消息發(fā)送給該虛擬窗口 ;所述虛擬窗口內部的事件處理器類根據(jù)返回的虛擬窗口的結果確定是否需 要繼續(xù)if各由。
7、 如權利要求1所述的軟件界面的消息路由方法,其特征在于,當所述事 件處理器類調用的虛擬窗口為皮膚控件類時,則調用所述皮膚控件類的消息處 理函數(shù)處理所述事件。
8、 如權利要求1所述的軟件界面的消息路由方法,其特征在于,事件的派 發(fā)順序為從父虛擬窗口到子虛擬窗口 ,或者子虛擬窗口到父虛擬窗口 。
全文摘要
本發(fā)明適用于計算機應用領域,提供了一種軟件界面的消息路由方法,所述方法包括以下步驟窗口事件類將收到的系統(tǒng)窗口消息分配給事件派發(fā)器類;事件派發(fā)器類將所述系統(tǒng)窗口消息派發(fā)給與該系統(tǒng)窗口綁定的虛擬窗口;所述虛擬窗口將接收到的窗口消息分配給該虛擬窗口內部的事件派發(fā)器類;所述虛擬窗口內部的事件派發(fā)器類將所述系統(tǒng)窗口消息派發(fā)給該虛擬窗口內部的事件處理器類;所述虛擬窗口內部的事件處理器類調用相應的虛擬窗口響應所述窗口消息。本發(fā)明使得前面控件接收到的消息能夠被后續(xù)要響應該消息的控件所調用,從而使得軟件界面的實現(xiàn)更加靈活,縮短了軟件界面創(chuàng)建的時間,提高了代碼的可維護性和運行效率。
文檔編號G06F9/54GK101192175SQ200710074748
公開日2008年6月4日 申請日期2007年6月7日 優(yōu)先權日2007年6月7日
發(fā)明者夏江波, 頡 陳 申請人:騰訊科技(深圳)有限公司