我应该把MFC控件初始化代码放在哪里?

7
我正在编写一个基于MFC CEdit的控件,当控件的m_hwnd被填充时,我需要添加初始化代码。
哪个函数可以被覆盖或哪个消息可以被处理以实现这一点?
我尝试使用OnCreate,但它似乎只适用于对话框。
编辑: 我要初始化的是编辑的提示横幅。
谢谢。
3个回答

7

在遵循Mark Ransom的提示后,我终于找到了一个更好的函数来实现我的初始化。虽然重载CWnd::SubclassWindow是个好主意,但这个函数不是虚函数,需要从子类指针中进行调用。从CWnd*调用SubclassWindow是行不通的。

我找到了函数CWnd::PreSubclassWindow。它是虚函数,在SubclassWindow之前被调用。由于m_hwnd在此处有效,所以这是编写所需代码的好地方。 此外,该函数是虚函数,并且由框架自动调用,因此我不必担心指针类型是否正确。


5

如果控件在对话框上,OnCreate无法正常工作,因为控件在可以子类化为窗口类之前就已经被创建 - 这是在对话框的DoDataExchange中发生的。

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


3
SubclassWindow 不是虚函数,你是不是想说 PreSubclassWindow? - Goldorak84
1
@Goldorak84,如果您直接在对象上调用方法而不是从基类指针调用,则不必虚拟化,这将是MFC的情况。尝试一下,看看效果如何。 - Mark Ransom
我的对象使用CWnd*指针进行动态子类化,但它不起作用。 - Goldorak84

0

根据您要初始化的内容,您可以覆盖OnPaint(),或者将您的初始化代码添加到包含该控件的对话框类中的OnInitDialog()中。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接