在 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