向上帝打申请了,下辈子再也不做程序员!! 上帝批复:OK!

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, 因为它相当于一个内存画板, 双倍缓存就得用它.

posted @ 2009-03-17 17:12  zywuhao  Views(1205)  Comments(0)    收藏  举报