首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >创建MFC控件的子类的正确方法是什么?

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

Stack Overflow用户
提问于 2010-02-12 18:05:23
回答 3查看 6.4K关注 0票数 4

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

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

代码语言:javascript
复制
m_Rich.SubclassDlgItem(IDC_RICH, this));

有什么关系呢?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-12 19:00:12

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

MFC是Win32之上的一层,但是MFC开发并不能完全将您与Win32隔离开来。它更像是一堆类和方法,去掉了MFC的一些繁琐工作,并提供了某种形式的面向对象。MFC对象的方法并不是真正做实际工作的方法,框架的大部分工作都是在幕后进行的,除非显式地连接起来,否则不会通知“上层”(即MFC对象)。Create()就是这样一个方法,只有当你想手动创建一个控件时,它才会出现在那里,当创建对象时,它不会被MFC调用。(这是一种概括,因为有时确实如此,但这超出了本文的讨论范围)。

票数 4
EN

Stack Overflow用户

发布于 2010-02-12 18:25:17

DDX_Control()在引擎盖下执行SubclassWindow()SubclassDlgItemSubclassWindow(GetDlgITem())的快捷方式。通常(这里的泛指)使用SubclassWindow的人是在DDX_Control出现之前(1995年前?)养成这个习惯的人。而且从来没有真正进入过MFC模式,或者人们从左右的博客片段中复制和粘贴他们的程序。

因此,尽管使用SubclassDlgItem()在技术上不会有什么不同,但为了清晰起见,请使用DDX_Control()

票数 7
EN

Stack Overflow用户

发布于 2017-01-04 15:29:35

对于您放在资源编辑器对话框中的控件,使用DDX_Control:

代码语言:javascript
复制
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));

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2250970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档