視窗的子類化與超類化

2021-05-21 17:14:45 字數 1847 閱讀 3418

1. 子類化

改變乙個已經存在的視窗例項的性質:訊息處理與其他例項屬性。

在sdk程式設計範疇內,子類化就是改變乙個視窗例項的視窗函式(通過getwindowlong()和setwindowlong()),子類化所要做的就是為某視窗例項編寫新的視窗函式。其操作是在例項級別上進行的。

在mfc中子類化的情況有所不同:所有mfc視窗有相同的視窗函式,由該視窗函式根據視窗控制代碼查詢視窗例項,在把訊息對映到該視窗類(class)得訊息處理函式上。為了利用mfc的訊息對映機制,不宜改變視窗函式(名),mfc也把子類化封裝在函式subclasswindow()中。但子類化的本質沒有變:在例項級別影響視窗的訊息及其處理。例:

class  b :public a

a  a;

b  b;

hwnd ha=a.getsafehwnd();

b.subclasswindow(ha); #當然a 和b 不一定是繼承關係。

注意:在被子類化的視窗銷毀之前,必須執行視窗的反子類化:

b.unsubclasswindow();

2 超類化

視窗超類化是在視窗類——wndclass或wndclas***(非mfc類概念)級別進行的改變視窗類特徵的

使用過程:首先獲得乙個已存在的視窗類,然後設定視窗類,最後註冊該視窗類。

例:wndclas***  wc;

wc.cbsize=sizeof(wc); //windows用來進行版本檢查的,與視窗特徵無關

getclassinfoex(hinst,」******」,&wc);

// hinst—定義視窗類******的模組的控制代碼,如為系統定義的視窗類(如:edit、button)則hinst=null.。

wc.lpszclassname = 「yyyyyyy」;//必須改變視窗類的名字

wc.hbrbackground = createsolidbrush(rgb(0,0.0));//改變背景刷

wc.lpfnwndproc = newwndproc;//改變視窗函式

……registerclas***(&wc);// 註冊新視窗類

//使用視窗類

……::createwindow(_t(「yyyyyyyy」,……);

故超類化只能改變自己建立的視窗的特徵,而不能用於由windows建立的視窗(如對話方塊上的按鈕就不能進行超類化) 。而子類化是例項級別上的,只要能獲得視窗的例項,就可對其子類化,這是唯一的子類化對於超類化的優勢。另外,凡是子類化可實現的,超類化都可實現,不過超類化用起來較麻煩。

3. 總結

(0) 子類化修改視窗過程函式,  超類化修改視窗類(新的視窗類名)

(1) 子類化是在視窗例項級別上的,超類化是在視窗類(wndclass)級別上的。

(2) 超類化可以完成比子類化更複雜的功能,在sdk範疇上,可以認為子類化是超類化的子集。

(3) 子類化只能改變視窗建立後的性質,對於視窗建立期間無能為力(無法截獲on_create 事件),而超類化可以實現;超類化不能用於windows建立的視窗,子類化可以。 

4. 其他

在 眼見為實(2):介紹windows的視窗、訊息、子類化和超類化

這裡有乙個例子..

可以得出結論

a) 子類化的classname 是不會變化的, 而超類化使用新註冊classname

b) 子類化 & 超類化 描述的是乙個動作 和實現方法沒什麼關係..... 主要是子類化是subclasswindow, subclassdlgitem, 而超類化是registerclas***(&newwindowclass)

c) 感覺具體沒有必要區分這些, 實現功能就行了, 呵呵

視窗的子類化與超類化

視窗的子類化與超類化 1.子類化 改變乙個已經存在的視窗例項的性質 訊息處理與其他例項屬性。在sdk程式設計範疇內,子類化就是改變乙個視窗例項的視窗函式 通過getwindowlong 和setwindowlong 子類化所要做的就是為某視窗例項編寫新的視窗函式。其操作是在例項級別上進行的。在mfc...

視窗子類化與超類化

範疇上,可以認為子類化是 超類化的子集。下面分別給出原始碼 子類化 儲存視窗預設的訊息響應函式指標 wndproc psubclassoldeditproc 用於替換子類化視窗的訊息響應函式 lresult callback jceditprocsubclass hwnd hwnd,uint mes...

視窗的子類化(收藏)

視窗子類化技術最大的特點就是能夠擷取 windows 的訊息。一旦使用者自定義的視窗函式擷取了傳向原視窗函式的訊息,就可以對被擷取的訊息進行如下處理 將其傳給原來的視窗函式。這是對大多數訊息應該採取的措施,因為子類通常只對原來的視窗特性作少量的改動 擷取該訊息,阻止其向原視窗函式傳送。修改該訊息,修...