TDirectDrawSurface 提供了一組底層繪圖指令,雖然功能強大但使用門檻較高,必須在 Lock/UnLock 之間操作,且座標系統與色彩格式需特別注意。本文系統整理所有繪圖方法並提供實戰範例。
| 方法 | 功能說明 | 備註 |
|---|---|---|
PokeLine | 繪製直線 | 基本線條繪製 |
PokeLinePolar | 極座標繪線 | 角度+長度方式 |
PokeBox | 繪製矩形框 | 僅邊框 |
PokeBlendPixel | Alpha 混合像素 | 單點半透明 |
PokeCircle | 繪製圓形 | 圓周線條 |
PokeEllipse | 繪製橢圓 | 橢圓周線條 |
PokeFilledEllipse | 繪製實心橢圓 | 填滿內部 |
PokeWuLine | Wu 抗鋸齒線條 | 平滑邊緣 |
PokeVLine | 垂直線快速繪製 | 優化垂直線 |
DoRotate | 表面旋轉 | 整體旋轉操作 |
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.

ColorMatch 轉換。Draw 到 DirectDraw 表面。Canvas 繪製原型,確認邏輯後再移植到底層指令。Pixels 屬性會導致死鎖或異常。UnLock 會造成後續 DirectDraw 操作失敗。雖然 TDirectDrawSurface 繪圖指令使用較繁瑣,但理解其運作機制有助於在需要極致效能或特殊像素操作時發揮作用。