点击下载

Download Report

Transcript 点击下载

第5章
图形/图像处理
学习目标

了解GDI+新增的基本知识

掌握GDI+程序的开发过程

掌握使用画笔绘制图形的编程方法

了解创建字体并能够显示文本的编程方法

掌握图像的基本处理方法
5.1 图形/图像的基本概念

图形指的是一种矢量结构的画面存储形式 ,是使用计算机绘
制图形的表现方式
 如直线、矩形、圆、三维立体造型等

图像则是栅格结构的画面存储形式
 如用照相机、摄像机、扫描仪捕捉到的图案,也可以是
手工绘制的图画作品

最常见的两种图像文件类型
 位图——把一幅图像分成许多很小的像素,然后再把这
些像素组成图案。
 矢量图——用数学的方法来描述一幅图,再将其转化为
相应的一个个数学表达式,然后对其进行显示。
5.2 GDI+编程基础

GDI+是Windows XP操作系统、Windows 2003操作系统的
图形引擎,负责在屏幕和打印机上显示和打印信息。

GDI+是一个应用程序接口,通过一组C++类来提供接口的
功能。
5.2.1 GDI+概述

GDI+实际上是GDI的高层次的一种封装类,主要用来服务
于图形、图像和文本的输出。

GDI+的内容主要由以下几方面构成:
 1.二维几何图形的处理
 矢量图形的绘制与显示使用的类包括:矩形类Rect
,画笔类Pen,
图形类Graphics ,画刷类Brush
 2.显示图像
 缓存位图类CachedBitmap提供对位图的快速访问与显示
 3.排版
GDI+提供了大量的函数来完成各种不同风格的文
本输出。
使用GDI+编程时 只需要简单地创建一个
Graphics(图形)对象,然后分别调用该
Graphics对象的成员函数,便能完成大部分的绘
图操作。
GDI和GDI+区别:
GDI是基于句柄的, GDI+是基于对象模型的
例:从窗口的点(10,10)到点(200,10)之间画
一条宽度为5红色的直线。
5.2.3 GDI+程序的开发步骤

建立一个GDI+程序分4个步骤:
 在项目中引入GDI+的头文件,使用GDI+的命名空间。
 初始化GDI+系统资源。
 使用完毕后,释放GDI+所使用的资源。
 在编译时加入GdiPlus.Lib库文件。

【例5-1】编写一个GDI+程序MyGDIplus,在屏幕上输出
“现在开始编写GDI+程序”。程序的运行结果下图所示。
图5-1 MyGDIplus的运行结果

程序的实现过程如下:
 (1)利用MFC应用程序向导新建一个单文档应用程序
MyGDIplus
 (2)在程序中使用GDI+命名空间
 (3)GDI+资源的初始化与销毁
 (4)在编译时加入GdiPlus.Lib库文件
 (5)修改视图类的OnDraw函数
5.2.4 Graphics类

Graphics类是GDI+程序设计的核心,能够完成大部分的绘
图、文本输出、几何图形的填充及坐标系统的转换等各种操
作。

Graphics类的构造函数: 设备环
境句柄
 Graphics(HDC hdc);
设备句
柄
 Graphics(HDC hdc,HANDLE hdevice);
图像对
 Graphics(Image* image); 象
 Graphics(HWND hwnd,BOOL icm);
窗口句
柄
是否使用色
彩配置文件
校正色彩

