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

Mr.*_*Boy 4 c++ winapi mfc

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

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

m_Rich.SubclassDlgItem(IDC_RICH, this));
Run Code Online (Sandbox Code Playgroud)

有什么不同?

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

Roe*_*oel 7

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

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


Roe*_*oel 4

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

MFC 是 Win32 之上的一层,但 MFC 开发并不能完全屏蔽 Win32。它更像是一堆类和方法,它们消除了 MFC 的一些苦差事,并提供某种形式的面向对象性。MFC 对象的方法并不是执行实际工作的方法,框架的大部分内容都在幕后执行操作,并且不会通知“上层”(即 MFC 对象),除非显式连接。Create() 就是这样一个方法,只有在您想要手动创建控件时才可用,创建对象时 MFC 不会调用它。(这是一个概括,因为有时确实如此,但这超出了本讨论的范围)。