iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >vs2019 MFC如何实现office界面的画图小项目
  • 245
分享到

vs2019 MFC如何实现office界面的画图小项目

2023-06-15 09:06:27 245人浏览 泡泡鱼
摘要

这篇文章主要为大家展示了“vs2019 MFC如何实现office界面的画图小项目”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vs2019 MFC如何实现office界面的画图小项目”这篇文章

这篇文章主要为大家展示了“vs2019 MFC如何实现office界面的画图小项目”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vs2019 MFC如何实现office界面的画图小项目”这篇文章吧。

vs2019安装MFC

有许多新手不知道MFC在vs2019里的安装选项,其实它不会在勾选工作负载时自动默认勾选,而通常需要人为勾选,具体安装步骤如下:(安装时间不是很长,网速够快几分钟就下载完毕)

打开vs安装程序

vs2019 MFC如何实现office界面的画图小项目

选择Visual Studio扩展开发

  vs2019 MFC如何实现office界面的画图小项目

选择c++ MFC 生成工具(x86 和 x64)进行安装

vs2019 MFC如何实现office界面的画图小项目

选择修改,等待安装

vs2019 MFC如何实现office界面的画图小项目

等待安装完成

vs2019 MFC如何实现office界面的画图小项目

安装完成,我们打开vs2019

vs2019 MFC如何实现office界面的画图小项目

我们创建新项目,可以看到已经有MFC应用这个选项

vs2019 MFC如何实现office界面的画图小项目

说明我们的MFC安装成功~

vs2019 MFC实现office界面的画图小项目

一、创建项目

点击文件-->新建-->项目,选择MFC应用,点击下一步

vs2019 MFC如何实现office界面的画图小项目

项目名称为Draw,点击创建

vs2019 MFC如何实现office界面的画图小项目

可以看到有很多内容

vs2019 MFC如何实现office界面的画图小项目

应用程序类型有:

  • 单个文档

  • 多个文档

  • 基于对话框

  • 多个顶层文档

vs2019 MFC如何实现office界面的画图小项目

项目样式有:

  • MFC standard

  • windows Explorer

  • Visual Studio

  • Office

vs2019 MFC如何实现office界面的画图小项目

这里应用程序类型选择多个文档,项目样式选择Office。

视觉样式和颜色选择默认的Office 2007(Blue theme)即可。

值得注意的是:Office会比默认选择的项目样式多一个Ribbon框,后面会说到~

vs2019 MFC如何实现office界面的画图小项目

点击下一步,我们来到文档模板属性,可以看到主框架描述和文档类型名称等内容,这里可以默认不用修改

vs2019 MFC如何实现office界面的画图小项目

下一步,来到用户界面功能,可以看到Command bar里有三个选项,这里我们选择默认的使用功能区(ribbon)

vs2019 MFC如何实现office界面的画图小项目

下一步,来到高级功能,可以直接默认跳过

vs2019 MFC如何实现office界面的画图小项目

点击下一步来到最后一步——生成的类,可以看到生成的类和类名,我们选择默认的App即可,这样我们的头文件和.cpp文件就是以项目名称命名

vs2019 MFC如何实现office界面的画图小项目

点击完成,之后看到左侧的解决方案资源管理器,这里包含了5个内容:

  • 引用

  • 外部依赖项

  • 头文件

  • 源文件

  • 资源文件

其中,我们可以在头文件和源文件里看到生成的.h和.cpp文件

vs2019 MFC如何实现office界面的画图小项目

二、进入多个文档的控件界面

因为是基于多个文档,所以我们需要了解如何在对话框上如何添加控件。因此我们可以双击 项目名称.rc2,进入资源视图;

  vs2019 MFC如何实现office界面的画图小项目

当然,我们也可以直接点击系统默认打开的底下的资源视图选项(注意:不能resource.h文件同时打开!!!)

  vs2019 MFC如何实现office界面的画图小项目

在这里哟~

如果不小心关闭了,也可以在菜单栏里 视图->资源视图里重新打开该视图

这里比较重要的是Menu部分,因为有很多MFC已经内置好的功能,例如主框架IDR_MaiNFRAME里就有文件下拉菜单等选项,我们想要添加一个新的下拉菜单,只需要在右边的“请在此键入”输入内容,并且编写对应的代码即可。但这里博主并不在这里添加画图的功能。

