mfc-消息映射-菜单和工具栏Menu and Toolbar
注意:menu和toolbar的某一项可以使用相同的ID,这样绑定的是同一个函数
首先是建立一个mfc,选择
注意使用next,而不是直接finish,在advanced features中advanced frame panes应该都取消勾选,现在这里是默认没有勾选,如果没有的话,就要手动取消一下
之后就生成了项目文件,以下分别是solution view和classes view的视图,可以发下有五个类,分别是CAboutDlg、CMainFrame、CmfctoolbarApp、CmfctoolbarDoc、CmfctoolbarView
因为我的工程名为mfc_toolbar,所以类名里面会出现mfctoolbar
在MFC(Microsoft Foundation Classes)应用程序中,通常会生成四个主要的类,它们各自有不同的作用:
1. **CMainFrame**:这是应用程序的主窗口类,通常用于管理应用程序的菜单栏、工具栏、状态栏以及其他用户界面元素。它也处理用户的输入和窗口消息。
2. **CYourApp(例如,CmfctoolbarApp)**:这是应用程序类,它是整个应用程序的控制中心。它负责初始化应用程序,创建主窗口,并启动消息循环。此外,它还包含应用程序级别的设置和行为。
3. **CYourDoc(例如,CmfctoolbarDoc)**:这是文档类,它代表应用程序的数据模型。在一个典型的文档/视图架构中,文档类包含应用程序的数据和与数据相关的操作。例如,在一个文本编辑器中,文档类可能会包含文本的内容以及保存和加载文本的方法。
4. **CYourView(例如,CmfctoolbarView)**:这是视图类,它负责渲染文档类的内容。视图类处理所有的用户输入,并根据文档类的状态更新自己的显示。在一个文本编辑器中,视图类可能会负责绘制文本以及处理键盘和鼠标事件。
这四个类共同构成了MFC应用程序的基础架构。当然,根据应用程序的复杂性和需求,你可能还需要添加更多的类和功能。
在MFC应用程序中,工具栏按钮的事件处理通常在 `CMainFrame` 类中进行。`CMainFrame` 类负责创建和管理工具栏,所以通常也在此类中处理工具栏按钮的事件。
以下是一个简单的示例,说明如何在 `CMainFrame` 类中添加一个处理函数:
1. 首先,你需要在 `CMainFrame` 类的消息映射表中添加一个条目,将按钮的命令ID映射到处理函数。消息映射表通常在 `CMainFrame` 类的 `.cpp` 文件中。例如:
```cpp
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//...
ON_COMMAND(ID_MY_TOOLBAR_BUTTON, &CMainFrame::OnMyToolbarButton)
//...
END_MESSAGE_MAP()
```
在这个例子中,`ID_MY_TOOLBAR_BUTTON` 是你的工具栏按钮的命令ID,`OnMyToolbarButton` 是处理函数。
2. 然后,你需要在 `CMainFrame` 类中添加 `OnMyToolbarButton` 函数的声明和定义。例如:
```cpp
// 在 CMainFrame 类的头文件中
class CMainFrame : public CFrameWnd
{
//...
public:
afx_msg void OnMyToolbarButton();
//...
};
// 在 CMainFrame 类的 .cpp 文件中
void CMainFrame::OnMyToolbarButton()
{
// 在这里处理按钮的点击事件
}
```
请注意,你需要使用 `afx_msg` 关键字来声明消息处理函数。这是MFC的一个特性,它告诉MFC这个函数是一个消息处理函数。
以上就是在 `CMainFrame` 类中处理工具栏按钮事件的基本步骤。如果你有多个工具栏按钮,你可以为每个按钮添加一个处理函数,或者使用一个处理函数来处理所有按钮的事件,具体取决于你的需求。
例子,比如在resource view中增加一个菜单项,其下有四个子菜单,ID分别为ID_MYMENU_1、ID_MYMENU_2、ID_MYMENU_3、ID_MYMENU_4
首先在Mainfrm.h中添加
然后在Mainfrm.cpp中添加
以及子菜单的事件函数实现
运行之后
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!