本文轉載:http://blog.csdn.net/chinaclock/article/details/5737603
SubClass Dialog 上面的一個控件呀!
SubClass 某個控件後,其原來的 WindowProc 替換成你自己寫的 CYourCWndClass 的 WindowProc,這樣你就可以處理這個控件的所有消息了;用 ClassWizard 維護自己的 CYourCWndClass 就可以了。
在MFC中除了SubClassDlgItem外還有SubclassWindow函數用來執行同樣的功能。在與某個控件ID關聯起來之後,所有該控件的消息將會有該類來響應。通常使用過程如下
一、從希望Subclass的控件派生一個類例如從CEdit->CMyEdit;
二、在CMyEdit中完成希望處理的消息,例如OnChar等;
三、在對話框類中定義一個CMyEdit類的成員變量m_myEdit;
四、在Dialog的OnInitDialog中加入m_myEdit(IDC_EDIT, this);
這樣當在IDC_EDIT上發生OnChar時,將會調用CMyEdit中的OnChar
補充一下,用一個窗口過程替換另一個過程的行爲叫SUBCLASSING,這是WINDOWS意義上的派生子類,與面嚮對象語言的派生子類是完全不同的概念。SubClassDlgItem讓對話框內指定子控制自己的窗口過程替代默認窗口過程,以攔截消息。
在VC 中,DoDataExchange函數中的DDX_Control之類的函數會調用SubClassDlgItem完成窗口子類化,這樣控件自己就能處理消息了。
BOOL SubclassDlgItem( UINT nID, CWnd* pParent );
參數nID是控件的ID,pParent是指向父窗口的指針.若連接成功則函數返回TRUE,否則返回FALSE.
綜上所述,要在程序中使用派生控件,應該按下面兩步進行:
1、在對話框模板中放置好基類控件.
2、在對話框類中嵌入派生控件類的對象.
3、在OnInitDialog中調用SubclassDlgItem將派生類的控件對象與對話框中的基類控件相連接,則這個基類控件變成了派生控件.
例如,如果要在對話框中使用新設計的編輯框控件,應先在對話框模板中的合適位置放置一個普通的編輯框,然後,在OnInitDialog函數中按下面的方式調用SubclassDlgItem即可:
BOOL CMyDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_MyEdit.SubclassDlgItem(IDC_MYEDIT, this);
return TRUE;
}
另:CSDN論壇上一老兄的話說的更通俗點如下,
你先自己根據自己的需要派生一個基於某個控件類的新類,比如CMyEdit,然後用這個新類在對話框中定義一個實例,如CMyEdit myedit,你在RESOURCE編輯中在對話框中扔了一個EDIT
BOX,ID號爲ID_MYEDIT,則現在你就可以用
myedit.SubclassDlgItem(IDC_MYEDIT, this);
那麼這個你扔的EDIT BOX就具有你新派生的類的屬性和方法。