MFC SDI中 如何为动态创建的按钮添加消息处理函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC SDI中 如何为动态创建的按钮添加消息处理函数相关的知识,希望对你有一定的参考价值。
参考技术A 你好!先手动做一个静态的按钮,然后参照着那个消息宏,添加你想要的消息映射就可以,消息映射的控件id,就是你动态创建的id。
希望对你有所帮助,望采纳。
MFC SDI 动态创建按钮
【中文标题】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中 如何为动态创建的按钮添加消息处理函数的主要内容,如果未能解决你的问题,请参考以下文章