[英]What's the correct way to create a subclass of a MFC control?
我們使用資源編輯器布局對話框。 所以說我有一個名為 IDC_RICH 的 RichEditCtrl。 我想將它鏈接到自定義類CMyRichEditCtrl : CRichEditCtrl
的實例CMyRichEditCtrl : CRichEditCtrl
,而不會失去在資源編輯器中設置屬性的能力。
什么是正確的方法? 您當然可以通過創建 DDX 鏈接變量並將類型更改為CMyRichEditCtrl
來獲得一些功能。 但在某些情況下,我看到人們調用代碼如下:
m_Rich.SubclassDlgItem(IDC_RICH, this));
有什么不同?
編輯:我看到的一個問題是,當我覆蓋 Create(Ex) 方法時,它們不會被調用。 這有點像在我的對象鏈接到資源標識符時已經創建了控件,pehaps?
DDX_Control()
在DDX_Control()
執行SubclassWindow()
。 SubclassDlgItem
是SubclassWindow(GetDlgITem())
的快捷方式。 通常(這里是廣義的概括)使用SubclassWindow
的人是在DDX_Control
存在之前(1995 年左右?)之前養成這種習慣並且從未真正進入 MFC 模式的人,或者是從博客片段中復制和粘貼他們的程序的人左和右。
因此,為了清楚起見,請使用DDX_Control()
,盡管如果使用SubclassDlgItem()
技術上講不會有什么不同。
使用資源編輯器放在對話框中的窗口是使用 CreateWindow(Ex) 創建的,第一個參數設置為 .rc 文件中指定的類名。 然后 DDX_ 機制將這個實例化的窗口與 DoDataExchange() 中的對話框類成員相關聯。
MFC 是 Win32 之上的一層,但 MFC 開發並不能完全屏蔽 Win32。 它更像是一堆類和方法,它們去掉了 MFC 的一些苦差事,並提供了某種形式的面向對象。 MFC 對象的方法並不是真正在做工作的方法,並且框架的大部分內容都在幕后工作,並且不會通知“上層”(即 MFC 對象),除非它被明確地連接起來。 Create() 是這樣一種方法,只有當您想手動創建控件時才存在,創建對象時 MFC 不會調用它。 (這是一個概括,因為有時確實如此,但這超出了本討論的范圍)。
1> 對於您在資源編輯器中放置在對話框中的控件,使用 DDX_Control:
class CMyDlg : public CDialogEx
{
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
public:
CRichEditCtrl m_Rich;
};
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_RICHEDIT1, m_Rich);
}
2>對於手動創建的控件:
CRichEditCtrl m_Rich; m_Rich.Create(...); m_Rich.SubclassDlgItem(IDC_RICH, this));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.