SubClass Dialog 上面的一個(gè)控件呀!
SubClass 某個(gè)控件后,其原來(lái)的 WindowProc 替換成你自己寫(xiě)的 CYourCWndClass 的 WindowProc,這樣你就可以處理這個(gè)控件的所有消息了;用 ClassWizard 維護自己的 CYourCWndClass 就可以了。
在MFC中除了SubClassDlgItem外還有SubclassWindow函數用來(lái)執行同樣的功能。在與某個(gè)控件ID關(guān)聯(lián)起來(lái)之后,所有該控件的消息將會(huì )有該類(lèi)來(lái)響應。通常使用過(guò)程如下
一、從希望Subclass的控件派生一個(gè)類(lèi)例如從CEdit->CMyEdit;
二、在CMyEdit中完成希望處理的消息,例如OnChar等;
三、在對話(huà)框類(lèi)中定義一個(gè)CMyEdit類(lèi)的成員變量m_myEdit;
四、在Dialog的OnInitDialog中加入m_myEdit(IDC_EDIT, this);
這樣當在IDC_EDIT上發(fā)生OnChar時(shí),將會(huì )調用CMyEdit中的OnChar
補充一下,用一個(gè)窗口過(guò)程替換另一個(gè)過(guò)程的行為叫SUBCLASSING,這是WINDOWS意義上的派生子類(lèi),與面向對象語(yǔ)言的派生子類(lèi)是完全不同的概念。SubClassDlgItem讓對話(huà)框內指定子控制自己的窗口過(guò)程替代默認窗口過(guò)程,以攔截消息。
在VC 中,DoDataExchange函數中的DDX_Control之類(lèi)的函數會(huì )調用SubClassDlgItem完成窗口子類(lèi)化,這樣控件自己就能處理消息了。
BOOL SubclassDlgItem( UINT nID, CWnd* pParent );
參數nID是控件的ID,pParent是指向父窗口的指針.若連接成功則函數返回TRUE,否則返回FALSE.
綜上所述,要在程序中使用派生控件,應該按下面兩步進(jìn)行:
1、在對話(huà)框模板中放置好基類(lèi)控件.
2、在對話(huà)框類(lèi)中嵌入派生控件類(lèi)的對象.
3、在OnInitDialog中調用SubclassDlgItem將派生類(lèi)的控件對象與對話(huà)框中的基類(lèi)控件相連接,則這個(gè)基類(lèi)控件變成了派生控件.
例如,如果要在對話(huà)框中使用新設計的編輯框控件,應先在對話(huà)框模板中的合適位置放置一個(gè)普通的編輯框,然后,在OnInitDialog函數中按下面的方式調用SubclassDlgItem即可:
BOOL CMyDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_MyEdit.SubclassDlgItem(IDC_MYEDIT, this);
return TRUE;
}
聯(lián)系客服