Graphics类中常用的绘图和填充函数如下表所示
函数名称
说明
Clear
用背景色填充整个绘图表面.背景色是在函数调用中指定的
DrawArc
绘制—个椭圆弧。该圆弧是椭圆的一部分——指定Pen对象、椭
圆的包含矩形以及起始角和椭圆弧包含的角度
DrawBezier
绘制一条贝塞尔曲线。这条曲线在两个指定的端点之间绘制,其
曲率由另外两个指定的控制点来控制。因此,需要指定—个
Pen对象、两个端点和两个控制点
DrawCurve
绘制—条基本曲线。这类似于绘制一条这样的曲线;取某一柔软
材科的一段,使之通过一系列固定点
DrawEllipse
绘制—个椭圆。必须指定一个Pen对象和椭圆的包含矩形
DrawIcon
在指定的Icon对象中绘制图像
DrawImage
在绘图表面的指定区域绘制全部或部分指定的Image对象
DrawLine
在两个指定的点之间,使用指定Pen对象绘制一条直线
DrawPath
使用指定Pen对象绘制一条由GraphicsPath对象表示的路径
函数名称
说明
DrawPie
绘制饼图。这需要指定一个Pen对象,一个包含矩形和表示
饼圆弧的两个角度
DrawPolygon
使用指定的Pen对象绘制多边形,该多边形用一个点的数组
来表示
DrawRectange
使用指定的Pen对象绘制指定的矩形
DrawString
以指定的字体,在指定包含矩形中绘制指定的文本字符串
FillClosedCurve
使用指定的Brush对象填充指定封闭的基本样条曲线的内部
区域
FillEllipse
使用指定的Brush对象填充指定椭圆的内部区域
FillPath
使用指定的Brush对象填充出GraphicsPath对象表示的路径
FillPie
使用指定的Brush对象填充饼图的内部区城
FillPolygon
使用指定的Brush对象填充多边形的内部区域,该多边形是
用一个点的数组来表示的
FillRectange
使用指定的Brush对象填充矩形的内部区域
FillRectanges
使用指定的Brush对象填充矩形集的内部区域
FillRegion
使用指定的Brush对象填充Region对象的内部区域
5.2.5 色彩的使用

GDI+的色彩表示法

RGB
 基本原理是使用不同强度的红、绿和蓝色光强度来组
合成各式各样的色彩

CYMK
 基本原理是使用青、洋红、黄色、黑色4种色彩来合
成其它色彩

Color类的构造函数分别为:
 Color();
 Color(BYTE a,BYTE r,BYTE g,BYTE b);
 Color(BYTE r,BYTE g,BYTE b);
 Color(ARGB argb);

参数说明:
 a表示色彩的透明度(0~255)。
 r、g、b表示红绿蓝3种色彩分量值(0~255)。

GDI+在对色彩支持方法主要体现在对色彩的透明度(Alpha)
支持

它包括4个方面的信息:红、绿、蓝3种基准色和透明度,每
个信息用8位来表示

透明度的计算公式
 输出色彩=前景色×Alpha/255+背景色×(255-Alpha)/255
5.3 画笔和画刷

5.3.1 使用画笔
 1.画笔的创建
 (1)Pen(const
Color &color, REAL width)
 这个构造函数创建一个宽度为width,颜色为color的画笔,默认
情况下,宽度为1。
创建一个宽度为2的蓝色画笔:
Pen pen(Color(0,0,255),2)
 (2)Pen(onst Brush *brush, REAL width);
 这个构造函数使用指定的画刷来创建一个画笔,默认情
况下,宽度为1。
 创建一个宽度为2的蓝色画笔:
 SolidBrush
brush(Color(0,0,255));
 Pen pen(&brush,2)

2.画笔的属性
 (1)画笔的线型
 使用Pen类的成员函数SetDashStyle可以设置画笔的线型,
该函数原型如下:
 Status
SetDashStyle(DashStyle dashStyle)
 DashStyle枚举中提供了5个常见的画笔线型风格,它主要
定义了实线、虚线、点线、点划线、双点划线以及自定
义的线型
 DashStyle枚举的定义如下:
typedef enum {
DashStyleSolid = 0,
//实线
DashStyleDash = 1,
//虚线
DashStyleDot = 2,
//点线
DashStyleDashDot = 3,
//点划线
DashStyleDashDotDot = 4, //双点划线
DashStyleCustom = 5
//自定义线型
} DashStyle

Pen类的成员函数SetDashPattern可以使用一个预定义的数
组来描述画笔的虚实,这个数组的格式为:
 [画线部分长度,间隔部分长度,画线部分长度,间隔部
分长度,……]
 数组的大小由用户自定义。SetDashPattern函数用于设置
线型风格,该函数原型如下:
 Status SetDashPattern(const REAL *dashArray,
INT count);
 参数说明:
 dashArray是一个预定义的数组
 count表示数组中元素的个数

【例5-2】编写一个单文档应用程序Mypenstyle,用于显示
不同线型的画笔画出的直线。程序的运行结果如下图所示
图5-3 Mypenstyle的运行结果

程序的实现过程如下:
 (1)利用MFC应用程序向导新建一个单文档应用程序
Mypenstyle
 (2)在程序中使用GDI+命名空间
 (3)GDI+资源的初始化与销毁
 (4)在编译时加入GdiPlus.Lib库文件
 (5)修改视图类的OnDraw函数
 (2)画笔的对齐方式
 在GDI+中,Pen类的成员函数SetAlignment用于设置