vs2019 MFC如何实现office界面的画图小项目

博主这里要在Ribbon里添加画图的功能

vs2019 MFC如何实现office界面的画图小项目

点击右边的工具箱(竖着的,治疗颈椎~)

vs2019 MFC如何实现office界面的画图小项目

然后点击Ribbon编辑器,可以看到有很多种类的控件

vs2019 MFC如何实现office界面的画图小项目

三、编写画图小程序(先从画矩形开始)

我们点击面板,然后拖动到窗口面板的右边,可以看到多了一个面板1

vs2019 MFC如何实现office界面的画图小项目

我们点击这个面板,在属性窗口中的外观下面,修改Caption,把面板1改为图形,这就算给这个面板改了名字

vs2019 MFC如何实现office界面的画图小项目

我们再选择Ribbon工具箱里的按钮,同样拖动,至图形面板,如下,名字为button1

  vs2019 MFC如何实现office界面的画图小项目

修改这个按钮的属性中杂项的ID,改为ID_RECTANGLE

这里指的注意的就是这个ID,这个在MFC编程中十分重要,因为我们往往需要获取控件的ID号来对该控件进行函数编写、消息处理等操作!!!

vs2019 MFC如何实现office界面的画图小项目

既然是按钮,那就得有触发这个按钮所要执行的操作,右键这个按钮,我们选择添加事件处理程序

vs2019 MFC如何实现office界面的画图小项目

弹出以下框

vs2019 MFC如何实现office界面的画图小项目

类列表我们选择CDrawView,点击确定

vs2019 MFC如何实现office界面的画图小项目

我们可以看到在DrawView.cpp中生成的命令函数

vs2019 MFC如何实现office界面的画图小项目

我们也可以看到在前面的代码中多了一个ON_COMMAND函数,说明我们确实添加了这样的一个按钮命令(注意:ID_RECTANGLE这个ID号就是对应的按钮的编号,&CDrawView::OnRectangle表示这个ID的按钮实现的命令函数)

vs2019 MFC如何实现office界面的画图小项目

这里的红波浪线提示没有这个ID,其实我们是添加了这个按钮的,可以在Resource.h中看到(注意打开Resource.h再去看资源试图是打不开的,会报错,因此需要先关掉Resource.h再去访问资源试图!!!!!)

#define ID_RECTANGLE                    32771

vs2019 MFC如何实现office界面的画图小项目                 

这个IDE编辑器的小问题,我们可以选择重启vs2019打开就不会显示未定义ID了,如下,没有红色波浪线了

vs2019 MFC如何实现office界面的画图小项目

现在的问题就是如何画图的问题:画矩形,则定义一个矩形类,写方法,在消息函数里新建对象即可;但是我们如果不满足只画矩形呢?画箭头、三角可不可以?这个时候我们就应该想到继承,即建一个抽象类graph,然后派生几个子类去完成这个功能。因此我们应该先新建一个graph抽象类:

我们右键头文件,选择添加-->新建项,弹出如下界面;

选择头文件(.h),名称为graph.h,点击确定

vs2019 MFC如何实现office界面的画图小项目

如下

vs2019 MFC如何实现office界面的画图小项目

添加如下代码:

graph.h

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

结果报了一堆错误,事实是因为我们新建的graph并没有和MFC本身的类关联起来

vs2019 MFC如何实现office界面的画图小项目

我们可以这样做:打开framework.h(vs2017里是stdafx.h),我们在这里include一下我们的graph抽象类

vs2019 MFC如何实现office界面的画图小项目

如下(注意自己写的头文件要使用引号“”)

#include "graph.h"

vs2019 MFC如何实现office界面的画图小项目

我们再回过头看graph.h,发现已经没有错误了

vs2019 MFC如何实现office界面的画图小项目

写了头文件,还要写对应的源文件:

我们右键头文件,选择添加-->新建项,弹出如下界面;

选择C++文件(.cpp),名称为graph.cpp,点击确定

vs2019 MFC如何实现office界面的画图小项目

如下

vs2019 MFC如何实现office界面的画图小项目

填写如下代码

