首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

DelphiX 教學 (21):TDirectDrawSurface 繪圖指令完整解析與實戰應用

     編輯:Delphi

TDirectDrawSurface 提供了一組底層繪圖指令,雖然功能強大但使用門檻較高,必須在 Lock/UnLock 之間操作,且座標系統與色彩格式需特別注意。本文系統整理所有繪圖方法並提供實戰範例。

繪圖指令完整清單

方法功能說明備註
PokeLine繪製直線基本線條繪製
PokeLinePolar極座標繪線角度+長度方式
PokeBox繪製矩形框僅邊框
PokeBlendPixelAlpha 混合像素單點半透明
PokeCircle繪製圓形圓周線條
PokeEllipse繪製橢圓橢圓周線條
PokeFilledEllipse繪製實心橢圓填滿內部
PokeWuLineWu 抗鋸齒線條平滑邊緣
PokeVLine垂直線快速繪製優化垂直線
DoRotate表面旋轉整體旋轉操作

像素存取屬性差異

  • Pixel[x, y]:單像素讀寫,**必須在 Lock/UnLock 之間**使用,速度較快。
  • Pixels[x, y]:單像素讀寫,**不能在 Lock 狀態下**使用,內部自動處理鎖定,適合零星存取。

隨機畫線動畫範例

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    DXDraw1: TDXDraw;
    DXTimer1: TDXTimer;
    procedure FormCreate(Sender: TObject);
    procedure DXTimer1Timer(Sender: TObject; LagCount: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  DXDraw1.Align := alClient;
  DXTimer1.Interval := 50;  // 約 20 FPS
end;

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var
  x1, y1, x2, y2: Integer;
  clr: TColor;
begin
  { 產生隨機座標與顏色 }
  x1 := Random(DXDraw1.Surface.Width);
  y1 := Random(DXDraw1.Surface.Height);
  x2 := Random(DXDraw1.Surface.Width);
  y2 := Random(DXDraw1.Surface.Height);
  clr := Random($FFFFFF);  // 隨機 RGB 顏色

  { 必須鎖定表面才能使用繪圖指令 }
  DXDraw1.Surface.Lock;
  try
    { 繪製抗鋸齒直線 }
    DXDraw1.Surface.PokeLine(x1, y1, x2, y2, clr);
  finally
    DXDraw1.Surface.UnLock;
  end;

  DXDraw1.Flip;  // 翻轉顯示 (累積繪製效果)
end;

end.

執行效果

隨機畫線動畫:色彩斑斕的線條疊加效果

實務開發建議

  1. 批次操作:在單次 Lock/UnLock 區塊內完成所有繪圖指令,減少鎖定開銷。
  2. 色彩格式:繪圖指令使用 **DirectDraw 原生色彩格式** (通常為 16/32 位元),非 Delphi TColor 格式,需用 ColorMatch 轉換。
  3. 效能替代方案:大量幾何繪製建議改用 GDI+ 或自行實作軟體渲染器,再 Draw 到 DirectDraw 表面。
  4. 調試技巧:開發初期可用 Canvas 繪製原型,確認邏輯後再移植到底層指令。

常見陷阱

  • 在 Lock 狀態下呼叫 Pixels 屬性會導致死鎖或異常。
  • 忘記 UnLock 會造成後續 DirectDraw 操作失敗。
  • 座標超出表面範圍不會報錯但會繪製失敗,建議自行裁剪。

雖然 TDirectDrawSurface 繪圖指令使用較繁瑣,但理解其運作機制有助於在需要極致效能或特殊像素操作時發揮作用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved