现在大家已经知道Rectangle方法用来画正方形和矩形,Ellipse方法用来画圆和椭圆,MoveTo和LineTo方法则用来画线。 还有Arc方法用于画弧,Pie方法用于画饼形,一切一切都是非常基础的,没有太大的必要详细了解TCanvas的这些方法,下面开始更有趣的图形操作,这些图形操作在编写Delphi应用程序时很可能遇到。
绘制文本(Drawing Text)绘制文本听起来不像太难,是么?实际上有一些容易犯的小错误,如果不加注意,可能会使绘制文本变得很困难,另外有几条好的文本绘制特性应该了解。 1、TextOut与TextRect方法(The TextOut and TextRect Methods)TextOut方法是在画布上绘制文本的最基本的方法,关于TextOut没有太多可讲的,只需输入X,Y位置和要显示的文本——例如: Canvas.TextOut(20, 20, '最简单的文本输出'); 这个代码在窗体上位置20,20处显示指定的字符串。 X、Y坐标是指所要绘制文本的左上角而不是底线,为了说明这个意思,试验这段代码: Canvas.TextOut(20, 20, 'This is a text'); Canvas.MoveTo(20, 20); Canvas.LineTo(100, 20); 这段代码(20,20)处显示一些文字并从这个位置到(100,20)画线。如下图,显示了这段代码的执行结果。注意直线画在文本上部。 每当要显示文本时,使用TextOut不需要许多精确定位。 TextRect方法要求指定要显示的文本,还要指定剪切矩形框。当文本需要限制在一定的界域内时使用这种方法。落在界线外的文本均被剪掉,下面代码确保显示不超过100像素的文本。 Canvas.TextRect(Rect(20, 50, 120, 70), 20, 50, '这是非常长的一行文字,可能会被裁减掉'); 显示如下,因为字符串长度超过了100像素,因此被裁减掉了。 TextOut和TextRect都只能绘制单行文字,不能对文本进行换行。
2、文本背景(Text Backgrounds)改变文本背景颜色是非常容易的,因此可以这样做,如下代码: Canvas.Brush.Color := clWhite; 显示效果如下: 在进行设置背景色的时候应该养成这种习惯,即先存储先前的刷子类型,处理完文本后再恢复到原来的类型。代码如下: var OldStyle: TBrushStyle; OldColor: TColor; begin ClearCanvas; OldStyle := Canvas.Brush.Style; OldColor := Canvas.Brush.Color; Canvas.Brush.Color := clRed; Canvas.TextOut(20, 20, '现在文本的背景色为红色了'); Canvas.Brush.Style := OldStyle; Canvas.Brush.Color := OldColor; Canvas.TextOut(20, 50, '现在又恢复原始的样式了'); end; 显示效果如下: 如果要使用文本透明背景,可将刷子类型设置为bsClear。如下代码: Canvas.Brush.Style := bsClear; 使用透明背景还有其他好处,比如说要在图像背景上显示一些文本,在这种情况下,使用透明背景输出文本比较理想,代码如下: var OldStyle: TBrushStyle; Bitmap: TBitmap; begin Bitmap := TBitmap.Create; Bitmap.LoadFromFile('handshak.bmp'); Canvas.Draw(0, 0, Bitmap); Canvas.Font.Name := 'Arial Bold'; Canvas.Font.Size := 13; OldStyle := Canvas.Brush.Style; Canvas.Brush.Style := bsClear; Canvas.TextOut(20, 5, '透明背景色文本'); Canvas.Brush.Style := OldStyle; Canvas.TextOut(20, 30, '非透明背景色文本'); Bitmap.Free; end; 这个代码在窗体上画位图,之后在窗体位图上用透明背景绘制文本,在以常规样式绘制文本,效果如下: 3、DrawText函数(The DrawText Function)Windows API的DrawText函数提供了比TextOut更大的制作画布上的文本的控制能力,基于某种原因,TCanvas类没有DrawText方法。使用DrawText则意味着直接使用API。首先看一看一个基本的DrawText例子,然后再讲述这个函数的更多用途。 var R: TRect; begin R := Rect(20, 20, 220, 80); Canvas.Rectangle(20, 20, 220, 80); DrawText(Canvas.Handle, 'An example of DrawText.', -1, R, DT_SINGLELINE or DT_VCENTER or DT_CENTER); end; 下图显示了该代码结果以及下面几个例子的结果。 首先TRect记录利用Windows API Rect函数初始化。之后,一个规则的矩形绘制于画布上(矩形画于画布上以便可以设想所要画的矩形大小)。最后,调用DrawText函数绘制文本。 //DrawText函数的声明如下: DrawText( hDC: HDC; {设备句柄} lpString: PChar; {文本} nCount: Integer; {要绘制的字符个数; -1 表示全部} var lpRect: TRect; {矩形结构} uFormat: UINT {选项} ): Integer; {返回文本高度} 下面详解讨论下函数的各种参数,如下所示:
前面的例子说明了DrawText函数一个最为普遍的用途;使文本水平居中、垂直居中等。在自制组件时这个特性非常有用。特别地,自制列表框、组合框和菜单经常需要使文本居中。现在可能不会马上认识到这个函数的好处。但是,若开始做自制组件时或者开始写自己的图形组件时,就会认识到这一点。 DrawText另一个有趣的标志是DT_END_ELLIPSIS标志,如果文本太长不能套入指定矩形中,Windows将截取部分字符串,末尾加上省略号,表示字符串被截取,例如,下面的代码: var R: TRect; begin R := Rect(20, 20, 120, 70); DrawText(Canvas.Handle, 'This text is too long to fit', -1, R, DT_END_ELLIPSIS); end;这段执行后,结果文本显示如下图: 如果矩形内文本可能太长的话,可以使用这种标志。
DT_CALCRECT是又一个非常有用的标志,它用来计算容纳指定文本所需的矩形高度。当使用这个标志时,Windows计算所需高度,并返回这个高度,但不绘制文本。用户告诉Windows矩形框应多宽,Windows将告诉用户容纳的文本所需矩形多高。事实上,Windows也修改矩形的bottom和left值。绘制多行文本时,这显的尤为重要。 下列程序例子询问Windows要包含所有文本所需的矩形框多高。之后,在屏幕上画出矩形框,最后文本绘制在矩形框中。代码如下: var R: TRect; S: string; begin R := Rect(20, 20, 150, 30); S := 'This is a very long string which will' + 'run into multiple lines of text.'; DrawText(Canvas.Handle, PChar(S), -1, R, DT_CALCRECT or DT_WORDBREAK); Canvas.Brush.Style := bsSolid; Canvas.Rectangle(R); Canvas.Brush.Style := bsClear; DrawText(Canvas.Handle, PChar(S), -1, R, DT_WORDBREAK); end;最后运行该代码,效果如下: 注意,必须将DrawText的第二个参数由string类型转化为PChar类型,这是因为DrawText需要的参数是指向字符数组的指针,而不是字符串类型本身。 将上面的代码进行多次执行,每次修改显示的字符串长度。不管怎么增加字符,矩形框总能准确框住文本。
DrawText函数是一个非常有用并且功能强大的函数,当编写自己组件时,毫无疑问,这种函数将经常被使用。 以上代码均在Delphi7下测试通过,示例代码下载:GDI之绘制文本.rar |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论