我的编程空间,编程开发者的网络收藏夹
学习永远不晚

VS2019实现C++的第一个MFC程序

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

VS2019实现C++的第一个MFC程序

一、创建项目


然后点下一步,配置项目,这里我命名的是myfisrtmfc

点击创建按钮,然后弹出下面的对话框。

对上面的MFC应用程序进行配置,如下:

点击完成,生成如下界面。

第一次编译生成的默认项目,之后得到下面的界面

点击VS2019的界面,“解决方案资源管理器”

到这里,项目建成,并且编译通过。

二、添加自定义的功能(以比较通用的画图为例)

点击资源视图,这里的控件将是后面需要操作的。

双击IDR_MAINFRAME,可以在这里面添加画图功能。

也可以在Ribbon里面添加画图功能

然后点击工具箱->RIbbon编辑器:

双击Ribbon下的面板控件

修改名称为形状,并添加一个按钮控件,修改名字为矩形

修改矩形的杂项,ID改为ID_RECTANGLE

右键矩形按键,选择添加事件处理程序

得到如下弹窗

配置这个弹窗如下:

点击确定后,我们得到下面的代码

以下内容参考https://www.jb51.net/article/214347.htm

第一次使用c++,mfc很多函数都不熟悉,就直接套用了。

这里我们新建一个graph.cpp源文件


#include "framework.h"
#include "pch.h"
 
IMPLEMENT_SERIAL(graph, CObject, 1)
graph::graph(int l, int u, int r, int d)
{
    left = l;
    up = u;
    right = r;
    down = d;
    state = 0;
    fcolor = 0xffffff;
}
 
void graph::Offset(int cx, int cy)
{
    left += cx;
    right += cx;
    up += cy;
    down += cy;
}
 
void graph::onPress(int x, int y)
{
    sx = x; sy = y;
    state = 0;
    //选中图形
    if (left < x && x < right &&
        up < y && y < down) {
        state = 1;
        return;
    }
    if (left - f_width / 2 < x && x < left + f_width / 2)    state |= 2;    //    选中左边
    if (up - f_width / 2 < y && y < up + f_width / 2)    state |= 4;//选中上边
    if (right - f_width / 2 < x && x < right + f_width / 2)    state |= 8;//选中右边
    if (down - f_width / 2 < y && y < down + f_width / 2)    state |= 16;    //    选中下边
 
}
 
void graph::onRelease(int x, int y)
{
    state = 0;
}
 
 
void graph::SetBorderColor(int color)
{
    fcolor = color;
}
 
