世界杯举办地_世界杯预选赛巴西 - emsxbc.com

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

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_TIME

enum { IDD = IDD_TEST_DIALOG };

#endif

protected:

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_TIME

enum { IDD = IDD_ABOUTBOX };

#endif

protected:

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(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(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);

}

运行程序

直接运行时只会显示初始的曲线坐标系,这是由于定时器还没有启动,绘制曲线的代码还没有运行。 但我们可以发现左上角部分有个小小的功能两个字,者就是刚才添加的菜单,点击功能会出现显示曲线,再点击显示曲线,曲线就显示出来了。 代码下载链接.