创建MFC控件的子类的正确方法是什么?

问题描述 投票:4回答:3

我们使用资源编辑器布局对话框。所以说我有一个名为IDC_RICH的RichEditCtrl。我想将它链接到自定义类CMyRichEditCtrl : CRichEditCtrl的实例,而不会失去在资源编辑器中设置属性的能力。

什么是正确的方法?您当然可以通过创建DDX链接变量并将类型更改为CMyRichEditCtrl来获得某些功能。但在某些情况下,我看到人们调用代码如:

m_Rich.SubclassDlgItem(IDC_RICH, this));

有什么不同?

编辑:我看到的一个问题是,当我覆盖Create(Ex)方法时,它们不会被调用。有点像控件已经被我的对象链接到资源标识符时创建了,pehaps?

c++ mfc winapi
3个回答
4
投票

使用资源编辑器放置对话框的窗口是使用CreateWindow(Ex)创建的,第一个参数设置为.rc文件中指定的类名。然后,DDX_机制将此实例化窗口与DoDataExchange()中的对话框类成员相关联。

MFC是一个超过Win32的层,但MFC开发并不能完全保护您免受Win32的攻击。它更像是一堆类和方法,它们消除了MFC的一些苦差事并提供了某种形式的面向对象。 MFC对象的方法不是那些正在进行实际工作的方法,并且大部分框架都在幕后工作,并且不会通知“上层”(即MFC对象),除非明确地将其连接起来。 Create()就是这样一种方法,只有当你想手动创建一个控件时,MFC才会在创建对象时调用它。 (这是一种概括,因为有时它是,但这超出了本讨论的范围)。


7
投票

DDX_Control()在引擎盖下执行SubclassWindow()。 SubclassDlgItem是SubclassWindow(GetDlgITem())的快捷方式。通常(这里的广泛概括)使用SubclassWindow的人是那些在DDX_Control存在之前(1995年之前左右?)并且从未真正进入MFC模式的人,或者从博客片段复制并粘贴他们的程序的人左和右。

因此,为了清楚起见使用DDX_Control(),尽管如果使用SubclassDlgItem()在技术上没有区别。


1
投票

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));

© www.soinside.com 2019 - 2024. All rights reserved.