void graph::SetFillColor(int color)
{
    bcolor = color;
}
int graph::onMove(int x, int y)
{
    int cx, cy;
    cx = x - sx; cy = y - sy;
    sx = x; sy = y;
 
    if (state == 1) {
        Offset(cx, cy);        //  位移量cx,cy
    }
 
    if (2 == (state & 2)) {
        left = x;
 
    }
 
    if (4 == (state & 4)) {
        up = y;
 
    }
 
    if (8 == (state & 8)) {
        right = x;
 
    }
 
    if (16 == (state & 16)) {
        down = y;
 
    }
    return state == 0 ? 0 : 1;
}
void graph::Serialize(CArchive& ar)
{
    CObject::Serialize(ar);
    if (ar.IsLoading()) {
        ar >> left >> right >> up >> down >> f_width >> fcolor >> bcolor;
    }
    else
    {
        ar << left << right << up << down << f_width << fcolor << bcolor;
    }
}
graph::~graph()
{
}
void graph::onDraw(CDC* pDC) {
    CBrush b(fcolor);
    pDC->SelectObject(&b);
    CRect r(left, up, right, down);
    pDC->FillRect(&r, &b);
    CPen p(PS_SOLID, 1, bcolor);
    pDC->SelectObject(&p);
    pDC->Rectangle(left, up, right, down);
    pDC->MoveTo(left, up);
    pDC->DrawText(_T("空图形"), -1, new CRect(left, up, right, down), DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}

在项目中添加头文件graphz.h

在graph.h中添加下面的代码:


#pragma once
 
class graph :
	public CObject
{
protected:
	//边框
	DECLARE_SERIAL(graph)
	int left, up, right, down;
	//选中状态
	unsigned int state;
	int sx, sy;
	int  f_width = 5;
	int fcolor = 0xffffff, bcolor = 0;
 
public:
	graph() :graph(50, 50, 100, 100) {
 
	}
	graph(int l, int u, int r, int d);
	void Offset(int cx, int cy);
	void  onPress(int x, int y);	//  鼠标按下
	int  onMove(int cx, int cy);	//  鼠标移动
	void  onRelease(int x, int y);	//  鼠标释放
	virtual void onDraw(CDC* pDC);
	virtual int getGraphID() { return 0; }
	virtual void Serialize(CArchive& ar);
	void SetFillColor(int color);
	void SetBorderColor(int color);
	~graph();
 
};

在framework.h中添加graph.h


#include "graph.h"

我们要画矩形,这里添加矩形的相关代码,

跟上面的步骤一样,见一个rectangle.h和rectangle.cpp

rectangle.cpp


#include "framework.h"
#include "pch.h"
rectangle::rectangle(int l, int u, int r, int d) :graph(l, u, r, d)
{
    state = 0;
    fcolor = 0xffffff;
 
}
 
void rectangle::onDraw(CDC* pDC)
{
    CBrush b(fcolor);
    pDC->SelectObject(&b);
    CRect r(left, up, right, down);
    pDC->FillRect(&r, &b);
    CPen p(PS_SOLID, 1, bcolor);
    pDC->SelectObject(&p);
    pDC->Rectangle(left, up, right, down);
    pDC->MoveTo(left, up);
}
 
rectangle::~rectangle()
{
}

rectangle.h


#include "graph.h"
class rectangle :
    public graph
{
public:
    //DECLARE_SERIAL(graph)
    //void Serialize(CArchive& ar);
    rectangle() :graph(50, 50, 100, 100) {}
    rectangle(int l, int u, int r, int d);
    void onDraw(CDC* pDC);
    int getGraphID() { return 2; }
    ~rectangle();
};

然后myfirstmfcDoc.h中添加list


std::list<graph*> graphList;

因为调用了list,所以在framework.h中添加


#include <list>


这里要调用用OnRectangle()函数,之前生成的函数,我们现在添加下面的代码:


    CmyfisrtmfcDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    pDoc->graphList.push_front(new rectangle(50, 50, 100, 100));
 
    Invalidate();

修改myfirstmfcView.cpp中的OnDraw函数为如下:



void CmyfisrtmfcView::OnDraw(CDC* pDC)
{
    CmyfisrtmfcDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
 
    // TODO: 在此处为本机数据添加绘制代码
    std::list<graph*>::iterator v;
    for (v = pDoc->graphList.begin(); v != pDoc->graphList.end(); ++v) {
        (*v)->onDraw(pDC);
    }
}

接下来通过类向导添加消息

添加鼠标左键按下消息,左键松开消息,鼠标移动消息

在生成的按键按下函数中


void CmyfisrtmfcView::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CmyfisrtmfcDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
 
    // TODO: 在此处为本机数据添加绘制代码
    std::list<graph*>::iterator v;
    for (v = pDoc->graphList.begin(); v != pDoc->graphList.end(); ++v) {
        (*v)->onPress(point.x, point.y);
    }
    Invalidate();
    //CView::OnLButtonDown(nFlags, point);
}

跟上面一样的方式

自从生成的代码在myfirstmfcView中如下:


void CmyfisrtmfcView::OnLButtonUp(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CmyfisrtmfcDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
 
    // TODO: 在此处为本机数据添加绘制代码
    std::list<graph*>::iterator v;
    for (v = pDoc->graphList.begin(); v != pDoc->graphList.end(); ++v) {
        (*v)->onRelease(point.x, point.y);
    }
 
    //CView::OnLButtonUp(nFlags, point);
}
 
 
void CmyfisrtmfcView::OnMouseMove(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CmyfisrtmfcDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
 
    // TODO: 在此处为本机数据添加绘制代码
    std::list<graph*>::iterator v;
    for (v = pDoc->graphList.begin(); v != pDoc->graphList.end(); ++v) {
        (*v)->onMove(point.x, point.y);
    }
    Invalidate();
//    CView::OnMouseMove(nFlags, point);
}