graph.cpp

#include "framework.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);}

根据上面的步骤,同样地,我们再新建一个矩形Rectangle类。这里直接列出头文件和源文件

rectangle.h

#pragma once#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();};

rectangle.cpp

#include "framework.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(){}

注意framework.h不要忘了加上:

#include "rectangle.h"

vs2019 MFC如何实现office界面的画图小项目

由于我们需要可以添加多个图形,因此一个以graph对象构成的list是必不可少的。我们在DrawDoc.h文档头文件添加这个list,可以添加//操作下面

vs2019 MFC如何实现office界面的画图小项目

如下,可以看到又报错了:

std::list<graph*> graphList;

vs2019 MFC如何实现office界面的画图小项目

还是一样的,把list的头文件加到framework.h中

#include <list>

vs2019 MFC如何实现office界面的画图小项目

再回去看DrawDoc.h,发现没有错误

vs2019 MFC如何实现office界面的画图小项目

我们再回到DrawView.cpp,填写矩形Rectangle的消息处理程序,如下。代码解释为每点击一次矩形按钮,添加一个矩形:

void CDrawView::OnRectangle(){// TODO: 在此添加命令处理程序代码CDrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;pDoc->graphList.push_front(new rectangle(50, 50, 100, 100)); Invalidate();}

vs2019 MFC如何实现office界面的画图小项目

我们还需要修改DrawView.cpp里的绘图代码部分

vs2019 MFC如何实现office界面的画图小项目

添加如下代码(CDC* 后面的pDC取消注释)

// CDrawView 绘图 void CDrawView::OnDraw(CDC* pDC){CDrawDoc* 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);}}

vs2019 MFC如何实现office界面的画图小项目

运行程序,发现报错,这是预编译头的问题

1>------ 已启动生成: 项目: Draw, 配置: Debug Win32 ------
1>pch.cpp
1>calendarbar.cpp
1>ChildFrm.cpp
1>Draw.cpp
1>DrawDoc.cpp
1>DrawView.cpp
1>graph.cpp
1>D:\vs2019_project\Draw\graph.cpp(110): fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "pch.h"”?
1>MainFrm.cpp
1>rectangle.cpp
1>D:\vs2019_project\Draw\rectangle.cpp(25): fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "pch.h"”?
1>正在生成代码...
1>已完成生成项目“Draw.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

vs2019 MFC如何实现office界面的画图小项目

点击菜单栏的项目-->属性,选择C/C++-->预编译头,如下

vs2019 MFC如何实现office界面的画图小项目

改为不使用预编译头,点击确定

vs2019 MFC如何实现office界面的画图小项目

我们再次运行代码,出现如下界面

vs2019 MFC如何实现office界面的画图小项目

我们点击图形面板的矩形,可以看到窗口生成了一个矩形

vs2019 MFC如何实现office界面的画图小项目

然而,仅仅是生成一个矩形还是不够的;我们还需要添加鼠标的相关消息响应函数,例如鼠标移动,鼠标按下和鼠标抬起

右键源文件,点击类向导

vs2019 MFC如何实现office界面的画图小项目

如下

vs2019 MFC如何实现office界面的画图小项目

我们添加一个鼠标左键按下的消息响应:选择消息栏,选择WM_LBUTTONUP,类名选择CDrawView,点击添加处理程序

vs2019 MFC如何实现office界面的画图小项目

如下

vs2019 MFC如何实现office界面的画图小项目

vs2019 MFC如何实现office界面的画图小项目

添加如下代码:

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值CDrawDoc* 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);}

vs2019 MFC如何实现office界面的画图小项目

同样地,我们再添加鼠标左键松开

vs2019 MFC如何实现office界面的画图小项目

填写代码:

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值CDrawDoc* 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);}Invalidate();//CView::OnLButtonUp(nFlags, point);}

vs2019 MFC如何实现office界面的画图小项目

同样地,我们再添加鼠标移动

vs2019 MFC如何实现office界面的画图小项目

填写代码:

void CDrawView::OnMouseMove(UINT nFlags, CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值CDrawDoc* 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);}

vs2019 MFC如何实现office界面的画图小项目

运行程序,我们点击矩形,可以拖动这个矩形了!!

