资源描述
摘要
文章介绍了基于VC++编译环境,采用C++语言编写画板软件的分析与设计过程。
主要思路是利用MFC针对用户鼠标的移动与点击,编写代码来做出相应的响应,实现画板功能。主要编写代码的流程为:一、新建虚基类,编写虚函数和公有成员;二、新建派生类,编写各自的公有函数实现具体的功能;三、将用户的操作和派生类的具体功能相结合,编写用户操作要执行的代码;四、编写代码实现画板的保存;五、对整个程序进行调试,提高代码效率。
本次设计,基本实现画板软件画线、画圆和画方的功能,并添加了保存和打开功能。
关键词: 画板软件,VC++,MFC,C++
ABSTRACT
This thesis introduces the analysis and design of the sketchpad software based on VC + + compiler environment and the language of C++.
The main ideas is using MFC to write out the code to respond the user’s mouse movements and clicks ,to realise Sketchpad features. The main process of program is: first, build new virtual base classes,program virtual functions and public members.second, build new derived class, write their own specific functions to achieve the Specific function. Third,conbain the user's operation and the specific function of derived classes, program the code of user's operation . Forth, program the code of saving function. Fifth, debugging the program, improve the code efficiency.
This design, basically realise sketchpad software’s functions of drawing lines, circles, and square ,and add save and open functions.
Keywords: ketchpad software, VC++, MFC, C++
目录
摘要 I
ABSTRACT II
第1章 引言 1
1.1 背景 1
1.2 研究内容 1
第2章 概念介绍 3
2.1 VC++ 3
2.2 MFC 4
2.3 C++ 4
第3章 画板基本功能的设计 5
3.1 总体的设计思路 5
3.2 为什么要使用抽象类 7
3.3 抽象类的设计 7
3.4 由基类到派生类 8
3.5虚函数和多态性 9
3.6 利用VECTOR实现动态增长 10
3.6.1 STL介绍 10
3.6.2 向量VECTOR 10
3.7 选择画图工具 11
3.8 鼠标左键按下的响应 11
3.9 鼠标移动时的响应 11
3.10 鼠标左键弹起时的响应 13
3.11 重要的ONPAINT 13
第4章 画板附加功能的设计 14
4.1 颜色功能 14
4.2 粗细功能 15
4.3 保存功能 17
4.4 打开功能 17
第5章 结束语 18
致谢 19
参考文献 20
附录1 类的部分源代码 21
附录2 功能实现的部分源代码 25
32
第1章 引言
1.1 背景
当今社会,在这个高速发展的信息时代,人们对信息与资源的获取渠道逐渐由现实生活转向虚拟的网络世界。逐渐的人们的贸易和交友等等活动都由传统模式转化到传统模式与网络模式并存的状态,可以说,未来的世界很大的社会活动,社会新闻将在网络上普遍流传。而正是基于这个前提,开发软件,使电脑硬件带上隐形的翅膀,让人们能更方便简洁的在电脑上完成日常生活和与世界沟通的愿望。软件是人们在虚拟世界上获取知识和贸易的桥梁。
汇编语言依赖于计算机硬件,程序的可读性和可移植性都比较差。Dennis Ritchie(丹尼斯里奇),C语言之父,UNIX之父,于20世纪70年代创建了C语言。C语言的出现,提高了可读性和可移植性,C语言标志着程序设计新时代的开始。在C语言创建之后不久,出现了新的概念:面向对象的程序设计。由此,由C语言的面向过程发展到c++语言的面向对象,建立在C语言的基础之上的C++语言应运而生。VC++是微软公司开发的一个集成开发环境,是windows平台上的C++编程环境。
编程语言中真正的霸主多年来一直是C++,所有的操作系统和绝大多数的商品软件都是用C++作为主要开发语言的。在操作系统、设备驱动程序、视频游戏等领域,C++在很长的时间内仍将占据主要地位。
在这个信息时代,计算机的使用已相当普及,在我们使用电脑时,无时无刻不在接触着软件,WINDOWS98总共大概不到10万行代码,而WINDOWS2000则已经有20余万行代码,其中80%是用C++编写,其余部分有C和汇编,底层接口用汇编编写。可以说在系统软件和应用软件上,到处能见到C++语言的巨大作用。
1.2 研究内容
本次研究的基本内容是对C++语言在VC++编译环境下编写画板程序,实现基本的画板功能。利用面向对象系统的多态性,封装性和继承性减少代码的冗余度,利用容器(vector)实现自动增长的对象数组,能够增加和压缩数据。在完成基本的画板功能画线、画圆、画方的基础上添加画笔颜色和画笔的粗细功能。最后实现画板的保存和打开功能。
本次研究的方法和技术路线是针对用户鼠标的移动与点击在windows操作系统的基础上做出相应的响应。在思路上明确要完成的功能,然后在代码的编写上围绕着主题,不断地使其接近所需的功能。查阅多类资料,对具体的使用虚函数或使用重载函数等的应用上要有一个明确的思路。掌握并熟练运用VC++编译环境,利用c++语言实现基本的画板软件的设计与实现。充分利用虚基类和派生类来实现多态性,使得程序的代码上尽量简洁,使得运行的效率尽量提高,最终做到程序的高效性和正确性。再在整个程序完成后,对之前所编写的错误情况,现在的改进情况进行分析,努力从过去的错误中得到教训得到提高。
本次研究要解决的主要问题是如何实现动态显示图形,并在无数次的绘画后不出现异常和内存溢出问题。经过无数次的运行和调试,以达到无法发现错误的标准。
第2章 概念介绍
本次设计是在VC++做编译环境下利用MFC类库采用C++语言编写的。本章主要介绍VC++、MFC和C++。
2.1 VC++
VC++是Windows平台上的C++编译环境,学习VC++要了解Windows平台的特性并且还要掌握MFC、ATL、COM等知识。VC++作为一个主流的开发平台,一直深受编程爱好者的喜爱,但是由于它的入门难度很高,很多人都倒在入门之前。VC++应用程序的开发主要有两种模式,一种是WIN API方式,另一种则是MFC方式,传统的WIN API开发方式比较繁琐,而MFC则是对WIN API再次封装,所以MFC相对于WIN API开发更具备效率优势。而本次的画板软件正是以MFC方式开发的。
VC++使用的范围:
VC++主要是针对Windows系统,适合一些系统级的开发,可以方便实现一些底层 的调用。在VC++里边嵌入汇编语言很简单。
VC ++主要用在驱动程序开发。
VC++执行效率高,当对系统性能要求很高的时候,可用VC++开发。
VC++主要适用于游戏开发。
VC++多用于单片机,工业控制等软件开发,如直接对I/O地址操作,就要用C++。
VC++适用开发高效,短小,轻量级的COM组件,DLL。比如WEB上的控件。
VC++可以开发优秀的基于通信的程序。
VC++可以开发高效灵活的文件操作程序。
VC++可以开发灵活高效的数据库操作程序。
VC++是编CAD软件的唯一选择!!!包括AUTOCAD,UG的二次开发。
VC++在多线程、网络通信、分布应用方面,有不可比拟的优势。
2.2 MFC
微软基础类库(MFC:Microsoft Foundation Class)是微软为Windows程序员提供的一个面向对象的Windows编程接口,它大大简化了Windows编程工作。使用MFC类库的好处是:首先,MFC提供了一个标准化的结构,这样开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是“站在巨人肩膀上”,从一个比较高的起点编程,故节省了大量的时间;其次,它提供了大量的代码,指导用户编程时实现某些技术和功能。MFC库充分利用了Microsoft开发人员多年开发Windows程序的经验,并可以将这些经验融入到你自己开发的应用程序中去。
2.3 C++
1.C语言
C语言是一种面向过程的计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。
2.C++语言
C++语言是在C语言的基础上扩充的面向对象的概念及相应处理机制而形成的一种混合型程序设计语言。
C++支持面向对象的程序设计方法,特别适合于中型和大型的软件开发项目,从开发时间、费用到软件的重用性、可扩充性、可维护性和可靠性等方面,C++均具有很大的优越性。同时,C++又是C语言的一个超集,这就使得许多C代码不经修改就可被C++编译通过。
第3章 画板基本功能的设计
3.1 总体的设计思路
在VC++中新建解决方案Mfc。创建一个抽象类Cshape类,派生类有画线CLine类、画圆CEllipse类、画方CRectangle类。在虚基类上编写公有成员和虚函数,再在派生类中各自函数中添加各自的运行代码。
基类与派生类结构如图3-1所示:
Cshape
派生
CLine
CEllipse
CRectangle
图3-1 基类与派生类
在资源视图的菜单IDR_MAINFRAME中添加菜单项“画图工具”,并添加子菜单“直线”、“圆”和“方”。为各个子菜单在CMfcView类中添加相应的命令处理程序函数。再在CMfcView类的鼠标左键响应事件中添加对选择不同画图工具的不同处理程序代码,实现画图功能。在CMfcView类中添加文件打开和文件保存的函数,实现打开和保存功能。在CMfcView类的OnPaint函数中实现重绘功能。再在CMfcView类中添加OnMouseMove函数,实现画图时的现实轨迹功能。
本次设计的基本流程是为菜单添加画图工具,既添加画线、画圆和画方的功能,然后在此基础上,体现动态显示的功能。再添加画笔的颜色以及画笔的粗细功能。在窗口重绘时实现最大化、最小化以及改变窗口大小时,图形不消失也不发生改变。然后,添加图形的保存和打开功能。
设计的流程效果如图3-2所示:
窗口重绘,图像不消失
添加保存或打开画板
选择画图工具
画线
画圆
画方
动态轨迹画线
动态轨迹画圆
动态轨迹画方
添加画笔颜色和画笔粗细的功能
图3-2 设计要达到的流程效果
3.2 为什么要使用抽象类
类是面向对象程序设计的核心,是对某一类对象的抽象,对象是某一种类的实例,因此,类和对象是密切相关的。没有脱离对象的类,也没有不依赖于类的对象。
类的定义格式一般地分为说明部分和实现部分。说明部分是用来说明该类中的成员,包含数据成员的说明和成员函数的说明,说明部分的代码会写在“文件名.h”文件中。成员函数是用来对数据成员进行操作的,又称为“方法”。实现部分是用来对成员函数的定义。概括说来,说明部分将告诉使用者“干什么”,而实现部分是告诉使用者“怎么干”,实现部分的代码会写在“文件名.cpp”文件中。
通过继承机制,可以利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,而派生的类称为派生类。
当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类。
通俗的说,含有虚函数的基类称为虚基类。含有纯虚函数的基类称为抽象类。抽象类是不能被实例化的类,不能产生对象的,但可以由它的派生类来声明对象,从而使派生类赋有基类的属性和方法。本次设计需要涉及到CLine类、CEllipse类和CRectangle类。通过设计一个抽象类,得到三个派生类,实现多态性,从而减少了代码的冗余度。
3.3 抽象类的设计
考虑到产生的派生类应该具有的共同属性和方法,抽象类Cshape类定义的共有成员m_ptStartx表示鼠标左键按下的x坐标,m_ptStarty表示鼠标左键按下的y坐标,m_ptEndx表示鼠标左键弹起的x坐标,m_ptEndy表示鼠标左键弹起的y坐标,m_clr表示画笔的颜色,m_pensize表示画笔的粗细,m_PenStyle表示画笔的类型。抽象类Cshape类定义的纯虚函数virtual void DrawShape(HDC hdc) = 0主要是派生类提供接口,而自己不实现任何的画图功能。抽象类Cshape类定义的虚函数virtual void SetStartPoint(CPoint point)是响应鼠标左键按下时调用的函数,抽象类Cshape类定义的虚函数virtual void SetEndPoint (CPoint point)是响应鼠标左键弹起时调用的函数。
具体的设计框架如图3-3所示:
头文件
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <tchar.h>
公有函数
CShape(void);
~CShape(void);
virtual void DrawShape(HDC hdc) = 0;
virtual void SetStartPoint(CPoint point);
virtual void SetEndPoint(CPoint point);
virtual void SetColor(COLORREF clr);
virtual void SetPensize(int pensize);
公有成员
int m_ptStartx;
int m_ptStarty;
int m_ptEndx;
int m_ptEndy;
COLORREF m_clr;
int m_pensize;
int m_PenStyle;
抽象类CShape
图3-3 hape.h的设计
3.4 由基类到派生类
派生类拥有基类的所有特征,并可以定义新的特征或对基类的一些特征进行重定义。本次设计运用单继承的方式,即派生类只有一个直接基类,三个派生类采用公有继承的方式。
派生类的对象的初始化由基类和派生类共同完成:基类的数据成员由基类的构造函数初始化,派生类的数据成员由派生类的构造函数初始化。
Shape.cpp实现对数据成员初始化:
//CShape类的构造函数
//CShape类的构造函数完成对鼠标按下的点和弹起的点进行赋值,初值为0。
CShape::CShape(void): m_ptStartx(0), m_ptStarty(0), m_ptEndx(0), m_ptEndy(0), m_nType(0),m_clr(RGB(0,0,0)) ,m_pensize(0)
{
}
Shape.cpp实现对鼠标按下和弹起时的坐标记录:
//CShape类的两个虚函数
//主要完成对鼠标按下和弹起时的坐标记录
void CShape::SetStartPoint(CPoint point)
{
m_ptStartx = point.x; //记录按下鼠标左键的x坐标
m_ptStarty = point.y; //记录按下鼠标左键的y坐标
}
void CShape::SetEndPoint(CPoint point)
{
m_ptEndx = point.x; //记录弹起鼠标左键的x坐标
m_ptEndy = point.y; //记录弹起鼠标左键的y坐标
}
正是因为抽象类CShape完成了对数据成员的初始化和对鼠标行动的坐标记录,使得能方便的实现多态性。
3.5虚函数和多态性
虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。通常此类指针或引用都声明为基类的,它可以指向基类或派生类的对象。
多态性是指:通过继承而相关的不同的类,它们的对象能够对同一个函数调用做出不同的响应。使用虚函数和多态性能够使成员函数的调用根据收到该调用的对象的类型产生不同的动作。
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。
在基类中实现纯虚函数的方法是在函数原型后“=0”。派生类中必须予以重写以实现多态性。
Shape.h中的纯虚函数:
virtual void DrawShape(HDC hdc) = 0;
3.6 利用VECTOR实现动态增长
3.6.1 STL介绍
STL是Standara Template Library(标准模板库)的简称,其中的部件包括有容器(container,储存任意类型对象的对象)和算法。STL 包含5 个主要的部分:
算法:能运行在不同容器上的计算过程。
容器:能够保留并管理对象的对象。
迭代器:算法存取容器的抽象,以便算法可以应用
在不同的容器上。
函数对象:定义了函数调用操作符(operator())的类。
适应器:封装一个部件以提供另外的接口。
本次设计主要用到顺序容器向量(vector),下面就仅向量(vector)做些阐述。
3.6.2 向量VECTOR
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
为了可以使用vector,在本次设计的MfcView.h文件中使用到两行代码:
#include <vector> //包含头文件
using namespace std; //使用全局的域名方式
所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。使用using namespace std,这样命名空间std内定义的所有标识符都有效。命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"。
本次设计的MfcView.h文件中使用如代码:
public:
vector<CShape*> m_ShapeArray;
即定义m_ShapeArray为CShape*类型的空的vector对象,vector添加数据的缺省方法是push_back()。
本次设计主要是利用vector来保存对象的数据,实现动态增长,从而减少以固定的数组类来保存可能造成的错误和空间浪费,以及代码的冗余。
3.7 选择画图工具
本次设计的画图工具为线、圆和方,因此在VC++编译环境的资源视图中Menu为IDR_MAINFRAME的主菜单添加了画图工具,如图3-4所示:
图3-4 添加画图工具
更改直线的ID为:IDM_DRAW_Line,圆的ID为:IDM_DRAW_ELLISPE,方的ID为:IDM_DRAW_RECTANGLE。并为各自添加事件处理程序,从而使得画图工具的选择有效。
3.8 鼠标左键按下的响应
每次用户鼠标左键按下,根据画图工具的选择,动态创建Cline,CEllipse,CRectangle类型的数据,并将记录下左键按下的点的坐标,将该点设为鼠标移动时的起点和终点。将鼠标移动的标志位设为TURE。
使用push_back()函数将数据添加到vector的尾部,并按需要来分配内存。使用SetStartPoint()函数将按下的点记录下来。
3.9 鼠标移动时的响应
鼠标移动时,必须做到动态显示要画的图形。此时需要涉及的问题就是如何画一个移动后的图形,并删除移动前的图形问题。
在鼠标移动时的响应中涉及到的概念有:CClientDC,SelectObject,SetROP2。
CClientDC dc(this);//this顾名思意就是这么,相当于一个本类的指针,一般指向本窗口或当前活动视图,即传递一个句柄给dc,this也可以说是你所定义的窗口类的指针。SelectObject(dc,GetStockObject(NULL_BRUSH));//屏蔽掉任何屏幕画刷,如果不添加这句的话,会出现图像覆盖问题。
不使用SelectObject(dc,GetStockObject(NULL_BRUSH))时,画图效果如图3-5所示:
图3-5 图像覆盖
使用SelectObject(dc,GetStockObject(NULL_BRUSH))时,画图效果如图3-6所示:
图3-6 图像不会覆盖
SetROP2(int nDrawMode) 该函数的主要的作用是根据nDrawMode设置的方式重新设定绘图的方式。本设计主要采用::SetROP2(dc,R2_NOT ) //当前绘制的像素值设为屏幕像素值的反,这样可以覆盖掉上次的绘图,(自动擦除上次绘制的图形)。
3.10 鼠标左键弹起时的响应
此时,需要记录左键弹起时的坐标,且绘制画的图形。将鼠标移动的标志位设为FALSE。
3.11 重要的ONPAINT
OnPaint是WM_PAINT消息的消息处理函数,在程序刚启动或被其它窗口覆盖,以及改变窗口大小并再次显示时调用。如果不在OnPaint()中添加相应的代码,画板上就会变的一片空白,因为并没有再调用什么代码。
利用size()函数,来一个for循环将容器内的对象一个个的调用,绘画出来,并添加代码来阻止图像覆盖现象的出现。
第4章 画板附加功能的设计
4.1 颜色功能
让画笔能使用各种颜色,本次设计主要采用RGB色彩标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的。
在菜单上添加颜色功能,如图4-1所示:
图4-1 添加颜色功能
本次采用弹出对话框的形式,让用户能够选择自己喜欢的颜色。弹出的对话框和自定义颜色如图4-2,4-3所示:
图4-2 颜色的弹出对话框
图4-3 选择自定义颜色
选择颜色后画图的效果,如图4-4所示:
图4-4 使用颜色的画图效果
4.2 粗细功能
谈到画笔的颜色和粗细,都必须说一下CPen类。画笔是绘图的基本工具,在MFC中画笔是CPen类的对象,它用来在DC上完成绘制线条的任务。初始化时,系统自动提供了一支黑色的默认画笔。利用该类,可以创建实线画笔,虚线画笔,点线画笔,点和虚线交替画笔,双点线画笔,内框线画笔,几何画笔,装饰画笔,设置其他像素的画笔,由用户提供的风格矩阵的画笔等等各种样式的画笔。在菜单上添加相应的选项,如图4-5所示:
图4-5 添加各种功能的画笔粗细和类型
利用画笔的粗细、类型和画笔颜色的不同画出来的实际效果如图4-6所示:
图4-6 绘画效果
4.3 保存功能
CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。
设计中用到CFileDialog来打开一个Windows常用的文件对话框,利用GetPathName()函数来获取要保存的路径,利用CFile来创建文件保存所绘画的图形。
本次设计指定保存为*.huang的格式。如图4-7所示:
图4-7 保存功能
4.4 打开功能
打开文件时,需要使用m_ShapeArray.clear()来将之前绘画的动态数据进行清空,然后执行OnPaint()函数使得画板上一片空白。再根据路径打开相应的文件,而且打开的文件必须是*.huang的格式。如图4-8所示:
图4-8 打开功能
第5章 结束语
这是一篇以毕业设计为内容的毕业论文,由于是纯代码出品的一个设计,既没有什么数据项可写,也没什么设计的逻辑原理可写,也很难像建一个数据库系统那样有很多的图可以显示,所以论文没有达到什么水平,只是写了些自己设计时的想法和步骤罢了。在整个设计的制作过程中,感觉最难的就是对很多的知识都不熟,想起以前编写学生信息管理系统,也是一头雾水的学着自己编写,但经过那次制作学生信息管理系统之后,确实觉得再写一个类似的什么什么系统的就轻松地多了。如今写了这个基于VC++的画板软件后,感觉也就是如果再写一个类似的,或有难度点的可能就不像第一次写那样难了。万事开头难,当积累了一些经验和熟悉了编译环境之后,自然以后再编写时的效率会提高很多。
对这次毕业设计得到的感悟是,万事开头难,但当你完成了一个开头之后,以后的路就渐渐的变的好走了。就像很多大学生刚毕业时,一个个不停的换工作,如果把一份工作的开头做好了,那么再换工作是没什么问题的。可我们刚毕业的学生一般是开头难,就去找找开头简单的吧。却没想过,一般情况下,只有当你把本工作做的好了,那么换另一个工作,你才会也做的很好。
毕业在即,希望每届毕业生都能走好自己的路,无论你的起步时走路,骑自行车,还是开轿车,方向是你是否走弯路的标准,坚持是你一直走下去的唯一力量。
致谢
感谢大学四年中教过我的老师们,在你们身上,也许我们四年中学到的,重要的不是知识,而是做人的道理。尤其感谢我的指导老师在毕业设计中给我的指导和帮助。老师曾对我说过,我不去做技术有点可惜。不知道,多年后,再回首,心情若何。毕业了,不再是那个在学校里,老师讲一堂课,我听一堂课的情况了。干一行,爱一行。也许我们所做的工作并非我们喜欢的,但请把它做好,尽职尽责是应该的。
感谢大学四年中相识的同学们,因为有你们,大学才过得有滋有味。今后的日子,联系必然是减少了,但记忆的深处总会常常想起,也总有再相聚的时候。
感谢学院,这个山清水秀的学校,仿佛度假般的让我度过了这大学四年。
感谢我的父母,千里之外,总能感受到父母之爱。不让父母失望,这该是我们子女的应尽职责,但我却没有尽力去做到。希望进入社会,能做好基本的职责,展望自己的未来吧。
参考文献
[1] 侯俊杰.深入浅出MFC(第2版)[M].武汉:华中科技大学出版社,2001:1-128
[2] Scott Meyers.More Effective C++中文版[M].北京:中国电力出版社,2003:1-50
[3] Robert B. Murray. C++编程惯用法[M].北京:中国电力出版社,2004:20-75
[4] Bjarne Stroustrup.The C++ Programming Language[M].北京:机械工业出版社,2002:28-56
[5] Scott Meyers.Effective C++[M] .北京:电子工业出版社.2006:35-49
[6] Matthew H. Austern.泛型编程与STL[M].北京:中国电力出版社,2003:68-88
[7] 姚领田,高守传. MFC窗口程序设计[M].北京:中国水利水电出版社,2007:3-46
[8] 任哲.MFC Windows应用程序设计(第2版)[M].北京:清华大学出版社,2007:40-75
[9] 潘嘉杰.易学C++[M].北京:人民邮电出版社.2008:14-19
[10] 屈磊,李媛媛.Visual C++开发入门与编程实践[M].北京:电子工业出版社,2007:1-88
[11] Bjarne Stroustrup. Sibling Rivalry: C and C++[J]. AT&T Labs.2002,2:1-15
[12] Daniel L R,Thomas W C,Chuan2Chin C.Statistics of cone responses to natural images:implications for visual coding [J].Optical Society of America.1998,15 (8) : 2036~2045
[13] Rafael C.Gonzalez,Richard E.Woods.Digital Image Processing,Second Edition [M]. BEIJING:Publishing House of Electronics Industry.2002,7:302-313
[14] G.Demoment.Image reconstruction and restoration:Overview of common estimation structures and problems[J].IEEE Trans.Aeoust,Speech Signal Processing. 1989,37(12):2024-2036
附录1 类的部分源代码
#pragma once
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <tchar.h>
class CShape
{
public:
CShape(void);
~CShape(void);
public:
virtual void DrawShape(HDC hdc) = 0;
virtual void SetShapeType(int nType) = 0;
virtual void SetStartPoint(CPoint point);
virtual void SetEndPoint(CPoint point);
virtual void SetColor(COLORREF clr);
virtual void SetPensize(int pensize);
public:
int m_ptStartx;
int m_ptStarty;
int m_ptEndx;
int m_ptEndy;
int m_nType;
COLORREF m_clr;
int m_pensize;
int m_PenStyle;
};
#include "StdAfx.h"
#include "Shape.h"
CShape::CShape(void): m_ptStartx(0), m_ptStarty(0), m_ptEndx(0), m_ptEndy(0), m_nType(0),m_clr(RGB(0,0,0)),m_pensize(1),m_PenStyle(0)
{
}
CShape::~CShape(void)
{
}
void CShape::SetStartPoint(CPoint point)
{
m_ptStartx = point.x;
m_ptStarty = point.y;
}
void CShape::SetEndPoint(CPoint point)
{
m_ptEndx = point.x;
m_ptEndy = point.y;
}
void CShape::SetColor(COLORREF clr)
{
m_clr = clr;
}
void CShape::SetPensize(int pensize)
{
m_pensize = pensize;
}
#pragma once
#include "shape.h"
class CLine :
virtual public CShape
{
public:
CLine(void);
~CLine(void);
void DrawShape(HDC hdc);
void SetShapeType(int nType);
};
#include "StdAfx.h"
#include "Line.h"
CLine::CLine(void)
{
}
CLine::~CLine(void)
{
}
void CLine::SetShapeType(int nType)
{
m_nType = nType;
}
void CLine::DrawShape(HDC hdc)
{
MoveToEx(hdc, m_ptStartx, m_ptStarty, NULL);
LineTo(hdc, m_ptEndx , m_ptEndy);
}
#pragma once
#include "shape.h"
class CEllipse :
virtual public CShape
{
public:
void DrawShape(HDC hdc);
CEllipse(void);
~CEllipse(void);
void SetShapeType(int nType);
};
#include "StdAfx.h"
#include "Ellipse.h"
CEllipse::CEllipse(void)
{
}
CEllipse::~CEllipse(void)
{
}
void CEllipse::SetShapeType(int nType)
{
m_nType = nType;
}
void CEllipse::DrawShape(HDC hdc)
{
Ellipse(hdc, m_ptStartx, m_ptStarty, m_ptEndx , m_ptEndy);
}
#pragma once
#include "shape.h"
class CRectangle :
virtual public CShape
{
public:
CRectangle(void);
~CRectangle(vo
展开阅读全文