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