画笔的对齐方式,该函数原型如下:
 Status SetAlignment(PenAlignment penAlignment);
 其中PenAlignment是一个枚举,它定义了画笔的对齐
方式,该枚举的定义如下:
typedef enum {
PenAlignmentCenter = 0, //居中,默认对齐方式
PenAlignmentInset = 1
//嵌入
} PenAlignment;

【例5-3】编写一个单文档应用程序Mypenalign,用于显示
不同的对齐方式。程序的运行结果如下图所示。
图5-4 Mypenalign的运行结果

程序的实现过程如下:
 (1)利用MFC应用程序向导新建一个单文档应用程序
Mypenalign
 (2)在程序中使用GDI+命名空间
 (3)GDI+资源的初始化与销毁
 (4)在编译时加入GdiPlus.Lib库文件
 (5)修改视图类的OnDraw函数
 (4)画笔的透明度
 透明度是相对于背景色而言的,线条透明度越大,背
景的可见度就越大。
 在GDI+中之所以能够实现透明的效果,是因为它对色
彩的定义使用了ARGB的方式。
 创建带透明度的画笔,本质上就是设置画笔的色彩并
在色彩中加入透明度
 GDI+对线条透明度的支持主要是采用对画笔透明度的
支持来实现的。

【例5-5】编写一个单文档应用程序Mypenalpha,用于表现
画笔的透明度。程序的运行结果如下图所示。
图5-6 Mypenalpha的运行结果

程序的实现过程如下:
 (1)利用MFC应用程序向导新建一个单文档应用程序
Mypenalpha
 (2)在程序中使用GDI+命名空间
 (3)GDI+资源的初始化与销毁
 (4)在编译时加入GdiPlus.Lib库文件
 (5)修改视图类的OnDraw函数
5.3.3 绘制基本图形

1.绘制直线
 Graphics类提供的函数DrawLine能够完成直线的绘制操
作,该函数原型如下:
 Status
DrawLine(const Pen *pen,const Point &pt1, const
Point &pt2);
 Status DrawLine(const Pen *pen,const PointF &pt1, const
Point &pt2);
 Status DrawLine(const Pen *pen,REAL x1,REAL y1,
REAL x2,REAL y2);
 Status DrawLine(const Pen *pen,INT x1,INT y1, INT x2,
INT y2);

2. 绘制矩形
 Graphics类的DrawRectangle函数能够完成矩形的绘制,
该函数原型如下:
 Status
DrawRectangle(const Pen *pen,const Rect &rect);
 Status DrawRectangle(const Pen *pen, INT x,INT y,
INT width,INT height);
 Status DrawRectangle(const Pen *pen,REAL x, REAL y,
REAL width,REAL height);
 Status DrawRectangle(const Pen *pen,const RectF &rect);
 GDI+还提供了一次绘制多个矩形的函数DrawRectangles,
该函数原型如下:
 Status
DrawRectangles(const Pen *pen,const Rect *rects,
INT count);
 Status DrawRectangles(const Pen *pen,const RectF *rects,
INT count);

3. 绘制多边形
 Graphics类的DrawPo1ygon函数提供了对多边形绘制的
支持,该函数原型如下:
 Status DrawPolygon(const Pen
*pen,const Point *points,
INT *count);
 Status DrawPolygon(const Pen *pen,const PointF *points,
INT *count);

4. 绘制曲线和贝塞尔曲线
 绘制曲线
 利用Graphics对象的成员函数DrawCurve或
DrawClosedCurve函数可以进行曲线的绘制 。
DrawCurve()常用的定义如下:
DrawCurve(Pen* pen,Point* points,INT count);
DrawCurve(Pen* pen,Point* points,INT count,
REAL tension);
 绘制贝塞尔曲线
GDI+提供的DrawBezier函数可以实现贝塞尔曲线的绘
制,该函数原型如下:
 Status
DrawBezier(const Pen *pen,const POINT &pt1,const
POINT &pt2,const POINT &pt3,const POINT &pt4);
 Status
DrawBezier(const Pen *pen,const
POINTF &pt1,const POINTF &pt2,const POINTF &pt3,const
POINTF &pt4);
 Status
DrawBezier(const Pen *pen,REAL x1, REAL y1,
REAL x2,
REAL y2,REAL x3,REAL y3,REAL x4,REAL y4);
 Status
DrawBezier(const Pen *pen,INT x1,INT y1, INT x2,
INT y2,INT x3,INT y3,INT x4,INT y4);