到这里就完成了全部工作,可以进行编译了。

生成下面的图形,矩形可以移动,可拉伸

点击项目中的属性,在配置属性中选择高级,MFC使用 静态库,在编译一次,生成.exe可以其他电脑上不依赖动态库也能打开了。

总结:

1.学会了如何添加项目工程

2.学会了添加用户自己的源文件和头文件,并且与项目关联

3.学会了类向导

4.学会了按键控件的生成,和通过消息ID跟函数关联起来

参考文献:

(1)vs2019 MFC实现office界面的画图小项目(超超级详细)

(2)在vs2019中使用MFC快速构建简单windows窗口程序

到此这篇关于VS2019实现C++的第一个MFC程序的文章就介绍到这了,更多相关C++第一个MFC程序内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

VS2019实现C++的第一个MFC程序

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

VS2019如何实现C++的MFC程序

这篇文章主要介绍了VS2019如何实现C++的MFC程序,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、创建项目然后点下一步,配置项目,这里我命名的是myfisrtmfc点
2023-06-15

怎么在vs2019中使用MFC构建一个windows窗口程序

怎么在vs2019中使用MFC构建一个windows窗口程序?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。微软基础类库(英语: Classes,简称MFC)是微软公司提供的一个
2023-06-15

VS2019开发Linux C++程序的实现过程

这篇文章主要讲解了“VS2019开发Linux C++程序的实现过程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VS2019开发Linux C++程序的实现过程”吧!一级目录第一步, 先将
2023-06-20

VS2019开发Linux C++程序的实现步骤

一级目录 第一步, 先将自己的Linux 系统设为静态IP,具体操作如下: 1.修改/etc/network/interfaces 地址配置文件,如下所示:(注 查看ip命令: ip addr 查看网关命令: ip route show )
2022-06-03

【第39天】实现一个冒泡排序

本文已收录于专栏 ?《Java入门一百例》? 学习指引 序、专栏前言 一、冒泡排序 一、【例题1】 1、题目描述 2、解题思路 3、模板代码 三、推荐专栏 序、专栏
2023-08-17

如何创建并运行第一个C#程序

C#是一种由微软公司开发的面向对象的编程语言,广泛应用于Windows桌面应用程序、Web应用程序、游戏开发、移动应用程序等领域。C#提供了丰富的类和命名空间,可以帮助开发人员快速构建高质量的应用程序。要创建并运行第一个 C#序,您需要完成
2023-10-22

我的第一个java应用程序

昏天黑地地写了几天代码,终于完成了我的第一个java应用程序 虽然挺弱的一个东西,不过也是费了我的牛劲了 具体他是个什么东西呢..其实就是你输入日期然后查星座..这个不难,不过主要还是得自己编个界面,把界面和功能连起来.跟管理信息系统的
2023-06-03

C语言如何实现一个扫雷程序

本篇内容介绍了“C语言如何实现一个扫雷程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!整个游戏设计中主要的函数为:1、初始化地雷棋盘和显示
2023-06-17

第一个微信小程序的诞生

🐧主页详情:Choice~的个人主页 📢作者简介:🏅物联网领域创作者🏅 and 🏅阿里专家博主🏅 and 🏅华为云享专家&
2023-08-17

在C#程序编译另一个程序的实现方法是怎样的

本篇文章为大家展示了在C#程序编译另一个程序的实现方法是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、C#程序编译编译前,要用到VS2005提供的一个编译工具 devenv.exe,这个在
2023-06-18

C++如何实现在有序数组中查找元素的第一个和最后一个位置

这篇文章主要讲解了“C++如何实现在有序数组中查找元素的第一个和最后一个位置”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++如何实现在有序数组中查找元素的第一个和最后一个位置”吧!Fin
2023-06-20

C#中怎么实现一个屏幕保护程序

C#中怎么实现一个屏幕保护程序,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#屏幕保护程序不仅可以延长显示器的使用寿命,还可以保护私人信息。本文向大家介绍一个
2023-06-18

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录