在 MFC 应用程序中动态创建控件

Posted

技术标签:

【中文标题】在 MFC 应用程序中动态创建控件【英文标题】:Create a control dynamically in an MFC application 【发布时间】:2015-06-11 10:02:45 【问题描述】:

根据Microsoft的这个链接,应该可以定义一个CButton并指定它的父窗口(CDialog),而不需要CButton作为Dialog的成员,但我做不到。

因此,如果 myButton 是 CDialog 派生 (myCDialog) 类的成员,则以下代码有效:

BOOL myCDialog::OnInitDialog() 
  CDialog::OnInitDialog();
myButton.Create(_T("My button"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10, 20, 100, 50), this, 1000); 
...

但是当我谈到动态创建时,我希望能够动态创建任意数量的按钮(我不能将它们定义为类成员,因为我不知道有多少!)

我已经在另一个类中尝试了以下代码,其中一个指向myCDialog的指针作为父窗口,类似于链接中显示的代码,但它失败了:

CButton myButton;
myButton.Create(_T("My button"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10, 20, 100, 50), pmyCDialog, 1000);

那么,如何创建动态控件而不将它们定义为 CDialog 类的成员?

【问题讨论】:

msdn.microsoft.com/en-us/library/6zxw3b4a.aspx怎么样 “失败”是什么意思?你能说得更具体点吗? @JerryJeremiah:在那个例子中,仍然使用了一个成员。 m_edit 被定义为 CDialog 派生类的成员 您需要确保指向父窗口的指针不为空。当您尝试创建控件时,您是否单步执行了代码并观察了该指针的值? 当所有其他方法都失败时,单步执行代码(包括 MFC)并确保指针、CRect 等都有效。如果提供,请检查返回代码。 【参考方案1】:

“(我不能定义他们为类成员,因为我不知道有多少!)”

您可以将 CButton 或 CButton* 的数组或向量作为类成员。调用 Create 时,为它们每个分配一个不同的 ID。

【讨论】:

嗯,实际上,这不是一个完整的答案。我无法使其工作的原因是参考丢失了。它必须在整个程序中都有效。我想出的解决方案是对按钮使用动态分配。 @ScottMcP-MVP:请相应地更新您的答案,以便其他用户可以从中受益。

以上是关于在 MFC 应用程序中动态创建控件的主要内容,如果未能解决你的问题,请参考以下文章

VC++(MFC)中动态创建和管理按钮控件,怎么做?

具有动态创建控件的 MFC 应用程序突然停止响应

[ MFC ] 对话框动态控件的创建 在Picture Control控件上显示图片 [大三TJB_708]

MFC 中关于Edit控件问题

MFC如何动态添加控件

动态创建MFC控件时如何重新创建资源编辑器使用的样式?