vs2019 MFC如何实现office界面的画图小项目

vs2019 MFC如何实现office界面的画图小项目

博主这里还做了放大和缩小:把鼠标移到矩形边缘,点击边缘就可以放大缩小~

vs2019 MFC如何实现office界面的画图小项目

当然,我们还可以再添加好几个矩形,因为别忘了博主是用list来存储每次生成的graph对象的~

vs2019 MFC如何实现office界面的画图小项目

四、我们还可以再多画一些,例如箭头、直线和三角

相信前面的步骤大家了解的话,我相信添加按钮是很容易的,这里就直接给出博主的按钮ID

三角形:ID_TRIANGLE

箭头:ID_ARROW

直线:ID_LINE

vs2019 MFC如何实现office界面的画图小项目

vs2019 MFC如何实现office界面的画图小项目

vs2019 MFC如何实现office界面的画图小项目

添加的类和方法:

*framework.h

#include <afxwin.h>         // MFC 核心组件和标准组件#include <afxext.h>         // MFC 扩展#include "graph.h"#include "rectangle.h"#include "triangle.h"#include "arrow.h"#include "line.h"  #include <list>

vs2019 MFC如何实现office界面的画图小项目

(1)三角形:

triangle.h

#pragma once#include "graph.h"class triangle :public graph{protected:public:triangle(int l, int u, int r, int d);int getGraphID() { return 3; }void onDraw(CDC* pDC);~triangle();};

triangle.cpp

#include "framework.h"triangle::triangle(int l, int u, int r, int d) :graph(l, u, r, d){state = 0;fcolor = 0xffffff;} void triangle::onDraw(CDC* pDC){CPoint pts[3];pts[0].x = (left + right) / 2;pts[0].y = up;pts[1].x = left;pts[1].y = down;pts[2].x = right;pts[2].y = down;CBrush b(fcolor);pDC->SelectObject(&b);CPen p(PS_SOLID, 1, bcolor);pDC->SelectObject(&p);pDC->PolyGon(pts, 3);} triangle::~triangle(){}

(2)箭头:

arrow.h

#pragma once#include "graph.h"class arrow :public graph{public:arrow(int l, int u, int r, int d);void onDraw(CDC* pDC);int getGraphID() { return 4; }~arrow();};

arrow.cpp

#include "framework.h"  arrow::arrow(int l, int u, int r, int d) :graph(l, u, r, d){} void arrow::onDraw(CDC* pDC){CPoint pts[2], pt[3];pts[0].x = left;pts[0].y = (up + down) / 2;pts[1].x = (left + right) / 2;pts[1].y = (up + down) / 2;pt[0].x = (left + right) / 2;pt[0].y = up;pt[1].x = (left + right) / 2;pt[1].y = down;pt[2].x = right;pt[2].y = (up + down) / 2;CBrush b(fcolor);pDC->SelectObject(&b);CPen p(PS_SOLID, 1, bcolor);pDC->SelectObject(&p);pDC->Polygon(pts, 2);pDC->Polygon(pt, 3);}arrow::~arrow(){}

(3)直线:

line.h

#pragma once#include "graph.h"class line :public graph{public:line() :line(50, 50, 100, 100) {}line(int l, int u, int r, int d);void onDraw(CDC* pDC);int getGraphID() { return 1; }~line();};

line.cpp

#include "framework.h" line::line(int l, int u, int r, int d) :graph(l, u, r, d){state = 0;fcolor = 0xffffff;} void line::onDraw(CDC* pDC){CPoint pts[2];pts[0].x = left;pts[0].y = (up + down) / 2;pts[1].x = right;pts[1].y = (up + down) / 2;CBrush b(fcolor);pDC->SelectObject(&b);CPen p(PS_SOLID, 1, bcolor);pDC->SelectObject(&p);pDC->Polygon(pts, 2);}line::~line(){}

添加的事件处理程序:

(1)三角形:

