我们使用资源编辑器来布局对话框。假设我有一个名为IDC_RICH的RichEditCtrl。我想把它链接到一个自定义类CMyRichEditCtrl : CRichEditCtrl
的实例上,而不会失去在资源编辑器中设置它的属性的能力。
正确的方法是什么?您当然可以通过创建一个与DDX链接的变量并将类型更改为CMyRichEditCtrl
来获得一些功能。但在某些情况下,我看到人们像这样调用代码:
m_Rich.SubclassDlgItem(IDC_RICH, this));
有什么关系呢?
EDIT:我看到的一个问题是,当我覆盖Create(Ex)方法时,它们不会被调用。这有点像当我的对象链接到资源标识符时,控件已经创建好了,是不是?
发布于 2010-02-12 19:00:12
放在资源编辑器对话框中的窗口是使用CreateWindow(Ex)创建的,第一个参数设置为在.rc文件中指定的类名。然后,DDX_机制将这个实例化的窗口与DoDataExchange()中的对话框类成员关联起来。
MFC是Win32之上的一层,但是MFC开发并不能完全将您与Win32隔离开来。它更像是一堆类和方法,去掉了MFC的一些繁琐工作,并提供了某种形式的面向对象。MFC对象的方法并不是真正做实际工作的方法,框架的大部分工作都是在幕后进行的,除非显式地连接起来,否则不会通知“上层”(即MFC对象)。Create()就是这样一个方法,只有当你想手动创建一个控件时,它才会出现在那里,当创建对象时,它不会被MFC调用。(这是一种概括,因为有时确实如此,但这超出了本文的讨论范围)。
发布于 2010-02-12 18:25:17
DDX_Control()
在引擎盖下执行SubclassWindow()
。SubclassDlgItem
是SubclassWindow(GetDlgITem())
的快捷方式。通常(这里的泛指)使用SubclassWindow
的人是在DDX_Control
出现之前(1995年前?)养成这个习惯的人。而且从来没有真正进入过MFC模式,或者人们从左右的博客片段中复制和粘贴他们的程序。
因此,尽管使用SubclassDlgItem()
在技术上不会有什么不同,但为了清晰起见,请使用DDX_Control()
。
发布于 2017-01-04 15:29:35
对于您放在资源编辑器对话框中的控件,使用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));
https://stackoverflow.com/questions/2250970
复制相似问题