SUBCLASSDLGITEM函數

本文轉載: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就具有你新派生的類的屬性和方法。 


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