TDXDraw 本身不具備繪圖功能,但其核心屬性 Surface (型別為 TDirectDrawSurface) 提供了極其豐富的繪圖指令集,遠超 TPictureCollectionItem。本文系統整理所有 TDirectDrawSurface 繪圖方法並說明核心差異:繪圖來源必須是另一個已繪製好的 TDirectDrawSurface。
| 類別 | 方法 | 功能特色 |
|---|---|---|
| 基礎繪製 | Draw | 基本位元複製,支援來源矩形裁剪 |
StretchDraw | 縮放繪製,目標矩形可異於來源尺寸 | |
DrawRotate | 旋轉繪製,支援中心點旋轉角度 | |
| 混合模式 | DrawAlpha | Alpha 混合 (半透明) |
DrawAdd | 加法混合 (發光/高光) | |
DrawSub | 減法混合 (陰影/變暗) | |
DrawAddCol | 加法混合 + 色彩調整 | |
DrawAlphaCol | Alpha 混合 + 色彩調整 | |
DrawSubCol | 減法混合 + 色彩調整 | |
| 旋轉進階 | DrawRotateAdd | 旋轉 + 加法混合 |
DrawRotateAlpha | 旋轉 + Alpha 混合 | |
DrawRotateSub | 旋轉 + 減法混合 | |
DrawRotateAddCol | 旋轉 + 加法混合 + 色彩調整 | |
DrawRotateAlphaCol | 旋轉 + Alpha 混合 + 色彩調整 | |
DrawRotateCol | 旋轉 + 色彩調整 | |
DrawRotateSubCol | 旋轉 + 減法混合 + 色彩調整 | |
| 波浪變形 | DrawWaveX | 水平正弦波變形 |
DrawWaveXAdd | 水平波浪 + 加法混合 | |
DrawWaveXAlpha | 水平波浪 + Alpha 混合 | |
DrawWaveXSub | 水平波浪 + 減法混合 | |
DrawWaveY | 垂直正弦波變形 | |
DrawWaveYAdd | 垂直波浪 + 加法混合 | |
DrawWaveYAlpha | 垂直波浪 + Alpha 混合 | |
DrawWaveYSub | 垂直波浪 + 減法混合 |
TPictureCollectionItem 方法直接從影像列表物件繪製。TDirectDrawSurface 方法**來源必須是另一個 TDirectDrawSurface**,需先將圖片載入/繪製到來源表面,再繪製到目標表面 (通常是 DXDraw1.Surface)。unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DXDraws, StdCtrls;
type
TForm1 = class(TForm)
DXDraw1: TDXDraw;
DXImageList1: TDXImageList;
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
PicItem: TPictureCollectionItem;
procedure TForm1.FormCreate(Sender: TObject);
const
ImgPath1 = 'C:\Temp\DelphiX.bmp';
begin
DXImageList1.DXDraw := DXDraw1;
PicItem := TPictureCollectionItem(DXImageList1.Items.Add);
PicItem.Picture.LoadFromFile(ImgPath1);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
begin
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
try
PicItem.Restore; // 重置圖片狀態 (重要!)
MySurface.SetSize(PicItem.Width, PicItem.Height);
MySurface.Fill(0);
{ 從 PicItem 繪製到中介表面 MySurface }
PicItem.Draw(MySurface, 0, 0, 0);
{ 從中介表面繪製到主表面 (置中顯示) }
DXDraw1.Surface.Fill(0);
DXDraw1.Surface.Draw(
(DXDraw1.Width - MySurface.Width) div 2,
(DXDraw1.Height - MySurface.Height) div 2,
MySurface
);
DXDraw1.Flip;
finally
FreeAndNil(MySurface);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
m, n: Integer;
begin
m := 40; n := 15;
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
try
PicItem.Restore;
MySurface.SetSize(PicItem.Width, PicItem.Height);
MySurface.Fill(0);
PicItem.Draw(MySurface, 0, 0, 0);
DXDraw1.Surface.Fill(0);
{ 使用來源矩形裁剪繪製 (切掉邊框) }
DXDraw1.Surface.Draw(
(DXDraw1.Width - MySurface.Width) div 2 + m,
(DXDraw1.Height - MySurface.Height) div 2 + n,
Bounds(m, n, MySurface.Width - m*2, MySurface.Height - n*2),
MySurface
);
DXDraw1.Flip;
finally
FreeAndNil(MySurface);
end;
end;
end.

DrawWaveX/Y 系列適合水面倒影、熱氣擾動、魔法護盾等動態變形效果。DrawRotateAlpha 是實現旋轉半透明精靈 (如旋轉光標、彈幕) 的標準方法。Col 後綴方法可實現著色、變色、淡入淡出等效果,無需準備多張圖片。TDirectDrawSurface 已正確建立並包含有效像素資料。TPictureCollectionItem 繪製到表面前務必呼叫 Restore,否則可能受之前 PatternWidth/Height 等設定影響導致繪製異常。TDirectDrawSurface 的繪圖指令集是 DelphiX 2D 渲染的核心引擎,掌握其分類與組合方式,可實現媲美現代引擎的豐富視覺效果。