5. 绘制弧线
 GDI+的DrawArc函数用于绘制弧线,该函数原型如下:
 Status
DrawArc(const Pen *pen,const Rect &rect,
REAL startAngle,REAL sweepAngle);
 Status
DrawArc(const Pen *pen,const RectF &rect,
REAL startAngle,REAL sweepAngle);
 Status
DrawArc(const Pen *pen,REAL x, REAL y,
REAL width,
REAL height,REAL startAngle,
REAL sweepAngle);
 Status
DrawArc(const Pen *pen,INT x,INT y,
INT width,
INT height, REAL startAngle,
REAL sweepAngle);

6. 绘制扇形
 GDI+的DrawPie函数用于绘制扇形,该函数原型如下:
 Status
DrawPie(const Pen *pen,const Rect &rect,
REAL startAngle, REAL sweepAngle);
 Status
DrawPie(const Pen *pen,INT x,INT y,
INT width, INT height, REAL startAngle,
REAL sweepAngle);
 Status
DrawPie(const Pen *pen,REAL x,REAL y,
REAL width,
REAL height,REAL startAngle,
REAL sweepAngle);
 Status
DrawPie(const Pen *pen,const RectF &rect,
REAL startAngle, REAL sweepAngle);

7.绘制椭圆
 GDI+的DrawEllipse函数用于绘制扇形,该函数原型如下:
 Status
DrawEllipse(const Pen *pen,const Rect &rect);
 Status
DrawEllipse(const Pen *pen,REAL x,REAL y,
REAL width,REAL height);
 Status
 Status
DrawEllipse(const Pen *pen,const RectF &rect);
DrawEllipse(const Pen *pen,INT x,INT y,
INT width, INT height);

【例5-10】编写一个单文档应用程序Mybasegraph,显示线
段、折线、矩形和扇形等基本图形并进行填充。程序的运行
结果如下图所示。
图5-11 Mybasegraph的运行效果

程序的实现过程如下:
 (1)利用MFC应用程序向导新建一个单文档应用程序
Mybasegraph
 (2)在程序中使用GDI+命名空间
 (3)GDI+资源的初始化与销毁
 (4)在编译时加入GdiPlus.Lib库文件
 (5)修改视图类的OnDraw函数
5.4 文本与字体

GDI+提供了几个用于绘制文本的类:
 FontFamily(字体系列)
 Font(字体)
 StringFormat(字符串格式)
 InstalledFontCollection(已安装字体信息)
 PrivateFontCollection(私有字体信息)。
5.4.1 使用GDI+字体

1.LOGFONTA --描述字体信息的指针:
typedef struct {
LONG lfHeight;
//字高
LONG lfWidth;
//字宽
LONG lfEscapement;
//字体旋转角度
LONG lfOrientation;
//字体方向
LONG lfWeight;
//字体的轻重
BYTE lfItalic;
//是否斜体
BYTE lfUnderline;
//是否有下划线
BYTE lfStrikeOut;
//是否有强调线
BYTE lfCharSet;
//字符集
BYTE lfOutPrecision;
//输出精度
BYTE lfClipPrecision;
//剪裁精度
BYTE lfQuality;
//输出质量
BYTE lfPitchAndFamily;
//间距和字体系
列
CHAR lfFaceName[LF_FACESIZE]; //字体名
} LOGFONTA;

2. LOGFONTW
 LOGFONTW也是描述字体信息的指针,它的数据成
员与LOGFONTA的数据成员基本相同,只是数据成
员lfFaceName的类型不同。
 LOGFONTA的数据成员lfFaceName是单字节(CHAR)
数组,而LOGFONTW的数据成员lfFaceName是双字
节(WCHAR)数组。

3.字体的大小单位枚举Unit
 GDI+中用Unit描述字体使用的不同单位,定义如下:
typedef enum {
UnitWorld = 0,
//世界坐标,非物理上的单位
UnitDisplay = 1, //使用和输出设备相同的单位
UnitPixel = 2,
//像素
UnitPoint = 3,
//点(磅),1点=1/72英寸
UnitInch = 4,
//英寸
UnitDocument = 5, //1/300英寸
UnitMillimeter = 6 //毫米
} Unit;

4.字体风格枚举FontStyle
 GDI+中使用FontStyle枚举列出了常见的字体风格,定义
