我在哪里可以放我的 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 控件初始化代码的主要内容,如果未能解决你的问题,请参考以下文章