轉貼 Skin技術實現框架(四)

2021-03-31 08:56:58 字數 1711 閱讀 5820

今天有點空了,繼續寫。

上次我們已經得出了基本的設計,由此確定了每種視窗必須有乙個類來與之對應,這裡所說的視窗種類是按照視窗的windows class名稱來區分的,class名稱相同的就認為是一種視窗。這種分類方法和我們看到的視窗種類可能有一些差異,例如,普通按鈕,單選按鈕和核取方塊的類名都是「button」,對於這種情況,我們仍然用乙個類來對應這些視窗,而在類內部區分對待這些不同的視窗。

這樣,我們要為每種需要改變外觀的控制項視窗編寫乙個類,根據物件導向的思想,我們很自然的想到提取出它們的公共基類,這就是cwidgethookbase,所有控制項視窗處理類的公共基類,實際上是乙個c++介面,因為它只包含乙個純虛函式,下面是它的定義:

///

/// abstract base class for widget hook

class

cwidgethookbase

;

這個介面中唯一的install函式用來實現把物件鏈結到視窗的功能,也就是subclasswindow,這會在繼承類實現,後面我們再說怎麼實現它。今天要講的實際上是控制項類工廠,也就是cwidgetfactory及其繼承類。下面是cwidgetfactory的完整宣告和實現:/

/// abstract factory class for widget hooks. create hook instances

class

cwidgetfactory

// get the singleton instance

static

cwidgetfactory* instance()

virtual

cwidgethookbase*

createwidget(lpctstr

szclass) = 0;

};

cwidgetfactory

* cwidgetfactory::m_pinstance = null;

cwidgetfactory使用了兩個設計模式,singleton模式和abstract factory模式,實際上還包括factory method模式。

首先看抽象工廠模式,我們希望控制項工廠根據視窗class的名字建立出不同的控制項視窗訊息處理類。對於模擬mac的系統,這些控制項視窗訊息處理類包括cmacbutton, cmac***bobox, cmactrackbar等;而對於模擬kde的系統,則是ckdebutton, ckde***bobox等。這樣,我們就可以定義兩個cwidgetfactory的繼承類,分別叫cmacfactory和ckdefactory,分別產生這兩個系列的物件。cwidgetfactory::createwidget就是用來產生這些物件的方法,它是個純虛函式,必須在繼承類中實現。createwidget接受視窗class的名字為引數,返回cwidgethookbase指標,也就是所有控制項類的基類。這樣,每個物件工廠負責產生一系列物件,但對於乙個應用程式來說,應該只有一種風格,也就是說,只能有乙個工廠的例項,單件模式來了

這裡使用了簡化版的singleton模式,需要宣告乙個繼承類的例項,然後通過cwidgetfactory的靜態函式instance得到這個唯一例項。這裡沒有控制不能生成第二個例項,不過這不是大問題。

現在來看factory的乙個實現,cmacfactory,完整的**如下:

class

cmacfactory : public

cwidgetfactory

};再看看訊息鉤子的**,都很簡單吧

轉貼 Skin技術實現框架(三)

上次 說了hook和視窗類的原理,有了hook,我們可以擷取所有訊息,有了視窗類,我們可以識別視窗型別,不同型別的視窗給予不同處理。這樣,我們要在鉤子函式裡面識別不同的視窗和不同的訊息,有大量的分派工作,更要命的是,光區分視窗類還不夠,同型別的不同視窗經常需要不同的處理,例如兩個button視窗,大...

剖析廣州「開四停四」交通限行的實現技術

本文由frank 發表於雲 社群專欄 為緩解廣州城區的道路交通緊張狀況,廣州已於2018年7月1日起進行管控區域的 外地牌車 實施 開四停四 管理措施通行規則,執法部門已於8月1日起正式依據規則進行非廣州市籍車輛通行的拍攝取證工作。今天我們就從技術的角度,來剖析一下如何技術上實現 開四停四 的判定執...

會話跟蹤技術的四種實現方法

瀏覽器與伺服器之間的通訊是通過http協議進行通訊,但http協議是無狀態協議,他不儲存客戶資訊,即當連線一次後就斷開了,下一次請求會重新連線,這樣就需要告訴伺服器你和上一次的連線的人是不是同乙個使用者,那麼就需要用到會話跟蹤技術才能實現 url重寫在客戶端瀏覽器不支援cookie的情況下使用的,它...