在 DelphiX 開發中,TDirectDrawSurface 的 Blt() 與 BltFast() 是兩個核心位元區塊傳輸函數,雖然功能相似,但參數複雜度與適用場景大不相同。本文將透過實戰範例,深入解析這兩個函數的用法差異與效能特性。
以下範例示範如何使用這兩個函數將來源圖片繪製到主要繪圖表面:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DXDraws, StdCtrls, DirectX;
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}
const
ImgPath1 = 'C:\Temp\DelphiX.bmp'; // 來源圖片
ImgPath2 = 'C:\Temp\Test.bmp'; // 背景圖片
procedure TForm1.Button1Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
DF: TDDBltFX;
begin
// 建立臨時表面並載入來源圖片
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
try
MySurface.LoadFromFile(ImgPath1);
DXDraw1.Surface.LoadFromFile(ImgPath2);
// 設定 Blt 特效結構
DF.dwSize := SizeOf(DF);
DF.dwDDFX := 0;
{ 使用 Blt 進行縮放繪製 (目標矩形為來源的一半大小)
參數說明:
1. 目標矩形
2. 來源表面
3. 來源矩形
4. 標誌:DDBLT_KEYSRC(色鍵透明) + DDBLT_WAIT(等待完成)
5. 特效結構 }
DXDraw1.Surface.Blt(
Rect(0, 0, MySurface.Width div 2, MySurface.Height div 2),
MySurface.ClientRect,
DDBLT_KEYSRC or DDBLT_WAIT,
DF,
MySurface
);
DXDraw1.Flip; // 翻轉顯示
finally
FreeAndNil(MySurface);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
begin
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
try
MySurface.LoadFromFile(ImgPath1);
DXDraw1.Surface.LoadFromFile(ImgPath2);
{ 使用 BltFast 快速繪製 (帶縮放效果需自行計算矩形)
參數說明:
1. 目標 X 座標
2. 目標 Y 座標
3. 來源矩形 (這裡取 90% 區域)
4. 標誌:DDBLTFAST_SRCCOLORKEY(來源色鍵) + DDBLTFAST_WAIT
5. 來源表面 }
DXDraw1.Surface.BltFast(
0, 0,
Bounds(16, 4, Trunc(MySurface.Width * 0.9), Trunc(MySurface.Height * 0.9)),
DDBLTFAST_SRCCOLORKEY or DDBLTFAST_WAIT,
MySurface
);
DXDraw1.Flip;
finally
FreeAndNil(MySurface);
end;
end;
end.
try...finally 確保 TDirectDrawSurface 正確釋放,避免 DirectDraw 介面洩漏。ColorKey 屬性。BltFast;需要縮放、旋轉、Alpha 混合等特效時才使用 Blt。DDBLT_WAIT / DDBLTFAST_WAIT 確保繪製完成才返回,防止畫面撕裂。
透過本範例可見,Blt 適合需要幾何變換的場景,而 BltFast 則是高效能 2D 遊戲渲染的首選。實際開發中應根據具體需求靈活選用。