文章目录
一、前言
-
开发环境:Microsoft Visual Studio Community 2022 (64 位) - Preview
-
安装MFC模板:参考
-
要求:能处理线、矩形和椭圆的加载和保存工作,要能有颜色和线宽信息。
-
最终项目结构
二、创建项目
-
选择MFC应用
-
设置项目名称:Test3
-
设置应用程序类型和项目样式
三、编写代码
1.创建自己的形状类
- 头文件:Test3Shape.h
得到
输入代码:
#pragma once
class Test3Shape : public CObject
{
DECLARE_SERIAL(Test3Shape)
private:
double up;
double down;
double left;
double right;
int body;
COLORREF col_area;
COLORREF col_line;
int line_width;
bool isOk;
public:
Test3Shape(); // 无参构造
Test3Shape(double up, double down, double left, double right, int body, COLORREF col_area, COLORREF col_line, int line_width); // 构造函数
virtual void Serialize(CArchive& ar);
void Draw(CDC* pDC); // 绘图函数
void IsSelect(double x, double y); // 判断选择函数
bool CD(); // 返回选择状态函数
void NoSelect(); // 取消选择状态函数
void MoveUP(); // 向上移动
void MoveDOWN(); // 向下移动
void MoveLEFT(); // 向左移动
void MoveRight(); // 向右移动
double GetUP(); // 返回up值
double GetDPWN(); // 返回down值
double GetLEFT(); // 返回left值
double GetRIGHT(); // 返回right值
int GetBODY(); // 返回body值
COLORREF GetCOL_AREA(); // 返回填充颜色
COLORREF GetCOL_LINE(); // 返回描边颜色
int GetLINE_WIDTH(); // 返回线宽
void ad(); // 个数+
void da(); // 个数-
};
- 源文件:Test3Shape.cpp
得到
输入代码:
#include "pch.h"
#include "windef.h"
#include "Test3Shape.h"
IMPLEMENT_SERIAL(Test3Shape, CObject, 1)
Test3Shape::Test3Shape() {}
Test3Shape::Test3Shape(double x, double y, double m, double n, int z, COLORREF c, COLORREF c0, int w) // 构造
{
up = x;
down = y;
left = m;
right = n;
body = z;
col_area = c;
col_line = c0;
line_width = w;
isOk = false;
}
void Test3Shape::Serialize(CArchive& ar)
{
if (ar.IsStoring()) { //序列化,保存信息
ar << up << down << left << right << body << col_area << col_line << line_width << isOk;
}
else //反序列化,读取信息
{
ar >> up >> down >> left >> right >> body >> col_area >> col_line >> line_width >> isOk;
}
}
void Test3Shape::Draw(CDC* pDC) // 绘画
{
CBrush NBrush(col_area);
CPen NPen(PS_SOLID, line_width, col_line);
pDC->SelectObject(NBrush);
pDC->SelectObject(NPen);
switch (body)
{
case 1:
{
pDC->MoveTo(left, up);
pDC->LineTo(right, down);
break;
}
case 2:
{
pDC->Ellipse(left, down, right, up);
break;
}
case 3:
{
pDC->Rectangle(left, down, right, up);
break;
}
}
}
void Test3Shape::IsSelect(double x, double y) // 选择
{
switch (body)