随笔 - 2146  文章 - 97 评论 - 11767 trackbacks - 253


在 DelphiX 中, 所能看到的一般都是画在 TDXDraw.

TDXDraw 默认两个绘图表面: TDXDraw.Surface 和 TDXDraw.Primary;
一般先在后台(Surface)绘图, 然后再用 TDXDraw.Flip 命令切换前后台, 从而看到绘制效果.

TDXDraw.Flip 会置换 Surface 和 Primary 两个对象, 所以我们尽可以只在 Surface 上绘图;
由于 DirectX 的工作机制, 让这个切换速度异常地快(只是切换一个指针), 从而可以完成非常流畅的动画、游戏.

从 TDXDraw 的绘图表面也可以获取 Canvas 对象, 因而在 TDXDraw 中也可以使用 GDI/GDI+ 的绘图命令;
不过把 GDI/GDI+ 和 DirectX 一起使用应该会让 DirectX 的性能缩水, 但有这种可能总是好的, 起码比单独使用 GDI/GDI+ 要好.

下面例子中就使用了 DXDraw1.Surface.Canvas 对象;
使用完 DXDraw1.Surface.Canvas 后, 一定要释放(DXDraw1.Surface.Canvas.Release);

另外, 绘图前经常要先用指定的颜色填充表面, 譬如: DXDraw1.Surface.Fill(颜色值);
这里的颜色格式和 Delphi 的不一样, 和 HTML 使用的颜色值的顺序是一样的, 譬如: $FF0000 表示红色.

本例效果图:



代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DXDraws;

type
  TForm1 = class(TForm)
    DXDraw1: TDXDraw;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  str: string;
begin
  str := FormatDateTime('h:n:s:zz', Time); {获取当前时间, 精确到毫秒}
  DXDraw1.Surface.Fill($FF0000); {填充为红色, 注意这个颜色格式是和 HTML 的颜色顺序一样的}
  DXDraw1.Surface.Canvas.Brush.Style := bsClear;
  DXDraw1.Surface.Canvas.Font.Color := clYellow;
  DXDraw1.Surface.Canvas.Font.Size := 16;
  DXDraw1.Surface.Canvas.TextOut(10, 10, str);
  DXDraw1.Surface.Canvas.Release; {释放 Canvas 对象}
  DXDraw1.Flip;
end;

{这和上面的功能一样, 只是简化了写法}
procedure TForm1.Button2Click(Sender: TObject);
var
  str: string;
begin
  str := FormatDateTime('h:n:s:zz', Time);
  DXDraw1.Surface.Fill(0); {填充黑色}
  with DXDraw1.Surface.Canvas do begin
    Brush.Style := bsClear;
    Font.Color := clLime;
    Font.Size := 16;
    TextOut(10, 10, str);
    Release; {释放 Canvas 对象}
  end;
  DXDraw1.Flip;
end;

end.


窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 127
  ClientWidth = 201
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object DXDraw1: TDXDraw
    Left = 8
    Top = 8
    Width = 185
    Height = 81
    AutoInitialize = True
    AutoSize = True
    Color = clBlack
    Display.FixedBitCount = False
    Display.FixedRatio = True
    Display.FixedSize = True
    Options = [doAllowReboot, doWaitVBlank, doCenter, do3D, doDirectX7Mode, doHardware, doSelectDriver]
    SurfaceHeight = 81
    SurfaceWidth = 185
    TabOrder = 0
    Traces = <>
  end
  object Button1: TButton
    Left = 30
    Top = 95
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 118
    Top = 95
    Width = 75
    Height = 25
    Caption = 'Button2'
    TabOrder = 2
    OnClick = Button2Click
  end
end

posted on 2009-01-12 16:52  万一  阅读(...)  评论(...编辑  收藏