VC++中subclassdlgitem函數的功能、用法及注意事項

本文轉載:http://blog.csdn.net/testcs_dn/article/details/7649583

subclassdlgitem
  該函數用來子類化一個控件.
  Subclass(子類化)是MFC中最常用的窗體技術之一。子類化完成兩個工作:一是把窗體類對象attach到一個windows窗體實體中(即把一個窗體的hwnd賦給該類)。另外就是把該類對象的消息加入到消息路由中,使得該類可以捕獲消息。
  SubclassDlgItem可以把對話框中已有的控件與某個窗口對象動態連接起來,該窗口對象將接管控件的消息處理,從而使控件具有新的特性.SubclassDlgItem函數的聲明爲
  BOOL SubclassDlgItem( UINT nID, CWnd* pParent );
  參數nID是控件的ID,pParent是指向父窗口的指針.若連接成功則函數返回TRUE,否則返回FALSE.
  綜上所述,要在程序中使用派生控件,應該按下面兩步進行:
  在對話框模板中放置好基類控件.
  在對話框類中嵌入派生控件類的對象.
  在OnInitDialog中調用SubclassDlgItem將派生類的控件對象與對話框中的基類控件相連接,則這個基類控件變成了派生控件
 
        要在程序中創建新設計的控件,顯然不能用自動創建的辦法,因爲對話框模板對新控件的特性一無所知.程序可以用手工方法創建控件,在調用派生類的Create函數時,派生類會調用基類的Create函數創建控件.用Create函數創建控件是一件比較麻煩的工作,程序需要爲函數指定一大堆的控件風格以及控件的座標和ID.特別是控件的座標,沒有經驗的程序員很難確切地安排控件的位置和大小,往往需要反覆調整.利用MFC的CWnd::SubclassDlgItem提供的動態連接功能,可以避免Create函數的許多麻煩,該函數大大簡化了在對話框中創建派生控件的過程.
大家知道,在用手工方法創建控件時,先要構建一個控件對象,然後再用Create函數在屏幕上創建控件窗口,也就是說,控件的創建工作是由控件對象完成的.動態連接的思路則不同,SubclassDlgItem可以把對話框中已有的控件與某個窗口對象動態連接起來,該窗口對象將接管控件的消息處理,從而使控件具有新的特性.SubclassDlgItem函數的聲明爲
BOOL SubclassDlgItem( UINT nID, CWnd* pParent ); 
參數nID是控件的ID,pParent是指向父窗口的指針.若連接成功則函數返回TRUE,否則返回FALSE.
綜上所述,要在程序中使用派生控件,應該按下面兩步進行:
在對話框模板中放置好基類控件.
在對話框類中嵌入派生控件類的對象.
否則函數將會執行失敗,一定要注意!
在OnInitDialog中調用SubclassDlgItem將派生類的控件對象與對話框中的基類控件相連接,則這個基類控件變成了派生控件.
 
例如,如果要在對話框中使用新設計的編輯框控件,應先在對話框模板中的合適位置放置一個普通的編輯框,然後,在OnInitDialog函數中按下面的方式調用SubclassDlgItem即可:
BOOL CMyDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_MyEdit.SubclassDlgItem(IDC_MYEDIT, this);
return TRUE;
}
下面的代碼演示通過配置文件創建自定義按鈕,使用“SubclassDlgItem”,
並解決沒有在對話框模板中放置好基類控件的方法
  1. <span style="font-size:16px;">CxSkinButton *pSkinBnt = NULL;  
  2. pSkinBnt = new CxSkinButton; // del at Clear();  
  3.   
  4. //子類化控件  
  5. BOOL ret = pSkinBnt->SubclassDlgItem(id,parent);  
  6.   
  7. //如果執行失敗,則說明沒有在對話框模板中放置好基類控件  
  8. if (!ret)  
  9. {  
  10.     //創建按鈕  
  11.     UINT stype = WS_CHILD|WS_VISIBLE;  
  12.     pSkinBnt->Create(NULL, stype, rect, parent, id);  
  13. }</span>  

我調用“SubclassDlgItem”函數成功了,
爲什麼按鈕卻沒有顯示呢?

一共就兩個參數,ID,Parent,檢查一下參數傳遞的是否正確吧!
如果使用了重複的ID,就會出現這種情況。
另外,如果做了變量映射,調用此函數就會觸發:Asert(m_hwnd== NULL);

發佈了2 篇原創文章 · 獲贊 11 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章