我们使用资源编辑器布局对话框。所以说我有一个名为IDC_RICH的RichEditCtrl。我想将它链接到自定义类CMyRichEditCtrl : CRichEditCtrl
的实例,而不会失去在资源编辑器中设置属性的能力。
什么是正确的方法?您当然可以通过创建DDX链接变量并将类型更改为CMyRichEditCtrl
来获得某些功能。但在某些情况下,我看到人们调用的代码如下:
m_Rich.SubclassDlgItem(IDC_RICH, this));
有什么区别?
编辑:我看到的一个问题是,当我覆盖Create(Ex)方法时,它们不会被调用。这有点像控件已经被我的对象链接到资源标识符时创建了,pehaps?
答案 0 :(得分:7)
DDX_Control()在引擎盖下执行SubclassWindow()。 SubclassDlgItem是SubclassWindow(GetDlgITem())的快捷方式。通常(这里的广泛概括)使用SubclassWindow的人是那些在DDX_Control存在之前(1995年之前左右?)并且从未真正进入MFC模式的人,或者从博客片段复制并粘贴他们的程序的人左右。
因此,为了清晰起见,请使用DDX_Control(),但如果使用SubclassDlgItem()在技术上没有区别。
答案 1 :(得分:4)
使用CreateWindow(Ex)创建与资源编辑器对话的窗口,第一个参数设置为.rc文件中指定的类名。然后,DDX_机制将此实例化窗口与DoDataExchange()中的对话框类成员相关联。
MFC是一个超过Win32的层,但是MFC开发并不能完全保护您免受Win32的攻击。它更像是一堆类和方法,它们消除了MFC的一些苦差事并提供了某种形式的面向对象。 MFC对象的方法不是那些正在进行实际工作的方法,并且大部分框架都在幕后工作,并且不会通知“上层”(即MFC对象),除非明确地将其连接起来。 Create()就是这样一种方法,只有当你想手动创建一个控件时,MFC才会在创建对象时调用它。 (这是一种概括,因为有时它是,但这超出了本讨论的范围)。
答案 2 :(得分: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));