ok
C++Builder图形、图像及实例
. 内容提要:本文介绍了图形的绘制和图像处理,其中详细介绍了画布(Canvas)的属性与使用 方法,利用它们,可以非常直观方便地绘制直线、曲线、矩形、椭圆等各种图形。本文还介绍了图 像处理的方法,其中包括 Image组件、TBitmap类和 TJPEGImage类的使用,而要进行快速的图像 处理,几乎都离不开 ScanLine技术。使用 ScanLine技术,能够快速取得 bitmap的每行的颜色值, 而无需使用 Canvas的 Pixels属性逐点获取像素点的颜色值。
关键字:C++Builder、图形、图像、画布
w et
引言:自 Windows诞生以来,可以通过 GDI(Graphics Device Interface)来实现图形的绘制。
然而对于初学者来说,庞大复杂的 GDI绘图系统是一个难以跨越的学习障碍。所幸的是,在
C++Builder绘图系统中,提供了一个简易可行的画布( Canvas),可以用非常直观的方式来实现
Windows下的绘图功能。C++Builder提供了 Image组件,可以很方便地装载图像,以及进行图像处 理。
正文:
1在窗体上作图
1.1知识要点
1.画布( Canvas)
在 C++Builder中,几乎所有的可视化组件(包括:Form、Image、Bitmap、PaintBox)都包含
Canvas属性。Canvas包含了许多和绘图有关的性质,如 Pen、Brush、Pixels、Font等,另外它还包
含了各种绘图的函数,如 LineTo、Rectangle、MoveTo、Polygon等。
(1)Canvas类主要属性有: Font:画布绘制文本所用的字体。
Brush:用于填充背景的画笔刷。 Pen:用来画线和描述图形轮廓的画笔。 PenPos:当前绘图位置的坐标。 Pixels:画布像素数组。 (2)Canvas类主要方法有: Arc:用当前画笔在画布上画圆弧。
Chord:绘制由直线和椭圆相交而成的一个封闭形状。 CopyRect:将图形的一部分从另一个画布复制过来。 Ellipse:在给定的区域绘制椭圆。
FillRect:用当前画刷填充指定的矩形。 FloodFill:用当前画刷填充指定的区域。
(3)LineTo类主要方法有: MoveTo:连同 LineTo绘制直线。
Polyline:绘出一系列的线,串起所传入的各个点。 Rectangle:绘制圆角矩形。 TextOut:在画布上写出字符串。
TextRect:在限定的区域写出字符串,区域之外的字符串不会被显示出来。 2.颜色常数
Polygon:绘出一系列的线,串起所传入的各个点,并从最后一点到第一点绘制一条线。
StretchDraw:在画布上给定的大小绘制图像。
在 C++Builder中提供了许多颜色的预定常数,这些预设颜色都以 cl(cl代表 color)为启始字
※ 1※
o
符命名。例如 clRed代表红色,clBlue代表蓝色,clGreen代表绿色等等。另外 C++Builder也将 Windows
的基本颜色以常数定义,如 clWindow及 clMenu分别代表 Window及 Menu(菜单)的颜色。
下面列出部分 C++Builder定义的颜色常数:
cn ok
clBlack:黑色。 clGreen:绿色。 clOlive:橄榄绿。 clNavy:海蓝色。 clPurple:紫色。 clTeal:青紫色。 clGray:灰色。 clSilver:银色。 clRed:红色。 clLime :灰绿色。
clBlue:蓝色。
clAqua:淡绿青色。 clWhite:白色。
clBackground:Window背景色。 clActiveCaption:活动视窗的标题色。 clInactiveCaption:非活动视窗的标题色。 clMenu:Menu的颜色。
clWindow:Windows的背景色。 clMenuText:Menu 文字的颜色。 clWindowText:Window内文字的颜色。 clCaptionText:标题文字的颜色。
clActiveBorder:活动视窗的边界颜色。 clHighlight:高亮度 Windows颜色。 clHightlightText:被选取文字的颜色。 clGrayText:灰色文字的颜色。 clBtnText:Button内文字的颜色。 Canvas -> Pixels [3][5]=clBlue;
以下的程序表示将画布中(3,5 )这一像素点的颜色设为蓝色: 另外,也可以利用以下的叙述来设定画笔的颜色为蓝色: Canvas->Pen->Color=RGB(0,0,255); 3. RGB函数
任何一种颜色都是由红、绿、蓝三种基本色构成的。RGB函数是 Windows系统用以表示颜色
的方式,它们用三个字节型参数变量,分别代表红色(Red)、绿色( Green)及蓝色(Blue)的强度 值(0~255之间),组合起来表示颜色。例如 RGB(255,0,0)代表红色(RGB(255,0,0)所代表的 颜色和颜色常数 clRed是相同的)。
如果 RGB函数中的三个参数相同,即红、绿、蓝的强度值一样,则其代表的颜色是黑白的。 例如 RGB(255,255,255)代表白色,RGB( 0,0,0)代表黑色。
4. Tcolor类 如:
Tcolor是表示颜色的类,其实例可以是 clRed、clBlue、clGreen等刚才介绍到的颜色常数,例 Tcolor color=clRed;
也可以使用 RGB函数来取值,例如:
※ 2※
o
(4, 34, 253); Tcolor color= RGB
5. Pen和 Brush
cn ok
Tpen是在 Canvas画线所使用的“笔”,因此所有和线条有关的绘图函数都会受 Tpen影响,如 LineTo、Ellipse、Polygon、PolyLine、Rectangle等函数都使用“笔”来画线,可以利用 Canvas.Pen 来存取 Pen,并且可以修改 Pen的性质,这些性质包含 Color、Width、Style,以及 Mode等。Style 属性用来设置画笔样式:
表示破折线+点线;=psClear表示透明线。
Pen->Style=psSolid,表示画笔是实心; =psDash表示破折线; =psDot表示点线; =psDashDot
Width属性用来设置画笔的宽度,Pen->Width=5表示画笔的宽度为 5个像素。
Color属性用来设定画笔的颜色。例如:Canvas->Pen->Color=clBlue;则表示将画笔的颜色设为 蓝色。Tbrush可用来在 Canvas的特定区域下着色。和 Tpen不同的是,Tbrush可以用不同的颜色、 样式及图案来填满 Canvas的特定区域,而 Tpen则是用来在 Canvas上画线。
Tbrush的 Style属性有 bsHorizontal、bsVertical、bsFDiagonal、bsBDiagonal、bsCross、bsDiagCross 几种,分别代表实心、透明、水平线、垂直线、左上到右下的斜线,左下到右上的斜线、垂直交叉
线、对角交叉线这几种填充方案。
其中 bsClear为默认值。
Tbrush的 Color属性设定与 Pen的 Color属性相一致。 6.常用的绘图函数
1)Canvas->MoveTo(int X, int Y);
函数用法:
MoveTo是用以在使用 LineTo之前设定画笔位置。使用此函数和直接设定 Canvas的 PenPos属 性的效果相同。
2)Canvas->LineTo(int X, int Y);
函数用法:
LineTo函数用来从画笔位置画一条至(X,Y)点的直线,此直线不包含(X,Y)点,同时将
画笔位置移至(X,Y)。所画的直线形状与 Pen的属性一致。
3)Canvas->Ellipse(int X1,int Y1,int X2,int Y2);
函数用法:
利用 Ellipse可在 Canvas上画出圆形或椭圆形。其环绕矩形的左上角坐标为(X1,Y1)而右下 角坐标为(X2,Y2)。若该矩形为正方形,则所绘图形为圆形。当此椭圆形绘制时,使用 Pen的值 画出其外框,而使用 Brush值填满其内部。
4)Canvas->Rectangle(int X1, int Y1, int X2,int Y2);
函数用法:
在 Canvas 上画出一矩形。其矩形的左上角坐标为(X1,Y1),而右下角坐标为(X2,Y2),矩
形内部的填充效果根据画刷的类型确定。
5)Canvas->Refresh()
函数用法: 清除画布。
1.2实例制作——用鼠标随意作图
1.程序设计思路
所谓在窗体上任意作图,就是要用鼠标在窗体上弹起弹落来确定所要画图形的起始位置,并设
定好 Pen和 Brush的各种属性,可在窗体上绘制直线、矩形、椭圆等图形。
2.程序实现步骤
※ 3※
(1)打开 C++Builder,生成一个新的应用程序,在工程中加入的组件如表 1所示。
o
加入的组件
Form cn w. ww Name Caption Name Name Caption Name Caption Name
ok 属性值 Form1 用鼠标随意作图 ColorDialog1 Button1 终止绘图 Button2 画直线 说明 表 1 工程中加入的组件及其属性 属性 .n ok et ColorDialog Button Button Button Button Caption Name Button3 画椭圆 Button4
bo
w. Caption 画矩形
Button Name .n Caption Button5 GroupBox Name 清屏 Caption GroupBox1 下面的组件放置在 Edit Name 画笔设定 GroupBox1 上面 Text Edit1 1 RadioButton Name Caption RadioButton1 RadioButton Name psSolid RadioButton2 Caption RadioButton Name psDash Caption RadioButton3 psDot RadioButton Name RadioButton4 bo Caption psDashDot Button Name Button6
Caption 颜色设置
GroupBox Name GroupBox2 下面的组件放置在
Caption 画刷设定 GroupBox2 上面
RadioButton Name RadioButton5 Caption bsSolid
RadioButton Name RadioButton6
Caption bsClear
RadioButton Name RadioButton7
Caption bsHorizontal
RadioButton Name RadioButton8 Caption bsVertical
Button Name Button7
Caption 颜色设置 设置好的程序界面如图 1所示。 w
w
o ok et
w .c
图 1 程序界面
※ 4※
o .n et et
ok
cn
w et
ok
.c .
(2)定义全局变量:
int sort,ox,oy; //sort代表要绘制图形的类别,ox、oy表示鼠标按下去时的坐标位置 (3)在生成窗体事件中初始化 sort,编写代码如下:
void __fastcall TForm1:: FormCreate(TObject *Sender)
{
sort=0; //表示不绘制图形 }
(4)设定画笔的宽度、颜色、形状。
编写代码如下:
(TObject *Sender) void __fastcall TForm1::Button6Click
{
if(ColorDialog1->Execute()) {
TColor pencolor;
Canvas->Pen->Color=ColorDialog1->Color; //设定画笔颜色 } }
void __fastcall TForm1::RadioButton1Click(TObject *Sender) {
Canvas->Pen->Style=psSolid ; //设定画笔为实线 }
void __fastcall TForm1::RadioButton2Click(TObject *Sender) {
Canvas->Pen->Style=psDash ; //设定画笔为破折线
}
cn ok
void __fastcall TForm1::RadioButton3Click(TObject *Sender) {
Canvas->Pen->Style=psDot; //设定画笔为点线 }
void __fastcall TForm1::RadioButton4Click(TObject *Sender)
{
//设定画笔为点线+破折线 Canvas->Pen->Style=psDashDot ;
}
void __fastcall TForm1::Edit1Change(TObject *Sender) {
Canvas->Pen->Width=StrToInt(Edit1->Text); //设定线宽
}
)设定画刷的颜色、形状,编写代码如下: (5
void __fastcall TForm1::Button7Click(TObject *Sender) {
if(ColorDialog1->Execute())
{ TColor pencolor;
Canvas->Brush->Color=ColorDialog1->Color; //设定画刷的颜色
}
}
void __fastcall TForm1::RadioButton5Click(TObject *Sender)
{
Canvas->Brush->Style=bsSolid; //设定画刷为实心
※ 5※
o