簡體   English   中英

創建 MFC 控件的子類的正確方法是什么?

[英]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() SubclassDlgItemSubclassWindow(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM