# mfcDrawingAPP **Repository Path**: csharp_2/mfc-drawing-app ## Basic Information - **Project Name**: mfcDrawingAPP - **Description**: 计算机图形学实验设计,基于MFC的绘图软件,MFC绘图,工业设计 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-01-27 - **Last Updated**: 2026-01-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MFCDrawing绘图项目 ## 一. 项目介绍 本项目是基于MFC实现的图元绘制应用,项目包含计算机图形学相关知识内容,偏向于CAD软件绘图设计,而非绘画。MFC 基于 C++的界面开发框架,提供了丰富的图形和用户界面控件,以及处理输入事件和绘制图形的功能,还有独特的序列化操作使数据存储更加方便快捷。以下列出本项目相关 MFC 特性和技术: - 利用 C++面向对象特性,通过继承基类 **CObject** 设计相关图元类,并利用列表保存对象,实现图元在内存的存储。 - 利用 MFC 中封装的 **GDI** 函数实现图元的变换和双缓冲绘制。 - 利用 MFC 各类界面控件和 **消息映射** 机制实现用交互功能,以及对屏幕刷新。 - 利用 MFC **序列化** 机制,实现内存中的对象以文件的形式存入存储介质,而从介质中读入时,该对象又能恢复为原来的状态。 ## 二. 项目开发环境 - visual studio 2022 - 适用于最新v143生成工具的C++MFC(x86和x64) ## 三. 项目目录结构 ``` MFCDrawingProject/ │ ├── MFCDrawing.sln - 解决方案文件 ├── MFCDrawing.vcxproj - 项目文件 ├── MFCDrawing.vcxproj.filters - 项目过滤器文件 ├── MFCDrawing.vcxproj.user - 用户项目设置 │ ├── Source Files/ - 源代码文件 │ ├── MFCDrawing.cpp - 应用程序主文件 │ ├── MainFrm.cpp - 主框架窗口 │ ├── MFCDrawingDoc.cpp - 文档类,图元数据存放 │ ├── MFCDrawingView.cpp - 视图类,图元绘制显示以及界面交互设计 │ ├── DrawingAlgorithm.cpp - 各种绘图算法实现 │ ├── WBSplineCurve.cpp - B样条曲线实现 │ ├── WCircle.cpp - 圆形实现 │ ├── WCurve.cpp - Beizer曲线实现 │ ├── WEllipse.cpp - 椭圆实现 │ ├── WLine.cpp - 直线实现 │ ├── WPolyLine.cpp - 多义线实现 │ ├── WRectangle.cpp - 矩形实现 │ ├── WShape.cpp - 图元基类 │ └── pch.cpp - 预编译头实现 │ ├── Header Files/ - 头文件 │ ├── framework.h - 标准系统包含文件 │ ├── MainFrm.h - 主框架窗口类 │ ├── MFCDrawing.h - 应用程序主头文件 │ ├── MFCDrawingDoc.h - 文档类头文件 │ ├── MFCDrawingView.h - 视图类头文件 │ ├── DrawingAlgorithm.h - 绘图算法类 │ ├── WBSplineCurve.h - B样条曲线类 │ ├── WCircle.h - 圆形类 │ ├── WCurve.h - Beizer曲线类 │ ├── WEllipse.h - 椭圆类 │ ├── WLine.h - 直线类 │ ├── WPolyLine.h - 多义线类 │ ├── WRectangle.h - 矩形类 │ ├── WShape.h - 图元基类头文件 │ ├── pch.h - 预编译头文件 │ ├── resource.h - 资源文件标识符 │ └── targetver.h - API 声明 │ ├── Resource Files/ - 资源文件 │ ├── MFCDrawing.rc - 资源脚本文件 │ ├── res/ - 资源目录 │ │ ├── MFCDrawing.ico - 应用程序图标 │ │ ├── MFCDrawingDoc.ico - 文档图标 │ │ ├── Toolbar.bmp - 工具栏位图 │ │ ├── cursor1.cur - 光标资源 │ │ ├── eraser.cur - 橡皮擦光标 │ │ ├── spring.cur - 弹簧光标 │ │ ├── 旋转 (2).png - 旋转图标 │ │ ├── 旋转 (3).png - 旋转图标 │ │ ├── 旋转.png - 旋转图标 │ │ ├── 旋转画布.png - 旋转画布图标 │ │ └── 预览-旋转.png - 旋转预览图标 │ └── project_structure.txt - 项目结构文档 ``` ## 四. 基本功能 ### 1. 绘图 - 基本图形绘制,包括**线段**,**矩形**,**圆**,**椭圆**,**垂线**,通过两点确定。 - **Bezier曲线**,**B样条曲线**,**多义线**绘制,通过多点确定。 ### 2. 主要操作 - **选择**:选择图元功能,光标靠近图元会改变形状,可以选择单个或多个图元。 - **平移,缩放,旋转**:选中图元内部拖动即可移动,按住ctrl可以实现多个选择;选中图元矩形四周控制点并移动可以实现缩放;选中图元矩形顶部旋转控制点,并移动鼠标可以绕中心旋转图元。 - **填充**:对封闭图元进行填充,默认为红色。 - **求交**:对线段和线段,圆和圆,线段和圆求交点,并显示出来。 - **裁剪放大**:将线段或者由多义线构成的封闭多边形进行裁剪,并将裁剪结果放大显示。 - **擦除**:改变光标形状,点击图元附近对图元进行擦除。 - **打开与保存**:可以对绘制的图元进行保存,打开文件后图元显示,并可以对其进行操作。 ### 3. 交互式功能 - 默认功能为选择,当目前为其他功能时,单击鼠标右键恢复为选择功能。 - 绘制基本图元时,单击鼠标左键确认一点,拖动鼠标,图元跟随变化;再单击鼠标左键确定终点,绘制成功(垂线终点须选择在对应的线段上),若单击鼠标右键,则取消图形绘制。 - 绘制曲线和多义线时,每次单击左键绘制出一点,单击右键完成绘制。 - 选择图元,单击鼠标左键,图元线条变为虚线,表示选择成功;再单击左键不松开并移动鼠标可以对图元进行拖动,若在其他位置单击左键取消选择。选择图元时按住CTRL可以对多个图元进行选择拖动,拖动时鼠标光标不要在图元上。 - 不同功能设置不同的光标。 ## 五. 功能展示 ### 1. 绘图 #### 线段 ![绘制直线](res/绘制直线.gif) #### 矩形 ![绘制矩形](res/绘制矩形.gif) #### 圆 ![绘制圆](res/绘制圆.gif) #### 椭圆 ![绘制椭圆](res/绘制椭圆.gif) #### 垂线 ![绘制垂线](res/绘制垂线.gif) #### 曲线 ![绘制曲线](res/绘制曲线.gif) #### 多义线 ![绘制多义线](res/绘制多义线.gif) ### 2. 主要操作 #### 选择和拖动单个图元 ![单选择和拖动](res/单选择和拖动.gif) #### 选择和拖动多个图元 ![多选择和拖动](res/多选择和拖动.gif) #### 旋转图元 ![图元旋转](res/图元旋转.gif) #### 缩放图元 ![图元缩放](res/图元缩放.gif) #### 填充图元 ![图元填充1](res/图元填充1.gif) ![图元填充2](res/图元填充2.gif) #### 线段,封闭多边形的裁剪放大 ![图元裁剪放大](res/图元裁剪放大.gif) #### 求交点(线段,圆) ![求交](res/求交.gif) #### 擦除图元 ![擦除](res/擦除.gif) #### 打开与保存 ![打开与保存](res/打开与保存.gif) ## 六. 待修复优化的问题 - [ ] UI界面功能的优化,可以添加对话框,设置绘制的各种参数,比如绘图算法的设置。 - [ ] 填充后的图元拖动比较卡顿,且再对图元进行变换时填充部分不会变化。(由于是为了课程要求,填充部分是对每个需要填充的点进行存储,效率非常低,考虑使用GDI自带的泛洪填充函数**FloodFill**) - [ ] 裁剪放大的结果由于只是简单的对框选的位图缩放,所以显示结果比较模糊变形,可以考虑另外的方式进行放大显示。