void CDrawView::OnTriangle(){// TODO: 在此添加命令处理程序代码CDrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;pDoc->graphList.push_front(new triangle(50, 50, 100, 100)); Invalidate();}

(2)箭头:

void CDrawView::OnArrow(){// TODO: 在此添加命令处理程序代码CDrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;pDoc->graphList.push_front(new arrow(50, 50, 100, 100)); Invalidate();}

(3)直线:

void CDrawView::OnLine(){// TODO: 在此添加命令处理程序代码CDrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;pDoc->graphList.push_front(new line(50, 50, 100, 100)); Invalidate();}

运行程序,现在可以添加各种图形并且可以改变大小啦

vs2019 MFC如何实现office界面的画图小项目

五、图形的轮廓填充和内部填充(为了方便,都是统一更改颜色,一个一个改代码很麻烦)

添加一个面板,再添加两个按钮。按钮的选择是颜色按钮

  vs2019 MFC如何实现office界面的画图小项目

如下

轮廓:ID_FILLCOLOR_LINE

内部:ID_FILLCOLOR_IN

vs2019 MFC如何实现office界面的画图小项目

vs2019 MFC如何实现office界面的画图小项目

添加的事件处理程序:

(1)需要在DrawView.cpp中添加MainFrm.h头文件

#include "MainFrm.h"

vs2019 MFC如何实现office界面的画图小项目

(2)还需要在MainFrm.h中将m_wndRibbonBar从protected变为public,这样才能访问到这个变量,否则报错!

protected:  // 控件条嵌入成员//CMFCRibbonBar     m_wndRibbonBar;CMFCRibbonApplicationButton m_MainButton;CMFCToolBarImages m_PanelImages;CMFCRibbonStatusBar  m_wndStatusBar;COutlookBar       m_wndNavigationBar;CMFCshellTreeCtrl m_wndTree;CCalendarBar      m_wndCalendar;CMFCCaptionBar    m_wndCaptionBar;public:CMFCRibbonBar     m_wndRibbonBar;

vs2019 MFC如何实现office界面的画图小项目

轮廓

void CDrawView::OnFillcolorLine(){// TODO: 在此添加命令处理程序代码CDrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd(); CMFCRibbonColorButton* a = (CMFCRibbonColorButton*)((pFrame->m_wndRibbonBar).FindByID(ID_FILLCOLOR_LINE));COLORREF c = a->GetColor(); std::list<graph*>::iterator v;for (v = pDoc->graphList.begin(); v != pDoc->graphList.end(); ++v) {(*v)->SetFillColor(c);}Invalidate();}

内部

void CDrawView::OnFillcolorIn(){// TODO: 在此添加命令处理程序代码CDrawDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd(); CMFCRibbonColorButton* a = (CMFCRibbonColorButton*)((pFrame->m_wndRibbonBar).FindByID(ID_FILLCOLOR_IN));COLORREF c = a->GetColor(); std::list<graph*>::iterator v;for (v = pDoc->graphList.begin(); v != pDoc->graphList.end(); ++v) {(*v)->SetBorderColor(c);}Invalidate();}

运行程序

(1)轮廓变红,选择红色

vs2019 MFC如何实现office界面的画图小项目

如下

vs2019 MFC如何实现office界面的画图小项目

(2)内部填充为绿色,选择绿色

vs2019 MFC如何实现office界面的画图小项目

如下

vs2019 MFC如何实现office界面的画图小项目

六、序列化保存和读取文件

修改DrawDoc.cpp的序列化部分,这是用于菜单栏里的保存和打开图片所使用的

 vs2019 MFC如何实现office界面的画图小项目

vs2019 MFC如何实现office界面的画图小项目

修改代码如下:

// CDrawDoc 序列化 void CDrawDoc::Serialize(CArchive& ar){if (ar.IsStoring()){// TODO: 在此添加存储代码ar << graphList.size();for (auto it = graphList.begin(); it != graphList.end(); it++) {ar << (*it)->getGraphID();(*it)->Serialize(ar);}}else{// TODO: 在此添加加载代码for (auto it = graphList.begin(); it != graphList.end(); it++) {delete* it;}graphList.clear();int i, gid;ar >> i;graph* g;while (i--) {ar >> gid;switch (gid){case 1:g = new line();break;case 2:g = new rectangle();break;case 3:g = new triangle(0, 0, 0, 0);break;case 4:g = new arrow(0, 0, 0, 0);break;default:g = new graph();break;} g->Serialize(ar);graphList.push_back(g);}}}

vs2019 MFC如何实现office界面的画图小项目

运行程序:博主随便画一个图

vs2019 MFC如何实现office界面的画图小项目

选择保存,默认路径和名字

vs2019 MFC如何实现office界面的画图小项目

可以看到有一个Draw1的文件

vs2019 MFC如何实现office界面的画图小项目

我们关掉程序,再运行程序,打开这个文件

vs2019 MFC如何实现office界面的画图小项目

vs2019 MFC如何实现office界面的画图小项目

可以看到多一个窗口,说明我们序列化成功!! 

vs2019 MFC如何实现office界面的画图小项目

七、自己写一个导出文件的按钮

再新建一个面板,拖入一个按钮,名字到导出图片,ID为ID_SAVE

vs2019 MFC如何实现office界面的画图小项目

添加的事件处理程序:

void CDrawView::OnSave(){// TODO: 在此添加命令处理程序代码CClientDC dc(this);CRect rect;CString saveFilePath;BOOL  showMsgTag;BOOL saveTag = FALSE;GetClientRect(&rect);HBITMAP hbitmap = CreateCompatibleBitmap(dc, rect.right - rect.left, rect.bottom - rect.top);HDC hdc = CreateCompatibleDC(dc);HBITMAP hOldMap = (HBITMAP)SelectObject(hdc, hbitmap);BitBlt(hdc, 0, 0, rect.right - rect.left, rect.bottom - rect.top, dc, 0, 0, SRCCOPY);CImage image;image.Attach(hbitmap);if (!saveTag){saveTag = TRUE;showMsgTag = TRUE;CString  strFilter = _T("位图文件(*.bmp)|*.bmp|JPEG 图像文件|*.jpg|  GIF图像文件 | *.gif | PNG图像文件 | *.png |其他格式(*.*) | *.* || ");CFileDialog dlg(FALSE, _T("bmp"), _T("iPaint1.bmp"), NULL, strFilter);if (dlg.DoModal() != IDOK) return;CString strFileName;CString strExtension;strFileName = dlg.m_ofn.lpstrFile;if (dlg.m_ofn.nFileExtension == 0){switch (dlg.m_ofn.nFilterIndex){case 1:strExtension = "bmp";break;case 2:strExtension = "jpg";break;case 3:strExtension = "gif";break;case 4:strExtension = "png";break; }strFileName = strFileName + "." + strExtension;}saveFilePath = strFileName;}else{showMsgTag = FALSE;}HRESULT hResult = image.Save(saveFilePath);if (FAILED(hResult)) {MessageBox(_T("保存图像文件失败!"));}else{if (showMsgTag)MessageBox(_T("文件保存成功!"));}image.Detach();SelectObject(hdc, hOldMap);}

运行程序,导入Draw1

vs2019 MFC如何实现office界面的画图小项目

点击导出图片,选择路径和文件名称,确定

vs2019 MFC如何实现office界面的画图小项目

提示文件保存成功!

vs2019 MFC如何实现office界面的画图小项目

双击打开这个文件iPaint1.bmp

vs2019 MFC如何实现office界面的画图小项目

可以看到成功打开(注意:这个文件不能用刚才自己写的MFC程序自带的打开来打开这个文件,因为打开的文件不是被序列化过的,因此打开会失败!)

因此不能用这里的打开按钮哟vs2019 MFC如何实现office界面的画图小项目

vs2019 MFC如何实现office界面的画图小项目

以上是“vs2019 MFC如何实现office界面的画图小项目”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: vs2019 MFC如何实现office界面的画图小项目

本文链接: https://www.lsjlt.com/news/279544.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • vs2019 MFC如何实现office界面的画图小项目
    这篇文章主要为大家展示了“vs2019 MFC如何实现office界面的画图小项目”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vs2019 MFC如何实现office界面的画图小项目”这篇文章...
    99+
    2023-06-15
  • vs2019 MFC实现office界面的画图小项目
    目录vs2019安装MFCvs2019 MFC实现office界面的画图小项目一、创建项目二、进入多个文档的控件界面三、编写画图小程序(先从画矩形开始)四、我们还可以再多画一些,例如...
    99+
    2024-04-02
  • VS2019如何实现C++的MFC程序
    这篇文章主要介绍了VS2019如何实现C++的MFC程序,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、创建项目然后点下一步,配置项目,这里我命名的是myfisrtmfc点...
    99+
    2023-06-15
  • 小项目中如何防止Vue的闪现画面效果
    这篇文章将为大家详细讲解有关小项目中如何防止Vue的闪现画面效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Vue的优点Vue具体轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM...
    99+
    2023-06-08
  • Java基于Swing和netty实现仿QQ界面聊天小项目
    目录1.前言2.功能实现3.模块划分4.使用的知识5.部分代码实现1.nettyController.java2.ClientHandler.java3.linkmen.java4....
    99+
    2024-04-02
  • c++如何实现图形化界面
    C++本身是一种面向对象的编程语言,不直接提供图形化界面的功能。但是可以通过使用第三方库或者框架来实现图形化界面。以下是几种常见的C...
    99+
    2023-09-14
    c++
  • Android项目中如何实现自定义相机预览界面
    Android项目中如何实现自定义相机预览界面?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。官方文档:public static void setCameraD...
    99+
    2023-05-31
    android roi 目中
  • C#如何实现图形界面的时钟
    今天小编给大家分享一下C#如何实现图形界面的时钟的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。秒针有跳跃两个格子问题,主要是...
    99+
    2023-07-02
  • 如何在JavaWeb项目中实现一个表单注册界面
    这篇文章将为大家详细讲解有关如何在JavaWeb项目中实现一个表单注册界面,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Step1 页面实现在这一步主要用到了html、css、JavaScr...
    99+
    2023-05-31
    javaweb ava 目中
  • Python简单实现图片转字符画的实例项目
    1. 原理 利用 PIL 库来获取图片并修改大小, 利用灰度值转换公式把每一个像素的 RGB 值转为灰度值 gray = int(0.2126*r+0.7152*g+0.0722...
    99+
    2024-04-02
  • 批处理bat如何实现图形界面
    小编给大家分享一下批处理bat如何实现图形界面,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、弹出窗口msg命令msg %username% "Hel...
    99+
    2023-06-08
  • css如何实现图片放大缩小动画
    这篇“css如何实现图片放大缩小动画”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“css如何实现图片放大缩小动画”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希...
    99+
    2024-04-02
  • 微信小程序如何实现登录界面
    这篇文章主要介绍“微信小程序如何实现登录界面”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“微信小程序如何实现登录界面”文章能帮助大家解决问题。注:这里使用的是原生微信小程序使用wxss和wxmlin...
    99+
    2023-06-30
  • Java如何实现带图形界面的聊天程序
    今天小编给大家分享一下Java如何实现带图形界面的聊天程序的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。ServerDemo...
    99+
    2023-07-02
  • C语言如何实现通讯录小项目
    这篇文章主要介绍了C语言如何实现通讯录小项目,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。本文实例为大家分享了C语言实现通讯录小项目的具体代码,供大家参考,具体内容如下编写程...
    99+
    2023-06-15
  • vuejs项目如何实现百度地图显示
    这篇文章给大家介绍vuejs项目如何实现百度地图显示,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。实现方法:1、在“百度地图开发平台”中申请秘钥;2、在“index.html”中使用s...
    99+
    2024-04-02
  • Python如何实现带图形界面的炸金花游戏
    本文小编为大家详细介绍“Python如何实现带图形界面的炸金花游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python如何实现带图形界面的炸金花游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。炸金花题目...
    99+
    2023-07-04
  • 如何通过JFreeChart实现在jsp页面画甘特图
    小编给大家分享一下如何通过JFreeChart实现在jsp页面画甘特图,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!首先把重要的代码粘出来供大家参考,项目源码和数据库信息表,以及参考的资料和一些资料的网址我就打包放在下面,...
    99+
    2023-06-17
  • JS如何实现画圆圈的小球
    小编给大家分享一下JS如何实现画圆圈的小球,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!效果图 图(1)图(2)代码如...
    99+
    2024-04-02
  • 微信小程序如何实现下拉刷新界面
    这篇文章主要介绍微信小程序如何实现下拉刷新界面,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!微信小程序下拉刷新界面的实现利用onPullDownRefresh函数设置下拉刷新功能一、...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作