TGPColor 是 GdiPlus 的颜色主体, 它虽然是个结构体, 但和类一样, 方法、属性一应俱全.
之所以没有把它定义为类或接口, 我觉得主要是它需要和一个整数值进行隐式转换, 这要用到运算符重载(暂时只有结构有).
TGPColor 的多种构建方法:
var c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11: TGPColor; begin c1 := TGPColor.Create(0, 0, 255); { 不透明蓝色 } c2 := TGPColor.Create(255, 0, 0, 255); { 不透明蓝色 } c3 := TGPColor.Create(128, 0, 0, 255); { 半透明蓝色 } c4 := TGPColor.Create($800000FF); { 半透明蓝色 } c5 := TGPColor.MakeARGB(128, 0, 0, 255); { 半透明蓝色 } c6 := TGPColor.CreateFromColorRef(clBlue); { 半透明蓝色, 参数是 Delphi 传统格式的颜色值 } c7.Initialize(0, 0, 255); { 不透明蓝色 } c8.Initialize(128, 0, 0, 255); { 半透明蓝色 } c9.Initialize($800000FF); { 半透明蓝色 } c10.InitializeFromColorRef(clBlue); { 不透明蓝色, 参数是 Delphi 传统格式的颜色值 } c11 := TGPColor.Blue; { 不透明蓝色, 这是 TGPColor 中 141 个颜色常量之一 } end; //因为 TGPColor 使用运算符重载: TGPColor 可与 ARGB(Cardinal) 隐式转换, 所以: var Color: TGPColor; begin Color := $FF00FF00; ShowMessageFmt('$%x', [Color.Value]); //$FF00FF00 end; //反之亦然: var Num: ARGB; begin Num := TGPColor.Lime; ShowMessageFmt('$%x', [Num]); //$FF00FF00 end;
TGPColor 的属性:
var C: TGPColor; begin C := TGPColor.Create($11, $22, $33, $44); { TGPColor.Value 是颜色值 } ShowMessageFmt('$%x', [C.Value]); //$11223344 { TGPColor.ColorRef 是 Delphi 传统格式的颜色值 } ShowMessageFmt('$%x', [C.ColorRef]); //$443322 { Alpha、Red、Green、Blue 各分量 } ShowMessageFmt('$%.2x, $%.2x, $%.2x, $%.2x', [C.A, C.R, C.G, C.B]); //$11, $22, $33, $44 { TGPColor.Alpha 与 TGPColor.A 是一回事 } ShowMessageFmt('$%.2x, $%.2x', [C.Alpha, C.A]); //$11, $11 end;
透明色演示代码:
uses GdiPlus, GdiPlusHelpers; procedure TForm1.FormPaint(Sender: TObject); var Image: IGPImage; Brush: IGPSolidBrush; Rect: TGPRect; begin ChDir('C:\GdiPlusImg\'); Image := TGPImage.Create('Grapes.jpg'); Canvas.ToGPGraphics.DrawImage(Image, 20, 10); Rect.Initialize(0, 20, Image.Width + 40, 35); Brush := TGPSolidBrush.Create(TGPColor.Create(255, 0, 128, 255)); Canvas.ToGPGraphics.FillRectangle(Brush, Rect); Rect.Y := Rect.Y + Rect.Height + 20; Brush := TGPSolidBrush.Create(TGPColor.Create(127, 0, 128, 255)); Canvas.ToGPGraphics.FillRectangle(Brush, Rect); Rect.Y := Rect.Y + Rect.Height + 20; Brush := TGPSolidBrush.Create(TGPColor.Create(63, 0, 128, 255)); Canvas.ToGPGraphics.FillRectangle(Brush, Rect); end;
效果图: