TFONT 类 、TPen 类、TBrush 类 、图像类
----TFONT 类
//先来个例子: procedure TForm1.FormPaint(Sender: TObject); const S = '万一的 Delphi 博客'; var font: TFont; begin font := TFont.Create; font.Name := '微软雅黑'; font.Style := [fsBold, fsItalic]; font.Color := clRed; font.Height := 72; Canvas.Font := font; Canvas.TextOut(10, 10, S); font.Free; end;
//效果图:
//因为 Canvas 的 Font 属性就是 TFONT 类的一个实例, 所以上面的程序可以简化为: procedure TForm1.FormPaint(Sender: TObject); const S = '万一的 Delphi 博客'; begin Canvas.Font.Name := '微软雅黑'; Canvas.Font.Style := [fsBold, fsItalic]; Canvas.Font.Color := clRed; Canvas.Font.Height := 72; Canvas.TextOut(10, 10, S); end;
//TFont 类的常用属性: {Name: 字体名称} {Color: 颜色} {Size、Height: 字号与字体高度, 都可以设定字体大小} {Style: 字体样式; 是个集合值, 是下面可选值或它们的组合:} fsBold fsItalic fsUnderline fsStrikeOut {Pitch: 是字间距相关的, 有三个枚举值可选(不过我没测试出效果):} fpDefault fpVariable fpFixed {Charset: 字符集, 是个整数, 可能的值有:} ANSI_CHARSET = 0; DEFAULT_CHARSET = 1; SYMBOL_CHARSET = 2; SHIFTJIS_CHARSET = 128; HANGEUL_CHARSET = 129; GB2312_CHARSET = 134; CHINESEBIG5_CHARSET = 136; OEM_CHARSET = 255; JOHAB_CHARSET = 130; HEBREW_CHARSET = 177; ARABIC_CHARSET = 178; GREEK_CHARSET = 161; TURKISH_CHARSET = 162; VIETNAMESE_CHARSET = 163; THAI_CHARSET = 222; EASTEUROPE_CHARSET = 238; RUSSIAN_CHARSET = 204; {Orientation: 旋转角度, 单位是 1/10 度, 举个例子:} //代码: const S = '万一的 Delphi 博客'; begin Canvas.Font.Style := [fsBold]; Canvas.Font.Color := clRed; Canvas.Font.Height := 32; Canvas.Font.Orientation := 450; Canvas.TextOut(0, ClientHeight-20, S); end;
//效果图:

--TPen 类(上)
//TPen 的主要属性有四: Color、Width、Style、Mode {Color: 颜色} {Width: 宽度; 默认是 1; 如果赋予 <= 0 的值, 会使用默认值} {Style: 样式; Delphi 定义了笔样式枚举 TPenStyle, 包含以下样式:} psSolid = 0; {实线} psDash = 1; {段线; 要求笔宽<=1} psDot = 2; {点线; 要求笔宽<=1} psDashDot = 3; {线、点; 要求笔宽<=1} psDashDotDot = 4; {线、点、点; 要求笔宽<=1} psClear = 5; {不可见} psInsideFrame = 6; {实线; 但笔宽是向里扩展} psUserStyle = 7; {自定义, Delphi.Net 支持} psAlternate = 8; {交替, Delphi.Net 支持}
//下面的例子依次展示了各种样式: var i,x,y,n: Integer; begin x := 10; y := 15; n := ClientWidth - 2*x; Canvas.Pen.Color := clRed; for i := 0 to 8 do begin Canvas.Pen.Style := TPenStyle(i); Canvas.MoveTo(x, y); Canvas.LineTo(x + n, y); y := y + 15; end; end;
//效果图:
{Mode: 画笔与背景的颜色混合模式; Delphi 定义了模式枚举 TPenMode, 包含以下模式:} pmBlack {总是黑色} pmWhite {总是白色} pmNop {画笔无效} pmNot {背景色取反} pmCopy {画笔设置的颜色} pmNotCopy {画笔颜色取反} pmMergePenNot {画笔颜色与背景颜色的反色的组合} pmMaskPenNot {画笔颜色与背景公共色的反色的组合} pmMergeNotPen {画笔颜色取反后与背景颜色的组合} pmMaskNotPen {画笔的反色与背景的公共色的组合} pmMerge {画笔颜色与背景颜色的组合} pmNotMerge {pmMerge 的反色} pmMask {画笔与背景公共颜色的组合} pmNotMask {pmMask 的反色} pmXor {画笔颜色与背景颜色的 Xor 组合} pmNotXor {pmXor 的反色}
//颜色模式测试程序: var i,x,y,w,n: Integer; begin {先画竖的颜色背景} x := 0; y := 0; w := ClientWidth div 18; for i := 0 to 18 do begin Canvas.Brush.Color := PaletteIndex(i); Canvas.FillRect(Rect(x, y, x+w, ClientHeight)); x := x + w; end; {再按不同模式依次画 16 条红色的横线} x := 0; y := 20; n := ClientWidth; Canvas.Pen.Width := 4; Canvas.Pen.Color := clRed; for i := 0 to 15 do begin Canvas.Pen.Mode := TPenMode(i); Canvas.MoveTo(x, y); Canvas.LineTo(x + n, y); y := y + 20; end; end;
//效果图:

--TPen 类(下) : 学习橡皮线
//奇妙的异或运算, 就这些简单的代码, 反复点击按钮... procedure TForm1.Button1Click(Sender: TObject); begin Canvas.Pen.Color := clYellow; {指定笔颜色为黄色} Canvas.Pen.Width := 20; {笔宽 20} Canvas.Pen.Mode := pmXor; {指定画笔模式为: 画笔色与背景色的异或运算} {画线} Canvas.MoveTo(0,0); Canvas.LineTo(ClientWidth,ClientHeight); end;
//效果图:
//做一个橡皮线的示例: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); end; var Form1: TForm1; implementation {$R *.dfm} var x1,y1,x2,y2: Integer; {直线两个端点的坐标} f: Boolean; {判断鼠标是否点下} procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin x1 := X; y1 := Y; x2 := X; y2 := Y; Canvas.Pen.Color := clRed; Canvas.Pen.Width := 2; Canvas.Pen.Mode := pmXor; f := True; end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if f then begin {擦除} Canvas.MoveTo(x1, y1); Canvas.LineTo(x2, y2); x2 := X; y2 := y; {重绘} Canvas.MoveTo(x1, y1); Canvas.LineTo(x2, y2); end; end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if f then begin {画出确定的线} Canvas.Pen.Mode := pmCopy; Canvas.MoveTo(x1, y1); Canvas.LineTo(x2, y2); f := not f; end; end; end.
//效果图:
TBrush 类
//画刷类 TBrush 有三个重要属性: Color、Style、Bitmap. {Style: 样式; Delphi 为画刷定义了样式枚举 TBrushStyle, 包含以下样式:} bsSolid bsClear bsHorizontal bsVertical bsFDiagonal bsBDiagonal bsCross bsDiagCross
//下面小程序展示了上面的其中填充样式: var i,n: Integer; r: TRect; begin Canvas.Pen.Color := clRed; Canvas.Pen.Width := 1; n := 10; for i := 0 to 7 do begin Canvas.Brush.Color := clYellow; Canvas.Brush.Style := TBrushStyle(i); r := Rect(n, 10, n+36, ClientHeight-10); Canvas.FillRect(r); Canvas.Rectangle(r); n := n + 48; end; end;
//效果图:
//使用画刷的 Bitmap 属性则可以使用图片填充. procedure TForm1.FormClick(Sender: TObject); var bit: TBitmap; begin bit := TBitmap.Create; bit.LoadFromFile('c:\temp\bg.bmp'); Canvas.Brush.Bitmap := bit; Canvas.Ellipse(0, 0, ClientWidth, ClientHeight); bit.Free; end;
//效果图:

图像类
Delphi 的 Graphic 单元有五个重要的图像类: TGraphic、TBitmap、TMetafile、TIcon、TPicture.
TBitmap 用来操作位图;
TMetafile 用来操作图元文件;
TIcon 用来操作图标(包括鼠标指针)文件;
TBitmap、TMetafile、TIcon 都是 TGraphic 的子类, 由于
TCanvas.Draw(X, Y: Integer; Graphic: TGraphic); 的第三个参数就是 TGraphic 类型,
所以它们都可以通过 TCanvas.Draw 输出.
如果三种图像都要容得下, 就得用 TPicture 类, 它即包含 Bitmap、Metafile、Icon 对象属性, 也包含 Graphic 对象属性; TImage 类呢又包含 Picture 属性, 所以可以用 TImage 显示所以这些图像格式.
这其中, 我最喜欢的类当属 TBitmap, 因为它相当于一个内存画板, 双倍缓存就得用它.

浙公网安备 33010602011771号