MFC的使用总结之四——添加menu菜单

  • 写在前面
    • 添加menu
    • 添加响应事件
    • 修改代码
    • 运行程序

写在前面

MFC是一种用c++设计交互界面的的开发工具,在二三十年前比较流行,但目前比较少用了。所以现在使用MFC进行开发,相关资料的查找也比较困难。最近做了一个与MFC有关的项目,其中用到的相关知识总结于此。在使用工具时,最好的资料其实就是那个库本身,查看库内的代码总会有意想不到的收获。本人用的是VS2017专业版里面的MFC。本章时在总结三的基础上修改的。文末附代码地址

添加menu

在新建项目之后,选择资源视图,右击test.rc添加资源选中Menu点击新建。

此时便能得到MENU资源页,在资源页里面便可以添加各种想要的功能。

但还有特别重要的一点是要在初始化程序BOOL CtestDlg::OnInitDialog()中添加menu的定义,运行时就会有menu显示出来

     CMenu menu;menu.LoadMenu(IDR_MENU1);  //IDR_MENU1为菜单栏ID号SetMenu(&menu);

添加响应事件

鼠标右键选中刚才写上的“显示曲线”。右击点击添加事件处理程序,会弹出一个事件处理向导

将类列表选为CtestDlg,函数处理程序名称可以随便按喜好更不更改都行。之后点击添加编辑,会自动在程序里面添加代码

void CtestDlg::On_ShowCurve()
{// TODO: 在此添加命令处理程序代码
}

当然,相关地方也会有所更改

BEGIN_MESSAGE_MAP(CtestDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_TIMER()ON_COMMAND(ID_32771, &CtestDlg::On_ShowCurve)//事件响应绑定函数
END_MESSAGE_MAP()

h文件中添加的定义

public:afx_msg void On_ShowCurve();

修改代码

之后,将之前总结三中写的启动定时器代码剪到事件响应函数中

void CtestDlg::On_ShowCurve()
{// TODO: 在此添加命令处理程序代码SetTimer(0, 300, NULL);
}

最后得到的testDlg.h代码如下


// testDlg.h: 头文件
//
#include "ChartCtrl/ChartCtrl.h"
#pragma once// CtestDlg 对话框
class CtestDlg : public CDialogEx
{
// 构造
public:CtestDlg(CWnd* pParent = nullptr);  // 标准构造函数CChartCtrl m_Show_Curve;
// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_TEST_DIALOG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnTimer(UINT nIDEvent);afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:afx_msg void On_ShowCurve();
};

得到的testDlg.cpp代码如下


// testDlg.cpp: 实现文件
//#include "stdafx.h"
#include "test.h"
#include "testDlg.h"
#include "afxdialogex.h"
#include "ChartCtrl\ChartLineSerie.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif#define DATA_SHOW_LENGHT  2000    //总共显示的点个数
#define DATA_UPDATE_LENGHT  10    //每次更新的点个数
double xBuff[DATA_SHOW_LENGHT] = { 0 };
double yBuff[DATA_SHOW_LENGHT] = { 0 };
double yBuff2[DATA_SHOW_LENGHT] = { 0 };
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// CtestDlg 对话框CtestDlg::CtestDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_TEST_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CtestDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_CUSTOM1, m_Show_Curve);
}BEGIN_MESSAGE_MAP(CtestDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_WM_TIMER()ON_COMMAND(ID_32771, &CtestDlg::On_ShowCurve)
END_MESSAGE_MAP()// CtestDlg 消息处理程序BOOL CtestDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);            // 设置大图标SetIcon(m_hIcon, FALSE);        // 设置小图标CMenu menu;menu.LoadMenu(IDR_MENU1);  //IDR_MENU1为菜单栏ID号SetMenu(&menu);m_Show_Curve.GetTitle()->AddString(_T("我就是噪声"));CChartAxis *pAxis = NULL;pAxis = m_Show_Curve.CreateStandardAxis(CChartCtrl::BottomAxis);pAxis->SetAutomatic(true);pAxis = m_Show_Curve.CreateStandardAxis(CChartCtrl::LeftAxis);pAxis->SetMinMax(0, 360);for (int i = 0; i < DATA_SHOW_LENGHT; i++) {xBuff[i] = i;yBuff[i] = rand() % 360;yBuff2[i] = rand() % 360;}// TODO: 在此添加额外的初始化代码return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CtestDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CtestDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CtestDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CtestDlg::OnTimer(UINT nIDEvent) {static int offset = 0;for (int i = 0; i < DATA_SHOW_LENGHT - DATA_UPDATE_LENGHT; i++){xBuff[i] = xBuff[i] + 10;yBuff[i] = rand() % 360;yBuff2[i] = rand() % 360;}int index = DATA_SHOW_LENGHT - DATA_UPDATE_LENGHT;for (int i = 0; i < DATA_UPDATE_LENGHT; i++){xBuff[index + i] = xBuff[index + i] + 10;yBuff[index + i] = rand() % 360; yBuff2[index + i] = rand() % 360;}//DataShow(xBuff, yBuff, DATA_SHOW_LENGHT);m_Show_Curve.EnableRefresh(false);CChartLineSerie *pLineSerie;m_Show_Curve.RemoveAllSeries();pLineSerie = m_Show_Curve.CreateLineSerie();pLineSerie->SetColor(RGB(0, 255, 0));pLineSerie->SetSeriesOrdering(poNoOrdering);//设置为无序pLineSerie->AddPoints(xBuff, yBuff, DATA_SHOW_LENGHT);CChartLineSerie *pLineSerie2;pLineSerie2 = m_Show_Curve.CreateLineSerie();pLineSerie2->SetColor(RGB(0, 0, 255));pLineSerie2->AddPoints(xBuff, yBuff2, DATA_SHOW_LENGHT);UpdateWindow();m_Show_Curve.EnableRefresh(true);offset++;if (offset > 10000) {offset = 0;}
}void CtestDlg::On_ShowCurve()
{// TODO: 在此添加命令处理程序代码SetTimer(0, 300, NULL);
}

