《图形与多媒体应用》由会员分享,可在线阅读,更多相关《图形与多媒体应用(140页珍藏版)》请在金锄头文库上搜索。
1、第4章 图形与多媒体应用,4.1 图形对象与方法 4.2 常用图形、图像控件 4.3 Paint和Mouse事件 4.4 播放声音文件4.5 MediaPlayer组件 习题,4.1 图形对象与方法,4.1.1 Canvas 与Pixels对象 BCB中,像TForm、TPanel和TBitBtn这一类可以在其表面上绘图的组件都具有Canvas (画布)属性,所有的绘图操作都被认为是作用在对象的画布(Canvas)上。Canvas本身也是一个对象,属于TCanvas类。使用Canvas的优点之一,是可以用统一的方法处理各种对象(包括屏幕、打印机、元文件等)上的图形操作。,在Windows下可以
2、根据硬件的性能将显示器设置为16色、256色、16位增强色和24位真彩色等模式。在使用24位真彩色时,每一种颜色可以用R、G、B三个非负整数表示。这三个整数都是小于等于255的(即可以用一个字节表示),它们分别代表红、绿、蓝三种基本色成分在该颜色中所占的比重,用这种方法表示的颜色有时又简称为RGB颜色。当显示模式不是24位真彩色时,某些RGB颜色就无法显示。但Windows从兼容性考虑,仍允许用户使用所有的RGB颜色,但在实际显示时将不能显示的颜色替换为某个与该RGB颜色最接近的可显示颜色。,BCB为RGB颜色定义了一个专门的类型TColor。此外,还定义了一批颜色常量。这些常量都是以小写字母
3、cl开头的,它们是:,clAqua(浅蓝)、clBlack(黑色)、clBlue(蓝色)、clDkGray(深灰)、clFuchsia(紫红)、clGray(灰色)、clGreen(深绿)、clLime(柠檬绿)、clLtGray(浅灰)、clMaroon(褐红)、clNavy(深蓝)、clOlive(橄榄绿色)、clPurple(紫色)、clRed(红色)、clSilver(银灰)、clTeal(绿灰)、clWhite(白色)和clYellow(黄色)等18种常见颜色以及clWindow、clMenu、clCaptionText和clBackground等若干系统配色。,除了使用颜色常量外,
4、还可以用BCB预定义宏RGB将三个颜色分量转换为TColor类型。例如,RGB (255,0,0) 是红颜色,RGB (255,255,0) 是黄颜色。 显示器或打印机上最小的显示单位是像素,像素是有一定大小的。通常在Windows下可设置屏幕具有640480、800600或1024768等不同的的分辨率,其中的数字就代表了屏幕上水平和垂直方向的像素数目。Canvas所具有的Pixels属性就是用来操纵像素的,它是一个二维数组,数组的下标表示像素的坐标,数组的元素是属于TColor类型的。,读者可尝试在一个简单项目中执行下列代码,以帮助领会本小节的内容。由于代码较简单,这里不作解释。 for
5、(int i=0; i=ClientWidth-1; i+) for (int j=0; jPixelsij = RGB (i, j, (i+j) /2);,4.1.2 Pen和Brush属性 Canvas上的许多绘图方法都需要使用两件基本绘图工具Pen(笔)和Brush(画刷)。BCB将它们定义成Canvas对象的属性,它们的类型分别是TPen和TBrush。 TPen类对象主要用于画线,它有Width、Color和Style等属性,分别表示笔的宽度、颜色和线型。笔的宽度也就是用笔画出的线宽度,单位是像素,缺省值为1。可以使用的线型有psSolid、psDash、psDot、psDashDo
6、t、psDashDotDot和psClear。其中,psSolid指实线,为缺省定义的线型;psClear使笔划不出现,仅用于特殊目的;其余都是某种类型的虚线,其中有的虚线仅在笔的宽度为1时有效。,TBrush类对象则用于填充背景,它有Color和Style等属性,分别表示画刷的颜色和填充模式。可以使用的填充模式有bsSolid、bsCross、bsClear、bsDiagCross、bsBDiagonal、bsHorizontal、bsFDiagonal和bsVertical。其中,bsSolid为实心填充,为缺省定义的模式;bsClear为无背景填充(透明);其余都是采用某种线纹进行背景填
7、充。 TCanvas类有一个PenPos 属性用于为该画布的Pen对象在画布上保存一个当前位置,它是TPoint类型的值。TCanvas对象创建时,PenPos属性被初始化为(0,0)。 下面一个例子用于帮助读者理解Pen和Brush的各种属性。,【例4-1】 Form1中放三个按钮、两个单选项组、一个编辑框和一个颜色对话框。Button1、Button2分别用于对Pen和Brush设置颜色;RadioGroup1、RadioGroup2分别用于选择Pen和Brush的Style属性;Edit1用于输入Pen的Width属性;点击Button3时会在Form1左上部画一个矩形。该矩形的边框使用
8、Pen的属性绘出,内部使用Brush的属性填充。 该程序运行时的画面如图4-1所示,画面显示的Pen-Style属性为psDot(点虚线),Brush-Style为bsCross(方格线)时的情况。,图4-1 Pen和Brush的属性,下面是该程序中的事件代码,仅供读者参考。void_fastcall TForm1:Button1Click (TObject *Sender) if (ColorDialog1-Execute ( ) Canvas-Pen-Color = ColorDialog1-Color;/-void_fastcall TForm1:Button2Click (TObjec
9、t *Sender) if (ColorDialog1-Execute ( ) Canvas-Brush-Color = ColorDialog1-Color;,/-void_fastcall TForm1:Button3Click (TObject *Sender) for (int i=0; i=200; i+) for (int j=0; jPixelsij = clBtnFace; Canvas-Rectangle (20,20,180,180);/-void_fastcall TForm1:Edit1Exit (TObject *Sender) Canvas-Pen-Width =
10、StrToInt (Edit1-Text); ,/-void_fastcall TForm1:RadioGroup2Click (TObject *Sender) switch (RadioGroup2-ItemIndex) case 0: Canvas-Brush-Style = bsSolid; break; case 1: Canvas-Brush-Style = bsCross; break; case 2:,Canvas-Brush-Style = bsClear; break; case 3: Canvas-Brush-Style = bsDiagCross ; break; ca
11、se 4: Canvas-Brush-Style = bsBDiagonal; break;,case 5: Canvas-Brush-Style = bsHorizontal; break; case 6: Canvas-Brush-Style = bsFDiagonal; break; case 7: Canvas-Brush-Style = bsVertical;,/-void_fastcall TForm1:RadioGroup1Click (TObject *Sender) switch (RadioGroup1-ItemIndex) case 0: Canvas-Pen-Style
12、 = psSolid; break; case 1: Canvas-Pen-Style = psDash; break; case 2: Canvas-Pen-Style = psDot;,break; case 3: Canvas-Pen-Style = psDashDot; break; case 4: Canvas-Pen-Style = psDashDotDot; break; case 5: Canvas-Pen-Style = psClear; ,程序中,当点击Buttons时,先执行如下程序段: for (int i=0; i=200; i+) for (int j=0; jPi
13、xelsij = clBtnFace; 清除前一次所画的内容,clBtnFace是Form1缺省的颜色。也许这不是一个聪明的做法,但在此处是有效的。 Canvas-Rectangle (20,20,180,180); 调用画布的Rectangle方法画矩形,该矩形的边框用Pen绘制,矩形内部则使用Brush填充,该方法在4.1.4节中介绍。,4.1.3 MoveTo与LineTo方法 MoveTo方法在BCB中的声明如下: void_fastcall MoveTo (int X, int Y); 该方法将画布的PenPos 属性设置为(X,Y),也即改变了Pen的当前位置。 LineTo方法在BCB中的声明如下: void_fastcall LineTo (int X, int Y);,该方法可在画布上以PenPos为起点,以(X,Y)为终点画一线段。LineTo画线所用的笔是由Canvas的Pen属性设定的。因此,改变Canvas的Pen属性能使LineTo画出各种不同的宽度、颜色和线型的线段。LineTo在画线的同时也把PenPos位置移到了(X,Y)。 LineTo通常要和MoveTo方法配合使用。例如,要画从(X1,Y1)到(X2,Y2)的线段,可以连续执行以下两个语句: Canvas-MoveTo (X1, Y1); Canvas-LineTo (X2, Y2);,