TDirectDrawSurface 提供了多種矩形填充方法,功能從純色填充到 Alpha 混合、加法/減法混合應有盡有。但最大的挑戰在於**色彩格式不一致**:Fill/FillRect 使用 DirectDraw 原生格式,而 FillRectAlpha/Add/Sub 則支援 Delphi 標準 TColor。本文詳細解析各函數差異與正確用法。
| 方法 | 功能 | 色彩格式 | 參數 | 典型用途 |
|---|---|---|---|---|
Fill(Color) | 全表面純色填充 | **DD 原生格式** (如 $FF0000=紅) | Color: Longint | 清除背景 |
FillRect(Rect, Color) | 矩形區域純色填充 | **DD 原生格式** | Rect: TRect; Color: Longint | UI 方塊繪製 |
FillRectAlpha(Rect, Color, Alpha) | Alpha 混合填充 | **Delphi TColor** (如 $0000FF/clRed) | Alpha: 0-255 | 半透明遮罩 |
FillRectAdd(Rect, Color, Weight) | 加法混合填充 | **Delphi TColor** | Weight: 0-255 | 發光/高光效果 |
FillRectSub(Rect, Color, Weight) | 減法混合填充 | **Delphi TColor** | Weight: 0-255 | 陰影/變暗效果 |
$FF0000 (藍=0, 綠=0, 紅=255)。$0000FF 或 clRed。unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DXDraws, StdCtrls;
type
TForm1 = class(TForm)
DXDraw1: TDXDraw;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
ImgPath1 = 'C:\Temp\Test.jpg';
procedure TForm1.Button1Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
begin
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
try
MySurface.LoadFromFile(ImgPath1);
DXDraw1.Surface.Fill(0); // DD 格式黑色
DXDraw1.Surface.Draw(0, 0, MySurface);
DXDraw1.Flip;
finally
FreeAndNil(MySurface);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
r: TRect;
begin
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
try
MySurface.LoadFromFile(ImgPath1);
DXDraw1.Surface.Fill(0);
DXDraw1.Surface.Draw(0, 0, MySurface);
r := Bounds(10, 10, DXDraw1.Width - 20, DXDraw1.Height - 20);
{ DD 格式紅色:$FF0000 }
DXDraw1.Surface.FillRect(r, $FF0000);
DXDraw1.Flip;
finally
FreeAndNil(MySurface);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
r: TRect;
begin
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
try
MySurface.LoadFromFile(ImgPath1);
DXDraw1.Surface.Fill(0);
DXDraw1.Surface.Draw(0, 0, MySurface);
r := Bounds(10, 10, DXDraw1.Width - 20, DXDraw1.Height - 20);
{ TColor 格式紅色:$0000FF 或 clRed,Alpha=128 (50%) }
DXDraw1.Surface.FillRectAlpha(r, $0000FF, 128);
DXDraw1.Flip;
finally
FreeAndNil(MySurface);
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
r: TRect;
begin
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
try
MySurface.LoadFromFile(ImgPath1);
DXDraw1.Surface.Fill(0);
DXDraw1.Surface.Draw(0, 0, MySurface);
r := Bounds(10, 10, DXDraw1.Width - 20, DXDraw1.Height - 20);
{ 加法混合:發光效果,Weight=255 最強 }
DXDraw1.Surface.FillRectAdd(r, $0000FF, 255);
DXDraw1.Flip;
finally
FreeAndNil(MySurface);
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
MySurface: TDirectDrawSurface;
r: TRect;
begin
MySurface := TDirectDrawSurface.Create(DXDraw1.DDraw);
try
MySurface.LoadFromFile(ImgPath1);
DXDraw1.Surface.Fill(0);
DXDraw1.Surface.Draw(0, 0, MySurface);
r := Bounds(10, 10, DXDraw1.Width - 20, DXDraw1.Height - 20);
{ 減法混合:變暗效果 }
DXDraw1.Surface.FillRectSub(r, $0000FF, 255);
DXDraw1.Flip;
finally
FreeAndNil(MySurface);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Caption := '原始圖片';
Button2.Caption := 'FillRect (DD格式)';
Button3.Caption := 'FillRectAlpha (TColor+Alpha)';
Button4.Caption := 'FillRectAdd (加法混合)';
Button5.Caption := 'FillRectSub (減法混合)';
end;
end.

function DDColor(c: TColor): Longint; 統一轉換,避免格式混淆。FillRectAlphaFillRectAddFillRectSubFill/FillRect 為硬體加速極快;Alpha/加減法混合可能回退軟體模擬,大面積使用需測試效能。掌握色彩格式差異是正確使用 DelphiX 填充函數的關鍵,建立統一的色彩轉換習慣將避免大量難以除錯的顯示錯誤。