專(zhuān)利名稱(chēng):一種可擴(kuò)展的皮膚系統(tǒng)及其實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及皮膚技術(shù),特別是涉及一種可擴(kuò)展的皮膚系統(tǒng)及其實(shí)現(xiàn)方法。
技術(shù)背景通常,軟件運(yùn)行時(shí)都會(huì)有交互界面,以便于接受用戶(hù)指令并向用戶(hù)反饋信 息,交互界面的好壞是一個(gè)軟件是否被用戶(hù)接受的重要因素?,F(xiàn)有的許多軟件都使用皮膚系統(tǒng)來(lái)優(yōu)化交互界面的表現(xiàn),傳統(tǒng)的皮膚系統(tǒng)主要有兩種發(fā)展方向 一種是追求完備,在實(shí)現(xiàn)皮膚系統(tǒng)過(guò)程中不注重系統(tǒng)資源優(yōu)化,導(dǎo)致皮膚系統(tǒng) 相當(dāng)龐大;另一種是皮膚系統(tǒng)與軟件內(nèi)部邏輯耦合很好,皮膚系統(tǒng)占用資源不 高,但難以擴(kuò)展。隨著計(jì)算機(jī)處理能力的提高以及交互界面不斷發(fā)展的需要,皮膚系統(tǒng)的架 構(gòu)也在不斷發(fā)展,總體上可分為三種方案在代碼中定義皮膚相關(guān)元素、使用 INI文件定義少量皮膚元素屬性、使用擴(kuò)展標(biāo)記語(yǔ)言(XML)或相關(guān)可擴(kuò)展標(biāo) 識(shí)語(yǔ)言描述各種皮膚元素屬性及行為。其中,由于前兩種方案在其描述能力和 可擴(kuò)展性上都存在較大的局限性,在現(xiàn)代皮膚系統(tǒng)設(shè)計(jì)中很少釆用,因此下面 主要對(duì)第三種方案的相關(guān)現(xiàn)有技術(shù)進(jìn)行說(shuō)明。一般,皮膚系統(tǒng)需要提供以下內(nèi)容 一組已實(shí)現(xiàn)的皮膚控件、 一組與已實(shí) 現(xiàn)皮膚控件相關(guān)聯(lián)的圖像文件、 一組皮膚系統(tǒng)的對(duì)外接口、 一種描述皮膚系統(tǒng) 相關(guān)屬性與行為的標(biāo)識(shí)語(yǔ)言。其中,皮膚控件也可稱(chēng)為皮膚組件或皮膚元素, 對(duì)外接口就是指外部應(yīng)用編程接口 (API)。在現(xiàn)有的皮膚系統(tǒng)中, 一種皮膚系統(tǒng)僅實(shí)現(xiàn)與特定應(yīng)用相關(guān)的一些皮膚控 件,另一種皮膚系統(tǒng)則實(shí)現(xiàn)盡可能多的皮膚控件,兩種系統(tǒng)都會(huì)提供相應(yīng)皮膚 控件的名稱(chēng)關(guān)鍵字和屬性關(guān)鍵字,用戶(hù)在皮膚描述文件中必須使用所提供的關(guān)鍵字來(lái)描述皮膚控件,不能對(duì)皮膚控件進(jìn)行擴(kuò)展?,F(xiàn)有的皮膚系統(tǒng)通常將皮膚控件與對(duì)應(yīng)的圖像文件進(jìn)行一對(duì)一的關(guān)聯(lián),在 創(chuàng)建皮膚控件時(shí),每個(gè)皮膚控件都會(huì)加載其所關(guān)聯(lián)的圖像文件,然后根據(jù)屬性 定義對(duì)皮膚控件進(jìn)行繪制,其中,皮膚控件關(guān)聯(lián)的圖像文件寬高與皮膚控件自 身的寬高需要保持一致,才能保證正確繪制。對(duì)于個(gè)別需要在程序運(yùn)行中變形 的皮膚控件,其所關(guān)聯(lián)的圖像文件會(huì)具有水平或垂直延展的屬性定義,但對(duì)于 復(fù)雜的四周延展或透明區(qū)域定義,則不能提供相關(guān)的屬性,而必須在圖像文件 設(shè)計(jì)時(shí)進(jìn)行切割,分成更小的皮膚控件單元進(jìn)行處理。比如對(duì)于一個(gè)可變形 的、圓角矩形形狀的皮膚控件,它在變形過(guò)程中四個(gè)角保持不變,但四條邊以 及矩形中部都會(huì)進(jìn)行相關(guān)的延展。那么,現(xiàn)有皮膚系統(tǒng)的處理方法通常是將該 皮膚控件的四個(gè)角單獨(dú)切分成四個(gè)獨(dú)立的小皮膚控件,這些小皮膚控件不可延展;而其他部分定義為另一個(gè)小皮膚控件,該小皮膚控件可以作某種方向上的延展。現(xiàn)有皮膚系統(tǒng)中,皮膚描述文件中所描述的各個(gè)皮膚控件基本是相互獨(dú)立的,各個(gè)皮膚控件之間不對(duì)其他皮膚控件進(jìn)行復(fù)用。比如在現(xiàn)有系統(tǒng)中,一個(gè)窗口皮膚控件和一個(gè)列表皮膚控件都需要用到滾動(dòng)條皮膚控件,但在皮膚描 述文件中需要在描述窗口皮膚控件和描述列表皮膚控件時(shí)都描述滾動(dòng)條皮膚控 件的屬性,且在創(chuàng)建時(shí)也各自獨(dú)立創(chuàng)建。從上述描述可以看出,現(xiàn)有皮膚系統(tǒng)在實(shí)際應(yīng)用中存在以下問(wèn)題第一、用戶(hù)不能根據(jù)自身需要方便地?cái)U(kuò)展皮膚控件,因此,對(duì)于那些只提 供應(yīng)用相關(guān)皮膚控件的皮膚系統(tǒng),其應(yīng)用范圍非常狹窄;而對(duì)于那些提供完備 皮膚控件的皮膚系統(tǒng),則非常龐大、復(fù)雜,不適合于輕量級(jí)簡(jiǎn)單的應(yīng)用環(huán)境。第二、如果多個(gè)皮膚控件關(guān)聯(lián)到同一個(gè)圖像文件,由于每個(gè)皮膚控件創(chuàng)建 時(shí)都會(huì)獨(dú)立加載圖像文件,那么,同一個(gè)圖像文件將會(huì)被加載多次,會(huì)重復(fù)占 用更多的系統(tǒng)資源,導(dǎo)致系統(tǒng)資源的浪費(fèi)。第三、現(xiàn)有皮膚系統(tǒng)圖像文件在加載圖像后所做得變換很少,因此對(duì)于一 些需要特珠變化的皮膚控件需要進(jìn)行切分,分成若干個(gè)行為更加單一的皮膚控件,如此,不僅增加了系統(tǒng)資源的占用,還增加了處理的復(fù)雜度。第四、當(dāng)多個(gè)控件使用相同的皮膚控件作為它的一部分時(shí),獨(dú)立描述與創(chuàng) 建相同的皮膚控件,也將導(dǎo)致更多的系統(tǒng)資源占用。發(fā)明內(nèi)容有鑒于此,本發(fā)明的主要目的在于提供一種可擴(kuò)展的皮膚系統(tǒng)及其實(shí)現(xiàn)方 法,能在系統(tǒng)資源占用盡量少的基礎(chǔ)上,實(shí)現(xiàn)皮膚控件的任意擴(kuò)展。 為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的本發(fā)明提供了一種可擴(kuò)展的皮膚系統(tǒng),包括皮膚控件管理器、 一個(gè)以上 基本控件以及XML解析器;其中,皮膚控件管理器,用于管理所有皮膚控件,負(fù)責(zé)從XML解析器中讀取解 析后的XML配置文件中的相關(guān)配置信息并創(chuàng)建所需皮膚控件;基本控件,用于在用戶(hù)使用皮膚系統(tǒng)創(chuàng)建應(yīng)用程序時(shí)直接使用、或作為基 本皮膚控件創(chuàng)建用戶(hù)所需的皮膚控件;XML解析器,負(fù)責(zé)讀取并解析XML配置文件,將解析后的內(nèi)容提供給皮 膚控件管理器調(diào)用并讀取。所述皮膚控件管理器進(jìn)一步包括皮膚控件管理單元、皮膚控件創(chuàng)建單元、 配置信息讀取單元;其中,皮膚控件管理單元,用于管理所有皮膚控件;配置 信息讀取單元,負(fù)責(zé)從XML解析器中讀取解析后的配置信息,并將讀取的配置信息發(fā)送給皮膚控件創(chuàng)建單元和皮膚控件管理單元;皮膚控件創(chuàng)建單元,根據(jù)收到的配置信息創(chuàng)建用戶(hù)所需的皮膚控件。其中,所述基本控件包括提供接口的基類(lèi)控件、設(shè)置參數(shù)的參數(shù)類(lèi)、提供 控制特性的控件類(lèi)以及作為公共元素的公共控件。上述方案中,所述皮膚控件管理器還包括皮膚控件ID到其創(chuàng)建函數(shù)指針的映射表、以及皮膚控件類(lèi)型到其創(chuàng)建函數(shù)指針的映射表。上述方案中,所述皮膚控件管理器還包括圖像加載管理單元,用于控制圖 像文件是否加載。上述方案中,所述皮膚控件管理器還包括策略設(shè)置單元,用于設(shè)置皮膚控 件對(duì)齊策略和圖像變形繪制策略。本發(fā)明還提供了一種可擴(kuò)展皮膚系統(tǒng)的實(shí)現(xiàn)方法,包括提供一個(gè)以上基本控件,該方法還包括A、 從XML配置文件中讀取配置信息,根據(jù)所讀取的配置信息查找創(chuàng)建函 數(shù),如果找到,則執(zhí)行步驟B,否則結(jié)東當(dāng)前處理流程;B、 調(diào)用所找到的創(chuàng)建函數(shù)實(shí)例化皮膚控件,并根據(jù)基本控件獲得皮膚控 件的參數(shù)對(duì)象指針;C、 、從XML配置文件中讀入皮膚控件關(guān)聯(lián)的屬性,配置參數(shù)對(duì)象,根據(jù)配 置的參數(shù)創(chuàng)建所需的皮膚控件。其中,步驟C之后,該方法進(jìn)一步包括通過(guò)遞歸方式創(chuàng)建步驟C所創(chuàng)建 的皮膚控件的子皮膚控件,并將創(chuàng)建的子皮膚控件加入到相應(yīng)的子皮膚控件列 表中。上述方案中,所述基本控件包括提供接口的基類(lèi)控件、設(shè)置參數(shù)的參數(shù)類(lèi)、 提供控制特性的控件類(lèi)以及作為公共元素的公共控件。上述方案中,該方法進(jìn)一步包括在皮膚控件管理器中設(shè)置皮膚控件ID到 其創(chuàng)建函數(shù)指針的映射表、以及皮膚控件類(lèi)型到其創(chuàng)建函數(shù)指針的映射表;步 驟A所述查找創(chuàng)建函數(shù)為根據(jù)所設(shè)置的映射表進(jìn)行查找。上述方案中,圖像文件加載時(shí),該方法還包括a. 讀入與所創(chuàng)建皮膚控件相關(guān)聯(lián)的圖像文件名;b. 根據(jù)圖像文件名在所述映射表中查找圖像數(shù)據(jù);c. 判斷是否找到所需的圖像數(shù)據(jù),如果找到,則將相應(yīng)圖像數(shù)據(jù)的指針?lè)碅蟲(chóng)i入、1/ A瓶厶l t;4 AA ^ W " 、l力丄匕i:丄A3 士 A 、1, A新A,l '巻上"山ti丄O^r 乂止上L A . 士'吸;s口 3則文'ii'J處口'J乂乂AJ7U工IT, 7TTr犯卞rFM亇1X 3則處ciy 乂又肌:Jii'l卞W、J風(fēng)W義 量中;否則,分配相應(yīng)圖像數(shù)據(jù)所需的資源,加載相應(yīng)圖像數(shù)據(jù),并在映射表 中增加所述圖像文件名到圖像數(shù)據(jù)的映射項(xiàng)。上述方案中,該方法還包括預(yù)先設(shè)置皮膚控件對(duì)齊方式的策略以及圖像 變形繪制的策略。本發(fā)明所提供的可擴(kuò)展的皮膚系統(tǒng)及其實(shí)現(xiàn)方法,具有以下的優(yōu)點(diǎn)和特點(diǎn) 1 )本發(fā)明提供一系列基本控件和 一個(gè)皮膚控件管理器,使用戶(hù)可以直接使 用所提供的皮膚控件,也可以根據(jù)自身需要在皮膚控件管理器的控制下,基于 所提供的基本控件動(dòng)態(tài)任意創(chuàng)建自身所需的皮膚控件,輕松擴(kuò)展用戶(hù)自己特定 的皮膚控件,而不需要對(duì)已構(gòu)架的皮膚系統(tǒng)進(jìn)行任何修改。對(duì)于不同皮膚控件 共享的皮膚控件部分,可將共享部分作為單獨(dú)的公共控件,供有需要的不同皮 膚控件使用,無(wú)需各自獨(dú)立描述和創(chuàng)建。這樣,不僅能減少皮膚控件的設(shè)置數(shù) 量,有效減少對(duì)系統(tǒng)資源的占用,還能提高皮膚系統(tǒng)的運(yùn)行效率。2) 對(duì)于不同皮膚控件共同關(guān)聯(lián)同一圖像文件的情況,本發(fā)明通過(guò)設(shè)置皮膚控件與已加載圖像數(shù)據(jù)之間映射表的方式,在加載任何圖像數(shù)據(jù)之前,先查找 映射表中是否已有相應(yīng)圖像數(shù)據(jù),如果已有,只需將圖像數(shù)據(jù)的位置指針?lè)答伣o相應(yīng)皮膚控件,如此可避免重復(fù)加載;而且,需要對(duì)圖像數(shù)據(jù)進(jìn)行操作時(shí), 只需對(duì)映射表中指向的圖像數(shù)據(jù)操作,不僅有效減少了對(duì)系統(tǒng)資源的占用;而 且加快了系統(tǒng)的處理速度。3) 本發(fā)明中,對(duì)于所有的皮膚控件包括皮膚系統(tǒng)提供的和動(dòng)態(tài)擴(kuò)展的,均 由皮膚控件管理器統(tǒng)一管理、統(tǒng)一創(chuàng)建生成,不僅能降低處理的復(fù)雜度,還能 使皮膚系統(tǒng)適用于各種應(yīng)用環(huán)境,尤其是輕量級(jí)的簡(jiǎn)單應(yīng)用環(huán)境。4) 為了進(jìn)一步減少皮膚控件和圖像文件的數(shù)量,本發(fā)明還提供了一些皮膚 控件對(duì)齊策略和圖像變形繪制策略,如此,可以方便地描述復(fù)雜皮膚控件的屬 性,使其發(fā)生變化時(shí),不必通過(guò)復(fù)雜的操作進(jìn)行處理。例如預(yù)先設(shè)置皮膚控 件的對(duì)齊方式中包括四周對(duì)齊,設(shè)置圖像的繪制方式包括四角固定繪制、中部 水平垂直延展繪制,那么,對(duì)于一個(gè)充滿(mǎn)窗口的圓角矩形皮膚控件,可設(shè)置其對(duì)齊方式的屬性為四周對(duì)齊, 圖像繪制方式的屬性為四角固定繪制,中部水平垂直延展繪展, 這樣, 無(wú)論此圓角矩形皮膚控件大小如何變化,都不用將原皮膚控件再切分為若干個(gè)小皮膚控件進(jìn)行處理,在處理速度和資源占用上均優(yōu)于 現(xiàn)有技術(shù)的處理方式。
圖1為本發(fā)明皮膚系統(tǒng)的組成結(jié)構(gòu)示意圖;圖2為各基本控件以及皮膚控件管理器之間的關(guān)系圖; 圖3為本發(fā)明皮膚控件創(chuàng)建流程的示意圖; 圖4為一要?jiǎng)?chuàng)建的皮膚控件實(shí)例示意圖; 圖5為圖像文件加載流程的示意圖。
具體實(shí)施方式
本發(fā)明的基本思想是提供一系列基本控件和一個(gè)皮膚控件管理器,用戶(hù) 在使用包括基本控件和皮膚控件管理器的皮膚系統(tǒng)創(chuàng)建應(yīng)用程序時(shí),可直接使 用所提供的基本控件,也可基于所提供的基本控件任意動(dòng)態(tài)創(chuàng)建自己所需的皮 膚控件。其中,基本控件包括提供接口的基類(lèi)控件、設(shè)置參數(shù)的參數(shù)類(lèi)、提供控制 特性的控件類(lèi)、作為公共元素的公共控件等。為避免圖像文件重復(fù)加載,本發(fā)明可進(jìn)一步設(shè)置皮膚控件與已加載圖像數(shù) 據(jù)之間的映射表,在加載任何圖像數(shù)據(jù)之前,先根據(jù)圖像文件名查找映射表中 是否已有相應(yīng)圖像數(shù)據(jù),如果已有,只需將圖像數(shù)據(jù)的位置指針?lè)答伣o相應(yīng)皮 膚控件,不再重新加載。進(jìn)一步的,本發(fā)明還可以設(shè)置皮膚控件對(duì)齊策略和圖像變形繪制策略,以 簡(jiǎn)化皮膚變化時(shí)的處理。本發(fā)明所述的皮膚系統(tǒng)如圖1所示,包括皮膚控件管理器、 一個(gè)以上基本 控件以及XML解析器;其中,皮膚控件管理器用于管理所有皮膚控件,負(fù)責(zé) 從XML解析器中讀取解析后的XML配置文件中的相關(guān)配置信息并創(chuàng)建所需皮 膚控件;基本控件由皮膚系統(tǒng)本身提供,用于在用戶(hù)使用皮膚系統(tǒng)創(chuàng)建應(yīng)用程 序時(shí)直接使用、或作為基本皮膚控件創(chuàng)建用戶(hù)所需的皮膚控件;XML解析器, 與皮膚控件管理器連接,負(fù)責(zé)讀取XML配置文件并對(duì)其中的內(nèi)容進(jìn)行解析, 所解析出的內(nèi)容提供給皮膚控件管理器調(diào)用并讀取,皮膚控件管理器根據(jù)解析出的內(nèi)容創(chuàng)建用戶(hù)所需的皮膚控件、以及管理所有的皮膚控件。其中,所述XML 配置文件也稱(chēng)為皮膚描述文件。所述皮膚控件管理器根據(jù)功能可進(jìn)一步劃分為皮膚控件管理單元、皮膚控件創(chuàng)建單元、配置信息讀取單元;皮膚控件管理單元用于管理所有皮膚控件;配置信息讀取單元負(fù)責(zé)從XML解析器中讀取解析后的配置信息,并將讀取的配置信息發(fā)送給皮膚控件創(chuàng)建單元和皮膚控件管理單元;皮膚控件創(chuàng)建單元, 根據(jù)收到的配置信息創(chuàng)建用戶(hù)所需的皮膚控件。所述基本控件包括提供接口的基類(lèi)控件、設(shè)置參數(shù)的參數(shù)類(lèi)、提供控制特 性的控件類(lèi)、作為公共元素的公共控件,圖2給出了各基本控件以及皮膚控件管理器之間的關(guān)系,如圖2所示用于提供一系列接口給擴(kuò)展使用的基類(lèi)控件,如CQPObject、 CQPCommon-Object、 CQPWnd,這些基類(lèi)本身 一般不實(shí)現(xiàn)特定功能,只是提供了接口,提供 給派生類(lèi)使用。用于設(shè)置參數(shù)的參數(shù)類(lèi),如CxxxParams,這些參數(shù)類(lèi)可設(shè)置創(chuàng)建相關(guān)皮膚 控件時(shí)所需的參數(shù),在皮膚控件創(chuàng)建前先實(shí)例化相關(guān)的參數(shù)類(lèi),并對(duì)其中的參 數(shù)進(jìn)行賦值。所有參數(shù)類(lèi)都從CQPObjectParams繼承,設(shè)置皮膚控件所關(guān)聯(lián)的 各種屬性,所述參數(shù)類(lèi)實(shí)現(xiàn)以下接口準(zhǔn)備參數(shù)PrepareParams,派生類(lèi)需要實(shí) 現(xiàn)此接口,用于創(chuàng)建正確的參數(shù)類(lèi)指針;設(shè)置參數(shù)SetParams,用于實(shí)現(xiàn)屬性名 稱(chēng)和屬性值的對(duì)應(yīng),皮膚控件管理器會(huì)在創(chuàng)建皮膚控件時(shí)調(diào)用此接口,為皮膚 控件設(shè)置正確的參數(shù)值。在實(shí)現(xiàn)此接口時(shí),必須調(diào)用父類(lèi)的相應(yīng)函數(shù),以保證 父類(lèi)成員也可以正確設(shè)置。用于提供控制特性的控件類(lèi),如CQPSkinElement,派生于CQPWnd和 CWnd,即同時(shí)具備Windows窗口和CQPObject的特性,用于實(shí)現(xiàn)大多數(shù)繪圖 及控制相關(guān)的內(nèi)容,用戶(hù)需創(chuàng)建的皮膚控件必須從CQPSkinElement中繼承。 在CQPSkinElement中提供有以下接口及其缺省的實(shí)現(xiàn)創(chuàng)建Create,皮膚控件管理器在創(chuàng)建皮膚控件時(shí)會(huì)調(diào)用,該接口根據(jù)對(duì)應(yīng) 的參數(shù)創(chuàng)建一個(gè)皮膚控件。獲取參數(shù)GetParams,用于獲取相應(yīng)皮膚控件所關(guān)聯(lián)的參數(shù)類(lèi)的指針。繪制背景DrawBackgroimd,可通過(guò)改寫(xiě)繪制特有的背景,缺省的實(shí)現(xiàn)是使 用控件關(guān)聯(lián)的圖片來(lái)繪制背景,在繼承類(lèi)中可以通過(guò)改寫(xiě)繪制特有的背景。繪制前景Drawltem,在繼承類(lèi)中可通過(guò)改寫(xiě)繪制特有的前景。設(shè)置繪制區(qū)域SetDrawRegion,如果在XML配置文件中皮膚控件的 ClipRegion屬性有效,表示皮膚控件的圖片包含透明區(qū)域,該接口會(huì)在控件大 小改變時(shí)調(diào)用,負(fù)責(zé)計(jì)算皮膚控件有效的區(qū)域,并通過(guò)調(diào)用其它接口設(shè)置所計(jì) 算的皮膚控件有效區(qū)域。子控件布局LayoutElements,負(fù)責(zé)對(duì)各個(gè)子皮膚控件進(jìn)行布局,是皮膚控 件的核心,其中包含了對(duì)自身的遞歸調(diào)用。此接口中,通過(guò)各個(gè)皮膚控件的位 置、大小等的屬性,例如Gaps、 Width、 Height、 Align等,來(lái)計(jì)算皮膚控件的 大小及其所在位置并放置皮膚控件。查找關(guān)聯(lián)元素SearchAttachElements,負(fù)責(zé)將在XML配置文件中設(shè)置的皮 膚控件的子皮膚控件與皮膚控件的成員變量關(guān)聯(lián)。初始化元素InitElements,負(fù)責(zé)在皮膚控件創(chuàng)建完成后進(jìn)行一些初始化的工 作,例如對(duì)皮膚控件的成員變量設(shè)置正確的初始值等。作為公共元素的公共控件,如CQPSkinFont,這些公共控件可以被某些控 件類(lèi)作為參數(shù)使用。這些控件在實(shí)現(xiàn)上與控件類(lèi)類(lèi)似,只是公共控件被多個(gè)皮 膚控件所復(fù)用。所述皮膚控件管理器還可以包括圖像加載管理單元,用于控制圖像文件是 否加載;策略設(shè)置單元,用于設(shè)置皮膚控件對(duì)齊策略和圖像變形繪制策略?;谏鲜龌究丶?,用戶(hù)可以自行設(shè)置皮膚控件類(lèi)型,并根據(jù)應(yīng)用的需要 來(lái)實(shí)現(xiàn)皮膚控件的相應(yīng)功能,用戶(hù)自行設(shè)置皮膚控件時(shí)只需實(shí)現(xiàn)相應(yīng)的接口 , 并增加到皮膚控件管理器的相關(guān)映射表中,皮膚控件管理器即可自動(dòng)完成對(duì)這 些皮膚控件的管理。這里,所述相關(guān)映射表指皮膚控件ID到其創(chuàng)建函數(shù)指針、 皮膚控件類(lèi)型到其創(chuàng)建函數(shù)指針這兩個(gè)映射表,皮膚控件管理器會(huì)從這兩個(gè)映 射表中查找相應(yīng)皮膚控件的創(chuàng)建函數(shù)指針,并創(chuàng)建相應(yīng)皮膚控件。并且,由于用戶(hù)自行設(shè)置的皮膚控件實(shí)現(xiàn)了上面所述的接口,因此,皮膚控件管理器通過(guò) 相關(guān)的接口即可對(duì)相應(yīng)皮膚控件自動(dòng)進(jìn)行管理。本發(fā)明中,動(dòng)態(tài)創(chuàng)建所需皮膚控件的過(guò)程如圖3所示,包括以下步驟 步驟301:皮膚控件管理器從XML配置文件中讀取配置信息; 這里,所述XML配置文件通常放置在硬盤(pán)中用戶(hù)應(yīng)用程序相關(guān)的目錄下, XML配置文件的內(nèi)容由用戶(hù)輸入,是用戶(hù)在編寫(xiě)應(yīng)用程序時(shí)對(duì)自身程序界面如 何表現(xiàn)的設(shè)計(jì),例如設(shè)置有哪些按鈕,按鈕上是什么圖片之類(lèi)等,并釆用皮 膚系統(tǒng)規(guī)定的格式進(jìn)行描述。所述配置信息包括要?jiǎng)?chuàng)建的皮膚控件的標(biāo)識(shí)(ID)、皮膚控件類(lèi)型以及皮膚控件的各種屬性。步驟302-303:根據(jù)皮膚控件的ID查找創(chuàng)建函數(shù),判斷是否找到創(chuàng)建函 數(shù),如果找到,則直接執(zhí)行步驟306;否則,執(zhí)行步驟304。步驟304 305:根據(jù)要?jiǎng)?chuàng)建的皮膚控件類(lèi)型査找創(chuàng)建函數(shù),判斷是否找到 創(chuàng)建函數(shù),如果找到,則直接執(zhí)行步驟306;否則,未找到創(chuàng)建函數(shù),報(bào)錯(cuò)并 結(jié)東當(dāng)前處理流程。這里,用戶(hù)可以設(shè)置一類(lèi)皮膚控件,例如一種按鈕皮膚控件,由于所有按 鈕皮膚控件都使用相同的方式創(chuàng)建,這種情況下,創(chuàng)建按鈕皮膚控件時(shí)就會(huì)使 用皮膚控件類(lèi)型(即按鈕)進(jìn)行查找;如果用戶(hù)為某一個(gè)按鈕如按鈕A進(jìn)行了 定制,即按鈕A與其它按鈕有不同的地方,那么,用戶(hù)需要為按鈕A單獨(dú)設(shè)置 一個(gè)皮膚控件,雖然此皮膚控件的類(lèi)型仍是按鈕,但只在創(chuàng)建按鈕A時(shí)會(huì)使用 皮膚控件的ID查找,創(chuàng)建其它按鈕時(shí)仍使用通用的按鈕皮膚控件。本發(fā)明中采用維護(hù)控件創(chuàng)建指針的方法創(chuàng)建各種皮膚控件,所有的控件類(lèi) 中都包含了創(chuàng)建自身的靜態(tài)函數(shù)。在皮膚控件管理器中維護(hù)有兩個(gè)映射表 (map),分別是皮膚控件ID到其創(chuàng)建函數(shù)指針的映射、以及皮膚控件類(lèi)型 到其創(chuàng)建函數(shù)指針的映射,基于所設(shè)置的兩個(gè)映射表,可以根據(jù)控件類(lèi)型或控 件ID來(lái)找到相應(yīng)的創(chuàng)建函數(shù),進(jìn)而正確創(chuàng)建控件。用戶(hù)通過(guò)皮膚控件管理器對(duì) 上述映射表進(jìn)行初始化,所述初始化就是設(shè)置好皮膚控件ID與創(chuàng)建函數(shù)的對(duì)應(yīng) 關(guān)系、以及皮膚控件類(lèi)型與創(chuàng)建函數(shù)的對(duì)應(yīng)關(guān)系。步驟306:皮膚控件管理器調(diào)用找到的創(chuàng)建函數(shù)實(shí)例化皮膚控件。本步驟中,由于前面已獲取到皮膚控件的創(chuàng)建函數(shù)指針,創(chuàng)建函數(shù)指針的 作用就是實(shí)例化一個(gè)皮膚控件,因此,皮膚控件管理器可通過(guò)所獲得的指針直 接調(diào)用創(chuàng)建函數(shù),完成對(duì)皮膚控件的實(shí)例化。步驟307:皮膚控件管理器根據(jù)所提供的基本控件獲得皮膚控件的參數(shù)對(duì) 象指針。這里,之所以要獲取參數(shù)對(duì)象指針,原因是在實(shí)例化一個(gè)皮膚控件之后, 要有正確的參數(shù)才能真正創(chuàng)建相應(yīng)的皮膚控件。 一般,皮膚控件所涉及的參數(shù) 也在XML配置文件中設(shè)置,且不同的皮膚控件類(lèi)對(duì)應(yīng)的參數(shù)不同。由于參數(shù) 變化是很普遍的,為了更好的支持?jǐn)U展,不應(yīng)一發(fā)生參數(shù)變化就直接修改皮膚 控件管理器中的代碼,皮膚控件管理器不需要知道每個(gè)皮膚控件有哪些參數(shù), 只要按照統(tǒng)一的方式來(lái)創(chuàng)建皮膚控件即可。因此,皮膚系統(tǒng)為每個(gè)皮膚控件類(lèi) 都設(shè)置了相應(yīng)的參數(shù)類(lèi),皮膚控件管理器只需得到相應(yīng)的參數(shù)類(lèi),并將參數(shù)設(shè) 置進(jìn)去就可以了 ,皮膚控件類(lèi)在創(chuàng)建自身時(shí)直接使用這些參數(shù)。步驟308:從XML配置文件中讀入皮膚控件關(guān)聯(lián)的屬性,配置參數(shù)對(duì)象。 步驟309:根據(jù)配置的參數(shù)實(shí)際創(chuàng)建所需的皮膚控件,即創(chuàng)建相應(yīng)的窗口。 步驟310:如果需要?jiǎng)?chuàng)建子皮膚控件,可通過(guò)遞歸方式創(chuàng)建步驟309所創(chuàng) 建的皮膚控件的子皮膚控件,并將創(chuàng)建的子皮膚控件加入到相應(yīng)的子皮膚控件 列表中。需要說(shuō)明的是并非每個(gè)皮膚控件都需要?jiǎng)?chuàng)建子皮膚控件, 一個(gè)皮膚控件 可以有子皮膚控件也可以沒(méi)有,是否具有子皮膚控件是用戶(hù)在XML配置文件 中設(shè)置好的,皮膚控件管理器通過(guò)讀取的配置信息可以獲知是否需要?jiǎng)?chuàng)建子皮 膚控件。另外,每個(gè)皮膚控件都會(huì)維護(hù)自身的子皮膚控件列表,如果相應(yīng)皮膚 控件沒(méi)有子皮膚控件,則相應(yīng)列表為空,列表的內(nèi)容就是子皮膚控件的指針。舉個(gè)具體例子來(lái)說(shuō)明圖3所述創(chuàng)建皮膚控件的過(guò)程,圖4為一個(gè)播放器的 標(biāo)題欄部分,如圖4所示,該標(biāo)題欄部分包括若干個(gè)皮膚控件最下層的一個(gè) 靜態(tài)(STATIC)皮膚控件,上面的幾個(gè)按鈕皮膚控件,包括關(guān)閉、最大化、最13小化等按鈕,中間的一個(gè)標(biāo)簽(LABEL)控件等。在XML配置文件中,分別對(duì)每個(gè)皮膚控件的不同屬性進(jìn)行了詳細(xì)描述, 包括標(biāo)識(shí)(ID)、類(lèi)型、圖像模式、繪制方式、對(duì)齊方式、高度(Height)、間 距(Gap)、文本等等。那么,在創(chuàng)建過(guò)程中,皮膚控件管理器先在映射表中查找皮膚控件ID為 CaptionFrame的創(chuàng)建函數(shù),如果沒(méi)找到,則查找皮膚控件類(lèi)型為StaticControl 的創(chuàng)建函數(shù),然后使用所找到的創(chuàng)建函數(shù)實(shí)例化一個(gè)皮膚控件;接著,通過(guò)調(diào)用GetParams接口獲取該皮膚控件的參數(shù)類(lèi)指針,再調(diào)用參 數(shù)類(lèi)的SetParams接口,將XML配置文件中所設(shè)置的參數(shù)設(shè)置到參數(shù)類(lèi)中,如 對(duì)靜態(tài)皮膚控件設(shè)置的BgType="Bitmap"、 Image="STATIC—CAPTION—ACT.BMP"、 Draw ="Stretch"、 Align="TopHStretch"、 Height="22"、 NcHitTest="HTCAPTION" 、 AcceptDblClk= "True",完成對(duì)皮膚控件的參數(shù)配置;之后,調(diào)用基本控件中的Create接口創(chuàng)建所需的皮膚控件,即創(chuàng)建相應(yīng)的 窗口;最后,由于CaptionFrame有子皮膚控件,所以按照上述流程遞歸創(chuàng)建每個(gè) 子皮膚控件,如本例中的SysColoseBtn等,并將子皮膚控件加入到子皮膚控件 列表中。在創(chuàng)建子皮膚控件時(shí)會(huì)重復(fù)上述過(guò)程,本例子中,子皮膚控件沒(méi)有再 包括子皮膚控件,這時(shí),相應(yīng)子皮膚控件中的子皮膚控件列表就為空。在進(jìn)行圖像文件加載時(shí),本發(fā)明所采用的圖像文件管理方法如圖5所示, 包括以下步驟步驟501:創(chuàng)建皮膚控件時(shí),讀入與所創(chuàng)建皮膚控件相關(guān)聯(lián)的圖像文件名。步驟502:根據(jù)圖像文件名在映射表中査找圖像數(shù)據(jù);這里,所述映射表為皮膚控件與已加載圖像數(shù)據(jù)之間的對(duì)應(yīng)關(guān)系表,每次 當(dāng)新的圖像數(shù)據(jù)被加載后,會(huì)在映射表中增加新的映射表項(xiàng),給出皮膚控件與 圖像數(shù)據(jù)之間的對(duì)應(yīng)關(guān)系,以方便后續(xù)査找。步驟503 - 505:判斷是否找到所需的圖像數(shù)據(jù),如果找到,說(shuō)明相應(yīng)圖像 數(shù)據(jù)已加載過(guò),只需將相應(yīng)圖像數(shù)據(jù)的指針?lè)答伣o當(dāng)前要?jiǎng)?chuàng)建的皮膚控件,并將指針保存在當(dāng)前要?jiǎng)?chuàng)建的皮膚控件的成員變量中;否則,說(shuō)明相應(yīng)圖像數(shù)據(jù) 未加載過(guò),則分配相應(yīng)圖像數(shù)據(jù)所需的資源,加載相應(yīng)圖像數(shù)據(jù),并在映射表 中增加該圖像文件名到圖像數(shù)據(jù)的映射項(xiàng)。這里,所述指針為相應(yīng)圖像數(shù)據(jù)所加載位置的地址,皮膚控件在需要相應(yīng) 圖像數(shù)據(jù)時(shí),直接到指定位置獲取即可?;趫D5給出的流程,就可以在多個(gè)皮膚控件復(fù)用同一圖像數(shù)據(jù)時(shí),只加 載一次所需的圖像數(shù)據(jù),無(wú)需多次重復(fù)加載,占用系統(tǒng)資源。并且,在需要對(duì) 所有圖像數(shù)據(jù)進(jìn)行操作時(shí),比如對(duì)所有圖像數(shù)據(jù)改變顏色,可直接對(duì)映射表對(duì) 應(yīng)的圖像數(shù)據(jù)進(jìn)行操作,如此可大大加快處理速度,提供處理效率。為減少皮膚控件和圖像文件的數(shù)量,本發(fā)明皮膚系統(tǒng)的實(shí)現(xiàn)方法還可以預(yù) 先設(shè)置皮膚控件對(duì)齊方式的策略以及圖像變形繪制的策略,具體的,皮膚控件 對(duì)齊方式的設(shè)置如表一所示,圖像變形繪制的設(shè)置如表二所示。對(duì)齊方式說(shuō)明Left靠左對(duì)齊Right靠右對(duì)齊Top靠上對(duì)齊Bottom靠下對(duì)齊Client四周對(duì)齊BottomRight右下角停放,這種對(duì)齊方式的控件與兄弟控件可以重合LeftVStretch靠左對(duì)齊,垂直延展RightVStretch靠右對(duì)齊,垂直延展TopHStretch靠上對(duì)齊,水平延展BottomHStretch靠下對(duì)齊,水平延展表一繪制方式說(shuō)明Tile模板繪制Stretch延展繪制VFrame垂直框架,上下兩端固定繪制,中部垂直延展繪制HFrame水平框架,左右兩端固定繪制,中部水平延展繪制Frame框架,四角固定繪制,中部水平垂直延展繪制表二基于表一、表二的設(shè)置,可以方便地描述較為復(fù)雜的皮膚控件,例如對(duì)于充滿(mǎn)窗口圓角矩形皮膚控件,在描述時(shí)可將其對(duì)齊方式設(shè)置為Client,繪制 方式設(shè)置為Frame,這樣,當(dāng)圓角矩形皮膚控件需要延展時(shí),不需要將圓角矩 形皮膚控件切分為四個(gè)圓角和中間部分幾個(gè)小皮膚控件,并分別對(duì)不同的小皮 膚控件進(jìn)行擴(kuò)展或不擴(kuò)展的處理,而只需按描述的屬性完成延展變化即可。由于某些皮膚控件是被多個(gè)皮膚控件共用的,這樣,可以設(shè)置公共控件設(shè) 置區(qū),在此區(qū)域內(nèi)可聲明某個(gè)皮膚控件為公共控件,公共控件可提供給需要公 共控件的皮膚控件所引用。設(shè)置為公共控件的包括字體皮膚控件、位圖字體 皮膚控件、區(qū)域皮膚控件、滾動(dòng)條皮膚控件等等。以上所述,僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。
權(quán)利要求
1、一種可擴(kuò)展的皮膚系統(tǒng),其特征在于,該系統(tǒng)包括皮膚控件管理器、一個(gè)以上基本控件以及XML解析器;其中,皮膚控件管理器,用于管理所有皮膚控件,負(fù)責(zé)從XML解析器中讀取解析后的XML配置文件中的相關(guān)配置信息并創(chuàng)建所需皮膚控件;基本控件,用于在用戶(hù)使用皮膚系統(tǒng)創(chuàng)建應(yīng)用程序時(shí)直接使用、或作為基本皮膚控件創(chuàng)建用戶(hù)所需的皮膚控件;XML解析器,負(fù)責(zé)讀取并解析XML配置文件,將解析后的內(nèi)容提供給皮膚控件管理器調(diào)用并讀取。
2、 根據(jù)權(quán)利要求l所述的皮膚系統(tǒng),其特征在于,所述皮膚控件管理器進(jìn) 一步包括皮膚控件管理單元、皮膚控件創(chuàng)建單元、配置信息讀取單元;其中,皮膚控件管理單元,用于管理所有皮膚控件;配置信息讀取單元,負(fù)責(zé)從XML解析器中讀取解析后的配置信息,并將讀取的配置信息發(fā)送給皮膚控件創(chuàng)建單元和皮膚控件管理單元;皮膚控件創(chuàng)建單元,根據(jù)收到的配置信息創(chuàng)建用戶(hù)所需的皮膚控件。
3、 根據(jù)權(quán)利要求l所述的皮膚系統(tǒng),其特征在于,所述基本控件包括提供接口的基類(lèi)控件、設(shè)置參數(shù)的參數(shù)類(lèi)、提供控制特性的控件類(lèi)以及作為公共元 素的公共控件。
4、 根據(jù)權(quán)利要求l、 2或3所述的皮膚系統(tǒng),其特征在于,所述皮膚控件 管理器還包括皮膚控件ID到其創(chuàng)建函數(shù)指針的映射表、以及皮膚控件類(lèi)型到其 創(chuàng)建函數(shù)指針的映射表。
5、 根據(jù)權(quán)利要求l、 2或3所述的皮膚系統(tǒng),其特征在于,所述皮膚控件 管理器還包括圖像加載管理單元,用于控制圖像文件是否加載。
6、 根據(jù)權(quán)利要求l、 2或3所述的皮膚系統(tǒng),其特征在于,所述皮膚控件 管理器還包括策略設(shè)置單元,用于設(shè)置皮膚控件對(duì)齊策略和圖像變形繪制策略。
7、 一種可擴(kuò)展皮膚系統(tǒng)的實(shí)現(xiàn)方法,其特征在于,提供一個(gè)以上基本控件,該方法還包括A、 從XML配置文件中讀取配置信息,根據(jù)所讀取的配置信息查找創(chuàng)建函 數(shù),如果找到,則執(zhí)行步驟B,否則結(jié)東當(dāng)前處理流程;B、 調(diào)用所找到的創(chuàng)建函數(shù)實(shí)例化皮膚控件,并根據(jù)基本控件獲得皮膚控 件的參數(shù)對(duì)象指針;C、 從XML配置文件中讀入皮膚控件關(guān)聯(lián)的屬性,配置參數(shù)對(duì)象,根據(jù)配 置的參數(shù)創(chuàng)建所需的皮膚控件。
8、 根據(jù)權(quán)利要求7所述的實(shí)現(xiàn)方法,其特征在于,步驟C之后,該方法 進(jìn)一步包括通過(guò)遞歸方式創(chuàng)建步驟C所創(chuàng)建的皮膚控件的子皮膚控件,并將創(chuàng)建的子皮膚控件加入到相應(yīng)的子皮膚控件列表中。
9、 根據(jù)權(quán)利要求7或8所述的實(shí)現(xiàn)方法,其特征在于,所述基本控件包括 提供接口的基類(lèi)控件、設(shè)置參數(shù)的參數(shù)類(lèi)、提供控制特性的控件類(lèi)以及作為公 共元素的公共控件。
10、 根據(jù)權(quán)利要求7或8所述的實(shí)現(xiàn)方法,其特征在于,該方法進(jìn)一步包 括在皮膚控件管理器中設(shè)置皮膚控件ID到其創(chuàng)建函數(shù)指針的映射表、以及皮 膚控件類(lèi)型到其創(chuàng)建函數(shù)指針的映射表;步驟A所述査找創(chuàng)建函數(shù)為根據(jù)所設(shè)置的映射表進(jìn)行查找。
11、 根據(jù)權(quán)利要求IO所述的實(shí)現(xiàn)方法,其特征在于,圖像文件加載時(shí),該 方法還包括a. 讀入與所創(chuàng)建皮膚控件相關(guān)聯(lián)的圖像文件名;b. 根據(jù)圖像文件名在所述映射表中查找圖像數(shù)據(jù);c. 判斷是否找到所需的圖像數(shù)據(jù),如果找到,則將相應(yīng)圖像數(shù)據(jù)的指針?lè)?饋給當(dāng)前要?jiǎng)?chuàng)建的皮膚控件,并將指針保存在當(dāng)前要?jiǎng)?chuàng)建的皮膚控件的成員變 量中;否則,分配相應(yīng)圖像數(shù)據(jù)所需的資源,加載相應(yīng)圖像數(shù)據(jù),并在映射表 中增加所述圖像文件名到圖像數(shù)據(jù)的映射項(xiàng)。
12、 根據(jù)權(quán)利要求7或8所述的實(shí)現(xiàn)方法,其特征在于,該方法還包括 預(yù)先設(shè)置皮膚控件對(duì)齊方式的策略以及圖像變形繪制的策略。
全文摘要
本發(fā)明公開(kāi)了一種可擴(kuò)展的皮膚系統(tǒng),包括皮膚控件管理器,用于管理所有皮膚控件,負(fù)責(zé)從XML解析器中讀取解析后的XML配置文件中的相關(guān)配置信息并創(chuàng)建所需皮膚控件;基本控件,用于在用戶(hù)使用皮膚系統(tǒng)創(chuàng)建應(yīng)用程序時(shí)直接使用、或作為基本皮膚控件創(chuàng)建用戶(hù)所需的皮膚控件;XML解析器,負(fù)責(zé)讀取并解析XML配置文件,將解析后的內(nèi)容提供給皮膚控件管理器調(diào)用并讀取。本發(fā)明還公開(kāi)了一種可擴(kuò)展皮膚系統(tǒng)的實(shí)現(xiàn)方法,提供一個(gè)以上基本控件,并基于提供的基本控件創(chuàng)建所需的皮膚控件。采用本發(fā)明能在系統(tǒng)資源占用盡量少的基礎(chǔ)上,實(shí)現(xiàn)皮膚控件的任意擴(kuò)展。
文檔編號(hào)G06F9/44GK101256490SQ20081008433
公開(kāi)日2008年9月3日 申請(qǐng)日期2008年3月18日 優(yōu)先權(quán)日2008年3月18日
發(fā)明者吳運(yùn)聲 申請(qǐng)人:騰訊科技(深圳)有限公司