第8讲 绘图

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

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为矩形的右下角坐标。

●绘制由矩形限定的图形

相关文档
最新文档