将功能附加到 MFC 按钮的问题

Posted

技术标签:

【中文标题】将功能附加到 MFC 按钮的问题【英文标题】:Issue attaching functionality to MFC Button 【发布时间】:2014-11-08 23:03:30 【问题描述】:

我刚刚开始使用 MFC 来制作 Windows 应用程序,希望有人可以帮助我使用我正在尝试编写的按钮来完成一些代码。

我要做的是构建一个具有按钮的应用程序,当按下该按钮时,将打开一个模式对话框,其中包含一些与我的问题无关的功能。我无法开始,因为我似乎无法捕捉到按下按钮并将代码附加到该事件。

添加到我的消息映射的事件:

ON_BN_CLICKED(1, OnBnClicked)

这是 OnBnClicked:

void CMainFrame::OnBnClicked()

  CPaintDC dc(this);
  dc.TextOutW(0, 100, _T("SUp dawg"));
  MessageBox(_T("Hey Dawg"));

这里是按钮创建:

BOOL bCreated = myButton.Create(_T("Hey Dawg"), WS_CHILD | WS_VISIBLE, 
                                 CRect(40, 40, 190, 90), this, 1);

我似乎无法弄清楚为什么当我点击它时它不会做任何事情。我感谢所有的帮助,它在网上没有特别详细的记录:

【问题讨论】:

BN_CLICKED 通知被发送到按钮的直接父窗口,即作为第四个参数传递给Create 的窗口。 CMainFrame 是按钮的父级吗?顺便说一句,用 MFC 开始 Windows 编程从来都不是成功的。您需要对 Windows API 有深入的了解才能有机会了解 MFC。以Learn to Program for Windows in C++开头。 显示更多代码。您在哪个函数中创建按钮? 你读过TN020吗? msdn.microsoft.com/en-us/library/t2zechd4.aspx — 我怀疑按钮的数字标识符 (1) 超出了有效范围!尽管它从 8 开始用于控件,但我建议您尝试 >=1024。 更多参考:blogs.msdn.microsoft.com/oldnewthing/20041214-00/?p=37013 — 您的 1 与“确定”按钮的标识符 IDOK 冲突。旁注:OK 和 Cancel 按钮的处理方式不应相同,而应分别处理 OnOK()OnCancel() 方法。 【参考方案1】:

警告:我不会尝试直接回答您的问题,因为如果不看到(相当多)您所做的更多事情,例如您将创建按钮的代码放在哪里,几乎无法回答。即使/如果我确实直接回答了这个问题,我怀疑结果是否特别有用。因此,我将描述我将如何处理相同的基本情况。

我要提出的基本观点可以追溯到单一责任原则。一个窗口通常应该由一个类表示,并且该类应该有一个单一的职责。如果该窗口充当控件容器,那么该类的唯一职责应该是充当控件容器。

大多数时候,包含按钮的类/窗口除了按住按钮(或其他控件)之外(大部分)不应该做任何事情。换句话说,按钮大多属于对话框和工具栏之类的东西。如果您需要一个承载按钮的显示器,您通常希望该视图是 CFormView。在这种情况下,表单是从对话框模板构建的。您可以使用对话框编辑器在该对话框模板上放置一个按钮,就像使用任何其他对话框一样。将功能附加到它的方式与附加到任何对话框中的任何按钮的方式相同(按住 shift 单击或右键单击并选择“添加事件处理程序...”)。

是的,可以通过其他方式做事——Visual Studio 和 MFC 甚至都不会尝试做很多事情来限制您可以做的事情。但这并不意味着您应该忽略基本设计——单一责任原则仍然适用,而且仍然很重要。在您设计代码时,由您来强制执行它——其中一个含义是您不只是在代码中的随机位置创建按钮。

【讨论】:

以上是关于将功能附加到 MFC 按钮的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何重用 socket.io 发射功能?试图将套接字发射功能附加到 SwiftUI 按钮(操作)?

MFC-单击按钮打开对话框

将位图添加到 MFC 中的按钮

将单选按钮添加到现有组 - MFC

保存按钮未附加到右侧信息窗口,谷歌地图

如何在 MFC 的按钮中添加图像和文本?