第8讲 绘图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第8讲绘图
Windows是一个图形操作系统。
传统的Windows程序设计方法在处理有关图形的设计时,多是按照自Windows诞生以来的方法——图形设备接口GDI来进行的。
C++ Builder 的VCL对庞大繁杂的GDI绘图系统进行了良好的封装,提供了简便易用的TCanvas画布类,使得在Windows中进行图形编程变得简单。
1 颜色表示
根据颜色的RGB三基色模型,自然界中任何一种颜色都可以用红、绿、蓝三种基本色来表示。
在计算机程序中,对于最常用的24位色,红、绿、蓝每种分量各占一个字节即8位的存储空间,它们的取值范围都是0~255,共可组合出256*256*256=16777216种颜色。
因为颜色可由一个三元的矢量(R,G,B)来表示,所以三元组合(0,0,0)用来表示黑色,因为所有颜色的强度都为0;而三元组合(255,0,0)用来表示红色;(255,255,0)用来表示黄色(红+绿=黄)。
在程序中使用颜色的方法有两种:
●使用C++ Builder提供的宏“RGB()”
例如绿色可以表示为RGB(0,255,0),白色可以表示为RGB(255,255,255)等。
●使用Graphic.hpp中定义的一些颜色常量
例如clBlack、clGreen、clLime、clOlive、clRed等。
2 TCanvas画布常用属性
TCanvas画布的属性非常多,而且它的许多属性本身又是一个对象,这些对象又包含了许多各自的子属性。
2.1 画笔属性
TCanvas的画笔属性(Pen)是一个TPen对象。
它设置了在使用画布进行画线时,画笔的宽度、颜色、线型和绘图模式。
●Width属性
该属性用于确定画笔的宽度,默认值为1。
可以按如下代码设置笔的宽度为5:Canvas->Pen->Width = 5;
●Color属性
该属性用于确定画笔的颜色,默认值为黑色。
可以按如下代码设置笔的颜色为蓝色:
Canvas->Pen->Color = clBlack;
或
Canvas->Pen->Color = RGB(0,0,255);
●Style属性
该属性确定画笔画线的各种类型。
线的类型如下表所列:
2.2 画刷属性
TCanvas的画刷属性(Brush)是一个TBrush对象,它封装了Windows的刷子对象,可以用颜色和图案来填充矩形、多边形和圆等。
可以使用画刷的Color属性设置画刷的颜色或使用画刷的Bitmap属性设置画刷的填充图案,Bitmap属性是一个TPicture对象,它是一个位图。
2.3 字体属性
TCanvas的字体属性(Font)是一个TFont对象,它设置了在画布上输出文字时的字体。
字体属性常用的属性有字体颜色、大小、样式和字体名称。
●Name属性
此属性用于设置字体的名称,如Arial、Times New Roman、宋体等。
可以按如下代码设置画布的字体名称:
Canvas->Font->Name = "宋体";
●Size属性
此属性用于设置字体的大小。
●Style属性
此属性用于设置字体的样式,它是枚举的数据类型。
可用的Style属性有fsBold(黑体)、fsItalic(斜体)、fsUnderline(下划线)和fsStrikeOut(删除线)等。
2.4 像素属性
TCanvas的像素属性(Pixel)是一个TColor对象,它设置了画布上某点的颜色。
例如可设置画布上坐标为(50,50)处的像素点的颜色为红色,可以使用如下代码:
Canvas->Pixel[50][50] = clRed;
下面的代码用来在窗体上画一个255*255大小的彩色正方形:
void __fastcall TForm1::FormClick(TObject *Sender)
{
for(int i=0; i<255; i++)
{
for(int j=0; j<255; j++)
{
Form1->Canvas->Pixels[i][j] = RGB(i, j, (i+j)/255);
}
}
}
程序运行结果如下图所示:
3 TCanvas画布常用方法
TCanvas用于画图的方法较多,可以大致将它们分为四种类型:画线、画填充图形、文本输出和图形拷贝。
3.1 画线
TCanvas提供了强大的画线功能,利用TCanvas的画线方法可以绘制直线,椭圆的弧线和贝塞尔曲线等。
●画直线
绘制直线涉级到两个方法:MoveTo和LineTo。
⏹MoveTo(int x, int y)
MoveTo(x,y)将画笔的位置移动到(x,y)坐标处。
⏹LineTo(int x, int y)
LineTo(x,y)以画笔的当前位置为起点,画一条直线到(x,y)处。
使用如下的代码,绘制四叶草曲线:
void __fastcall TForm1::FormClick(TObject *Sender)
{
int x1, y1, x2, y2;
this->Canvas->Pen->Color = clTeal;
for(int i=0; i<720; i++)
{
double A,E;
A = i * M_PI/360;
E = 80*(1 + sin(4*A));
x1 = 150 + E*cos(A);
x2 = 150 + E*cos(A + M_PI/5);
y1 = 150 + E*sin(A);
y2 = 150 + E*sin(A + M_PI/5);
this->Canvas->MoveTo(x1, y1);
this->Canvas->LineTo(x2, y2);
}
this->Caption = "四叶草";
}
程序运行结果如下图所示:
PS:
为了使用正弦和余弦函数,需要在程序头部包含math头文件:#include <math.h>;
M_PI是math.h中定义的一个宏:#define M_PI 3.14159265358979323846。
VC++ 6.0提供的math.h文件中并没有关于M_PI的定义,需要注意。
●椭圆曲线
●贝塞尔曲线
●多边形曲线
3.2 填充图形
●绘制矩形
可以使用Rectangle方法来绘制矩形。
Rectangle的四个参数为(int x1,int y1,int x2, int y2),其中x1和y1为矩形的左上角坐标,x2和y2为矩形的右下角坐标。
●绘制由矩形限定的图形
⏹Ellipse,椭圆
⏹RoundRect,圆角矩形
⏹Chord,弦
⏹Pie,饼图
●绘制多边形
使用Polygon方法可以绘制多边形。
此方法在画布绘制一系列的点,各点依次连成线,最后将首尾两点相接形成一个区域,并最后用当前画刷填充此区域。
Polygon的两个参数为(TPoint* Points, int Points_Size),其中Points为一个TPoint
结构的数组,而Points_Size指定了点的数目。
使用如下的代码,绘制五角星:
void __fastcall TForm1::FormClick(TObject *Sender)
{
TPoint Points[5];
Points[0] = Point(100, 0);
Points[1] = Point(41, 181);
Points[2] = Point(195, 69);
Points[3] = Point(5, 69);
Points[4] = Point(159, 181);
Form1->Canvas->Brush->Color = clRed;
Form1->Canvas->Polygon(Points, 5);
Form1->Caption = "五角星";
}
程序运行结果如下图所示:
3.3 文本输出方法
●输出文本
TCanvas最基本的文本输出方法是TextOut方法。
TextOut方法的三个参数为(int x, int y, AnsiString Text),其中x和y用来指定文本输出的起始位置,Text为输出字
符串的内容。
3.4 图形拷贝方法
利用TCanvas的图形拷贝方法可以将其它画布的图像拷贝到它自己的绘制表面。
图形拷贝主要有CopyRect方法和Draw方法。
●CopyRect
CopyRect方法可以实现两个Canvas之间任意两个矩形之间的拷贝。
CopyRect 方法的参数为(TRect &Dest, TCanvas* Canvas, TRect& Source),其中,Canvas为源
画布,Source为源画布上要复制的图像区域,Dest为目标画布上将接受复制图像
的矩形区域。
●Draw
Draw方法用于在画布上输出图像。
Draw方法的参数为(int x, int y, TGraphic* Graphic),其中,x和y为输出图像的起点坐标,Graphic是一个图形对象。
●StretchDraw
StretchDraw方法用于在画布上输出图像。
StretchDraw方法的参数为(TRect& Rect, TGraphic* Graphic),其中,Rect为待显示图像的目标区域,Graphic
是一个图形对象。