如下:
typedef enum {
FontStyleRegular = 0,
//常规
FontStyleBold = 1,
//加粗
FontStyleItalic = 2,
//倾斜
FontStyleBoldItalic = 3, //粗斜
FontStyleUnderline = 4, //下划线
FontStyleStrikeout = 8 //强调线
} FontStyle;
5.4.2 Font类

GDI+使用Font类来定义一个字体对象。Font类的构造函数
如下:
 Font(const FontFamily *family, REAL emSize, INT style,
Unit unit);
 Font(const WCHAR *familyName, REAL emSize,
INT style, Unit unit,const FontCollection *fontCollection);
 Font(HDC hdc,const HFONT hfont);
 Font(HDC hdc,const LOGFONTA *logfont);
 Font(HDC hdc,const LOGFONTW *logfont);
 Font(HDC hdc);
5.4.3 字体系列类FontFamily


GDI+使用4种风格来形成字体系列
 规则(Regular)
 黑体(Bold)
 斜体(Italic)
 粗斜体(Bold Italic)
在GDI+中输出文本之前,需要构造一个FontFamily对象和
一个Font对象。FontFamily类的构造函数定义为:
 FontFamily( );
 FontFamily(const WCHAR *name,const
FontCollection *fontCollection);

【例5-11】编写一个单文档应用程序Myfont,用于显示输出
多种字体和风格表示的“学习使用GDI+的字体!”。程序
的运行结果如下图所示。
图5-12 Myfont的运行效果

程序的实现过程如下:
 (1)利用MFC应用程序向导新建一个单文档应用程序
Myfont
 (2)在程序中使用GDI+命名空间
 (3)GDI+资源的初始化与销毁
 (4)在编译时加入GdiPlus.Lib库文件
 (5)修改视图类的OnDraw函数
5.4.4 绘制文本

在GDI+中可以使用DrawString函数进行文本的显示输出,
该函数原型如下:
 Status DrawString(const WCHAR *string, INT length,
const Font *font,const RectF &layoutRect, const
StringFormat *stringFormat,const Brush *brush);
 Status DrawString(const WCHAR *string, INT length,
const Font *font,const PointF &origin,const
Brush *brush);
 Status DrawString(const WCHAR *string, INT length,
const Font *font,const PointF &origin,const
StringFormat *stringFormat, const Brush *brush);
1.格式化文本输出

指向
StringFormat
对象的指针
StringFormat对象的建立可以在其构造函数中进行:
 StringFormat(const StringFormat *format);
 StringFormat(INT formatFlags, LANGID language);
格式标志
字符使用的语
音标识符号
 枚举StringFormatFlags列出了常见的文本格式标记,常用
的枚举成员含义如下:

StringFormatFlagsDirectionRightToLeft:从右至左输出文本。

StringFormatFlagsDirectionVertical:垂直方向输出文本。

StringFormatFlagsNoWrap:输出时不使用自动换行功能。

StringFormatFlagsNoClip:不使用剪裁。

【例5-12】编写一个单文档应用程序Mytextformat,用于格
式化输出文本“锄禾日当午,汗滴禾下土。谁知盘中餐,粒
粒皆辛苦。”。程序的运行结果如下图所示。
图5-13 Mytextformat的运行效果

程序的实现过程如下:
 (1)利用MFC应用程序向导新建一个单文档应用程序
Mytextformat
 (2)在程序中使用GDI+命名空间
 (3)GDI+资源的初始化与销毁
 (4)在编译时加入GdiPlus.Lib库文件
 (5)修改视图类的OnDraw函数
2.设置文本对齐方式

GDI+主要通过StringFormat类的两个成员函数设置文本的对齐方式,
对齐方式
这两个函数的原型定义如下:
的描述
 Status SetAlignment(StringAlignment align);
 Status SetLineAlignment(StringAlignment align);
文本的对齐方式
说明
StringAlignmentNear
靠近
StringAlignmentCenter
靠中
StringAlignmentFar
靠远
文本的对齐方式

【例5-13】编写一个单文档应用程序Mytextalignment,使用
不同的对齐方式输出文本“锄禾日当午,汗滴禾下土。谁知
盘中餐,粒粒皆辛苦。”和“天生我材必有用,千金散尽还
复来。”。程序的运行结果如下图所示。
图5-14 Mytextalignment的运行效果

程序的实现过程如下:
 (1)利用MFC应用程序向导新建一个单文档应用程序
Mytextalignment
 (2)在程序中使用GDI+命名空间
 (3)GDI+资源的初始化与销毁
 (4)在编译时加入GdiPlus.Lib库文件
 (5)修改视图类的OnDraw函数
