我在哪里可以放我的 MFC 控件初始化代码

Posted

技术标签:

【中文标题】我在哪里可以放我的 MFC 控件初始化代码【英文标题】:Where can I put my MFC Control initialization code 【发布时间】:2012-07-13 15:09:49 【问题描述】:

我正在编写一个 MFC CEdit 派生控件,一旦控件的 m_hwnd 被填充,我需要添加初始化代码。

我可以覆盖哪个函数或处理哪个消息来实现这一点?

我尝试使用 OnCreate,但它似乎只适用于对话框

编辑: 我正在初始化的是编辑提示横幅

谢谢

【问题讨论】:

【参考方案1】:

按照 Mark Ransom 的提示,我终于找到了一个更好的函数来实现我的初始化。虽然重载 CWnd::SubclassWindow 是个好主意,但这个函数不是虚拟的,它需要从子类指针调用。从 CWnd* 调用 SubclassWindow 将不起作用。

我找到了函数CWnd::PreSubclassWindow。它是虚拟的,在 SubclassWindow 之前被调用。由于 m_hwnd 在那里有效,因此这是编写我需要的代码的好地方。 另外,这个函数是虚函数,由框架自动调用,所以不用担心指针类型好不好

【讨论】:

【参考方案2】:

如果控件位于对话框上,则 OnCreate 不起作用,因为控件是在将其子类化为窗口类之前创建的 - 这发生在对话框的 DoDataExchange 中。

您可以覆盖 CWnd::SubclassWindow 并在您自己的代码之前调用基本方法。

【讨论】:

SubclassWindow 不是虚拟的,你是说 PreSubclassWindow 吗? @Goldorak84,如果您直接调用对象上的方法而不是从基类指针调用方法,则它不必是虚拟的,就像 MFC 的情况一样。试试看。 我的对象是用 CWnd* 指针动态子类化的,它不起作用【参考方案3】:

根据您正在初始化的具体内容,您可以覆盖OnPaint(),或者您可以将您的初始化代码添加到包含该控件的Dialog类中的OnInitDialog()中。

【讨论】:

我需要初始化控件的提示横幅。 OnPaint 对我不利,因为初始化只需要调用一次。我的控件是自定义控件,会在200多个对话框中使用,我不会在每个对话框的OnInitDialog中放200倍的初始化代码

以上是关于我在哪里可以放我的 MFC 控件初始化代码的主要内容,如果未能解决你的问题,请参考以下文章

无法在 MFC Visual .NET 2008 中初始化滑块控件变量

在哪里初始化另一个对话框上的富编辑控件?

MFC 中关于Edit控件问题

在执行自定义验证之前,MFC初始化日期时间选择器控件

MFC 手动添加自会Listcontrl

mfc 窗口大小变化时,如何让窗口内部控件也一起随比例改变位置?