运行程序

直接运行时只会显示初始的曲线坐标系,这是由于定时器还没有启动,绘制曲线的代码还没有运行。

但我们可以发现左上角部分有个小小的功能两个字,者就是刚才添加的菜单,点击功能会出现显示曲线,再点击显示曲线,曲线就显示出来了。

代码下载链接.

关于MFC的使用总结之四——添加menu菜单相关推荐

  1. android中menu菜单扩增_【已解决】Android添加Menu菜单

    [背景] 想要在Android中添加Menu菜单. 目前已经有了menu的xml定义了: /res/menu/activity_main.xml android:id="@+id/menu_ ...

  2. MFC关于Menu菜单事件不响应问题

    首先说一下添加菜单事件: 1.资源视图添加Menu 菜单,添加菜单按钮,更改按钮ID ==>ID_LOGOUTDEV: 2.绑定消息响应函数 ON_COMMAND(ID_LOGOUTDEV, & ...

  3. android+打开菜单,Android制作微信app顶部menu菜单(ActionBar)

    使用微信APP的小伙伴对于微信的ActionBar一定有印象,今天就带领大家一起实现以下这个效果. 第一步打开我们的开发工具,这里我使用的是Eclipse+ADT插件,然后创建我们的工程,这里选择An ...

  4. Android Menu菜单

    一.Android提供了一些简单的方法来为应用添加Menu菜单. 提供了三种类型应用菜单: 1.Options Menu:通过Menu按钮调用菜单 2.Context Menu:通过长按屏幕,调用注册 ...

  5. 【MFC】在工具栏中添加编辑框

    00. 目录 文章目录 00. 目录 01. 案例概述 02. 开发环境 03. 关键技术 04. 程序设计 05. 秘笈心法 06. 源码下载 07. 附录 01. 案例概述 在工具栏中添加编辑框可 ...

  6. android标题栏添加按钮_几行代码实现Android通用标题栏(轻松向左右两侧添加Menu)...

    秦子帅明确目标,每天进步一点点..... 作者 |  丶E 地址 |  https://www.jianshu.com/p/8c15fc4114a7 前言 标题栏是app开发经常用到的东西,几乎每个页 ...

  7. mfc中在vector里添加控件类型的数据时出现C2248错误

    @mfc中在vector里添加控件类型的数据时出现C2248错误 这是我在.h文件中定义的2个容器 public:vector<CComboBox*> cbx;vector <CSt ...

  8. Visual Studio开发MFC项目OCX控件添加使用控件方法

    1.在Windows系统中注册OCX控件 在OCX控件目录,右键新建一个文本文档,将文件名和扩展名改为"双击注册.bat",添加如下注册脚本: cd /d %~dp0 RegSvr ...

  9. 在(CListView)列表视图中添加右键菜单的方法

    使用弹出式菜单(PopMenu) 弹 出式菜单(PopMenu)大家都熟悉,在WIN98的桌面上单击鼠标右键弹出的菜单就是弹出式菜单.通常情况下,弹出式菜单在鼠标右键单击时弹出,当 然,也可以根据需要 ...

  10. Android 控件 之 Menu 菜单

    http://www.cnblogs.com/Mrs-cc/archive/2012/07/21/2603042.html 1.OptionsMenu (选项菜单)用法总结 使用方法: 方法一:添加菜 ...

最新文章

  1. 伦敦大学 机器人科学(研究型硕士) 项目介绍!干货满满!
  2. Lachesis Shield 设计上的抉择
  3. 产品经理没有做过成功的产品,该何去何从?
  4. CUDA C编程权威指南 第七章 调整指令级原语
  5. Eclipse设置智能提示
  6. Java、JSP公文流转系统
  7. 中国企业服务总线(ESB)市场趋势报告、技术动态创新及市场预测
  8. handsome对应php文件,基于handsome主题的一些美化总结
  9. excel的简单操作
  10. shiro-反序列化漏洞
  11. 华为连接wifi显示wifi未连接服务器,华为手机连上WiFi后显示不可上网?其实很简单,用这个解决就好了...
  12. DBA基础(一)相关概念
  13. 阿里云服务器如何使用并且后续能干嘛
  14. 编译原理——C++版桌面计算器
  15. EC6108V9/V9C-Hi3798MV100-当贝纯净桌面-卡刷固件包
  16. 语音识别(Speech recognition)的核心内容是将语音转换成文字
  17. window print 设置字体大小
  18. win10下Anaconda中tensorflow2.4.1的下载
  19. 华为od机考真题-数组拼接
  20. 开源中文古风排版样式,简约美观,超级好用!

热门文章

  1. sdcc man阅读笔记(四)——存储类型关键字
  2. 羽毛球 - 正手高球(杀球、吊球、高远球)
  3. SAS更新SID问题
  4. 论文阅读:A Survey on Deep Hashing Methods 综述:深度哈希方法
  5. 如何在2015年后的MacBook Air上安装双系统
  6. php ipa 版本定制,自建IOS企业包ipa包 下载服务
  7. 爬取实习僧工作岗位信息
  8. java中stringBuilder的用法
  9. if函数的语法c语言并列,逻辑函数IF的各种使用方法
  10. 【2022年度总结2023新年Flag】--2022:高考失利,我奋力奔跑的大一上;2023,朝着成为更优秀的自己迈进ing