3.使用画刷绘制文本

【例5-14】编写一个单文档应用程序Mytextbrush,使用不
同的画刷填充文本“好好学习”。程序的运行结果如下图所
示。
图5-15 Mytextbrush的运行效果

程序的实现过程如下:
 (1)利用MFC应用程序向导新建一个单文档应用程序
Mytextbrush
 (2)在程序中使用GDI+命名空间
 (3)GDI+资源的初始化与销毁
 (4)在编译时加入GdiPlus.Lib库文件
 (5)修改视图类的OnDraw函数
5.5 图像的处理

5.5.1 图像和位图
 GDI+提供了用与光栅图像(位图)和矢量图像(图元文
件)的类Image。
 Bitmap类和Metafile类都是从Image类继承而来的。
 Bitmap类通过提供用于装入、保存和操纵光栅图像的附加方法
扩展了Image类的能力。
 Metafile类通过提供用于记录与检查矢量图像的附加方法扩展了
Image类的能力。
5.5.2 图像的基本操作

1.图像的打开
 在Image类的构造函数中,可以直接加载图片供用户使用,
构造函数原型如下:
 Image(IStream *stream,BOOL useEmbeddedColorMana
gement);
 Image(const WCHAR *filename,
BOOL useEmbeddedColorManagement);

2.图像的显示
 GDI+主要使用DrawImage函数完成图像的显示,
DrawImage函数共有18种,具体可参看MSDN。


3.图像的剪裁与缩放
 图像的剪裁与缩放就是对图片输出的范围和大小进
行设置。剪裁就是输出图片的部分内容,而缩放就
是指调整显示区域的大小。

【例5-15】编写一个单文档应用程序Myimage,用于图像的
剪裁与缩放。程序的运行结果如下图所示。
图5-16 Myimage的运行效果

程序的实现过程如下:
 (1)利用MFC应用程序向导新建一个单文档应用程序
Myimage
 (2)在程序中使用GDI+命名空间
 (3)GDI+资源的初始化与销毁
 (4)在编译时加入GdiPlus.Lib库文件
 (5)修改视图类的OnDraw函数

4.控制图形的缩放质量
 GDI+中可以使用插补模式(也叫插值模式)控制图形的
缩放质量。
 所谓插补模式是指如何计算两个终结点之间的中间值。
 Graphics对象的插补模式影响图像缩放的质量。
 拉伸图像时,原始图像中的每个像素都必须映射为较大
图像中的一组像素。
 收缩图像时,必须将原始图像中承租的像素映射为较小
图像中的单个像素。

【例5-16】编写一个单文档应用程序Myimagemode,使用不
同的插植模式控制图像的缩放质量。程序的运行结果如图下
所示。
图5-17 Myimagemode的运行效果

程序的实现过程如下:
 (1)利用MFC应用程序向导新建一个单文档应用程序
Myimagemode
 (2)在程序中使用GDI+命名空间
 (3)GDI+资源的初始化与销毁
 (4)在编译时加入GdiPlus.Lib库文件
 (5)修改视图类的OnDraw函数

【例5-17】编写一个单文档应用程序Myimagerotate,显示
经过不同的旋转方式后的图像,程序的运行结果如下图所示。
图5-18 Myimagerotate的运行效果

程序的实现过程如下:
 (1)利用MFC应用程序向导新建一个单文档应用程序
Myimagerotate
 (2)在程序中使用GDI+命名空间
 (3)GDI+资源的初始化与销毁
 (4)在编译时加入GdiPlus.Lib库文件
 (5)修改视图类的OnDraw函数
5.6 综合实例:画图程序的设计

【例5-18】创建一个画图程序Mypaint,该程序的功能是实
现根据选择的线型和线宽绘制直线。该程序的实际效果如下
图所示。
图5-19 程序Mypaint的实际效果

程序的实现过程如下:
 (1)利用MFC应用程序向导新建一个单文档应用程序
MyPaint
 (2)在程序中使用GDI+命名空间
 (3)GDI+资源的初始化与销毁
 (4)在编译时加入GdiPlus.Lib库文件
 (5)添加菜单资源
 (6)在视图类的头文件中添加一些成员变量
 (7)在视图类中添加公有成员函数Draw用于绘制直线
 (8)在视图类中添加消息处理函数OnLButtonDown和
OnLButtonDown
 (9)添加菜单的消息处理函数