MFC SDI 动态创建按钮

Posted

技术标签:

【中文标题】MFC SDI 动态创建按钮【英文标题】:MFC SDI Create button dynamically 【发布时间】:2016-09-30 17:08:47 【问题描述】:

我正在尝试动态创建一个按钮。我已经阅读了一些其他资源并编写了以下代码:

BEGIN_MESSAGE_MAP(Cdynamic_button_sdiView, CView)
    // Standard printing commands
    ON_BN_CLICKED(MYBUTTONID, OnMyBN_Click)
END_MESSAGE_MAP()
void Cdynamic_button_sdiView::OnInitialUpdate()

    CView::OnInitialUpdate();
    m_Button.Create(_T("Rearrange"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(0, 0, 128, 32), this, MYBUTTONID); // here will create a button

当我启动 MFC 应用程序时,我可以成功地制作一个按钮。问题是当我尝试通过单击打开一个新文档时: 我收到一个错误,我的应用程序在 m_Button.Create(_T("Rearrange"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(0, 0, 128, 32), this, MYBUTTONID);

崩溃了

【问题讨论】:

断言对话框上有 3 个按钮。其中之一会提供大量有用的信息,包括您的代码未能满足的先决条件。 为什么不在 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\src\mfc\wincore.cpp 文件的第 673 行放置一个断点并遵循调用堆栈?该信息非常清楚您应该遵循的方向! 虽然我怀疑你的代码有什么问题,但我不会告诉你,因为我希望你调试它!若干年后,您会看到好处。 @sergiol:这行代码可能会执行很多很多次。在那里放置断点并不完全实用。也没有必要。调试断言将您带到您希望从断点获得的信息。 @IInspectable:sflee 可以通过使用条件断点或将其代码库减少到最小可行代码来限制次数。 【参考方案1】:

我用下面的代码解决了这个问题:

Cdynamic_button_sdiView::Cdynamic_button_sdiView()

    // TODO: add construction code here
    m_Button = NULL;


Cdynamic_button_sdiView::~Cdynamic_button_sdiView()

    if (m_Button != NULL)
        delete m_Button;

void Cdynamic_button_sdiView::OnInitialUpdate()

    CView::OnInitialUpdate();

    if (m_Button != NULL)
        delete m_Button;

    m_Button = new CButton;
    m_Button->Create(_T("Rearrange"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(0, 0, 128, 32), this, MYBUTTONID); // here will create a button

问题可能是我不应该在 OnInitialUpdate() 中重新创建窗口

【讨论】:

以上是关于MFC SDI 动态创建按钮的主要内容,如果未能解决你的问题,请参考以下文章

MFC SDI中 如何为动态创建的按钮添加消息处理函数

如何使用 CSpinButtonCtrl 类在 MFC 中动态创建微调按钮控件?

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

翻译一段代码 mfc的 这是有关动态创建控件的

怎么样在MFC中创建动态控件

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