📄 dxgdiplusclasses.pas
字号:
{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ GDI+ Library }
{ }
{ Copyright (c) 2002-2008 Developer Express Inc. }
{ ALL RIGHTS RESERVED }
{ }
{ The entire contents of this file is protected by U.S. and }
{ International Copyright Laws. Unauthorized reproduction, }
{ reverse-engineering, and distribution of all or any portion of }
{ the code contained in this file is strictly prohibited and may }
{ result in severe civil and criminal penalties and will be }
{ prosecuted to the maximum extent possible under the law. }
{ }
{ RESTRICTIONS }
{ }
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
{ LICENSED TO DISTRIBUTE THE GDIPLUS LIBRARY AND ALL ACCOMPANYING }
{ VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
{ }
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
{ }
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
{ ADDITIONAL RESTRICTIONS. }
{ }
{*******************************************************************}
unit dxGDIPlusClasses;
{$I cxVer.inc}
interface
uses
Windows, Classes, SysUtils, Graphics, dxGDIPlusAPI, ActiveX;
type
TdxGPBrush = class(TdxGPBase)
private
FNativeBrush: GpBrush;
FLastResult: TdxGPStatus;
protected
constructor CreateNative (nativeBrush: GpBrush; AStatus: Status);
procedure SetNativeBrush(ANativeBrush: GpBrush);
function SetStatus(AStatus: TdxGPStatus): TdxGPStatus;
public
constructor Create;
destructor Destroy; override;
function Clone: TdxGPBrush; virtual;
function GetType: BrushType;
function GetLastStatus: Status;
end;
TdxGPSolidBrush = class(TdxGPBrush)
private
function GetColor: DWORD;
procedure SetColor(const Value: DWORD);
public
constructor Create; overload;
constructor Create(color: TColor); overload;
property Color: DWORD read GetColor write SetColor;
end;
TdxGPTextureBrush = class(TdxGPBrush)
end;
TdxGPLinearGradientBrush = class(TdxGPBrush)
private
procedure SetWrapMode(const Value: TdxGPWrapMode);
function GetWrapMode: TdxGPWrapMode;
public
constructor Create; overload;
constructor Create(rect: TdxGPRect; color1, color2: DWORD; mode: TdxGPLinearGradientMode); overload;
function SetLinearColors(color1, color2: DWORD): TdxGPStatus;
function GetLinearColors(out color1, color2: DWORD): TdxGPStatus;
function GetRectangle: TdxGPRect; overload;
property WrapMode: TdxGPWrapMode read GetWrapMode write SetWrapMode;
end;
TdxGPHatchBrush = class(TdxGPBrush)
public
constructor Create; overload;
constructor Create(hatchStyle: TdxGPHatchStyle; foreColor: DWORD; backColor: DWORD); overload;
function GetHatchStyle: TdxGPHatchStyle;
function GetForegroundColor: DWORD;
function GetBackgroundColor: DWORD;
end;
TdxGPPen = class(TdxGPBase)
private
FNativePen: GpPen;
FLastResult: TdxGPStatus;
function GetAlignment: TdxGPPenAlignment;
function GetColor: DWORD;
function GetBrush: TdxGPBrush;
function GetWidth: Single;
procedure SetAlignment(const Value: TdxGPPenAlignment);
procedure SetColor(const Value: DWORD);
procedure SetBrush(const Value: TdxGPBrush);
procedure SetWidth(const Value: Single);
protected
procedure SetNativePen(ANativePen: GpPen);
function SetStatus(status: TdxGPStatus): TdxGPStatus;
public
constructor Create(color: DWORD; width: Single = 1.0); overload;
constructor Create(brush: TdxGPBrush; width: Single = 1.0); overload;
destructor Destroy; override;
function GetLastStatus: TdxGPStatus;
function GetPenType: TdxGPPenType;
property ALignment: TdxGPPenAlignment read GetAlignment write SetAlignment;
property Brush: TdxGPBrush read GetBrush write SetBrush;
property Color: DWORD read GetColor write SetColor;
property Width: Single read GetWidth write SetWidth;
end;
TdxGPGraphics = class(TdxGPBase)
private
FNativeGraphics: GpGraphics;
FLastResult: TdxGPStatus;
protected
procedure SetNativeGraphics(AGraphics: GpGraphics);
function SetStatus(status: TdxGPStatus): TdxGPStatus;
function GetNativeGraphics: GpGraphics;
function GetNativePen(pen: TdxGPPen): GpPen;
public
constructor Create(hdc: HDC); overload;
destructor Destroy; override;
function GetHDC: HDC;
procedure ReleaseHDC(hdc: HDC);
function GetLastStatus: TdxGPStatus;
function DrawLine(pen: TdxGPPen; x1, y1, x2, y2: Integer): TdxGPStatus; overload;
function DrawLine(pen: TdxGPPen; const pt1, pt2: TdxGPPoint): TdxGPStatus; overload;
function DrawArc(pen: TdxGPPen; const rect: TdxGPRect; startAngle, sweepAngle: Single): TdxGPStatus; overload;
function DrawBezier(pen: TdxGPPen; x1, y1, x2, y2, x3, y3, x4, y4: Integer): TdxGPStatus; overload;
function DrawBezier(pen: TdxGPPen; const pt1, pt2, pt3, pt4: TdxGPPoint): TdxGPStatus; overload;
function DrawRectangle(pen: TdxGPPen; const rect: TdxGPRect): TdxGPStatus; overload;
function DrawEllipse(pen: TdxGPPen; const rect: TdxGPRect): TdxGPStatus; overload;
function DrawPie(pen: TdxGPPen; const rect: TdxGPRect; startAngle, sweepAngle: Single): TdxGPStatus; overload;
function DrawPolygon(pen: TdxGPPen; points: PdxGPPoint; count: Integer): TdxGPStatus; overload;
function DrawCurve(pen: TdxGPPen; points: PdxGPPoint; count: Integer; tension: Single): TdxGPStatus; overload;
function DrawClosedCurve(pen: TdxGPPen; points: PdxGPPoint; count: Integer; tension: Single): TdxGPStatus; overload;
function Clear(color: TColor): TdxGPStatus;
procedure FillRectangle(brush: TdxGPBrush; const rect: TdxGPRect);
function FillPolygon(brush: TdxGPBrush; points: PdxGPPoint; count: Integer): TdxGPStatus; overload;
function FillEllipse(brush: TdxGPBrush; const rect: TdxGPRect): TdxGPStatus; overload;
function FillPie(brush: TdxGPBrush; const rect: TdxGPRect; startAngle, sweepAngle: Single): TdxGPStatus; overload;
function FillClosedCurve(brush: TdxGPBrush; points: PdxGPPoint; count: Integer): TdxGPStatus; overload;
end;
TdxRGBColors = array of TRGBQuad;
TdxGPImage = class(TdxGPBase)
private
FBits: TdxRGBColors;
FHandle: GpImage;
private
class procedure GetBitmapBitsByScanLine(ABitmap: TBitmap; var AColors: TdxRGBColors);
procedure LoadFromDataStream(AStream: TStream); virtual;
public
constructor CreateFromBitmap(ABitmap: TBitmap); virtual;
constructor CreateFromPattern(const AWidth, AHeight: Integer;
const ABits: TdxRGBColors; AHasAlphaChannel: Boolean); virtual;
constructor CreateFromStream(AStream: TStream); virtual;
destructor Destroy; override;
function Clone: TdxGPImage;
procedure Draw(DC: HDC; const R: TRect);
class function GetBitmapBits(ABitmap: TBitmap): TdxRGBColors;
function MakeComposition(AOverlay: TdxGPImage; AAlpha: Byte): TdxGPImage;
procedure SaveToStream(AStream: TStream);
property Handle: GpImage read FHandle;
end;
TdxGPImageClass = class of TdxGPImage;
TdxGPNullImage = class(TdxGPImage)
public
class function NewInstance: TObject; override;
procedure FreeInstance; override;
end;
TdxPNGImage = class(TGraphic)
private
FHandle: TdxGPImage;
FIsAlphaUsed: Boolean;
FIsAlphaUsedAssigned: Boolean;
procedure SetHandle(AHandle: TdxGPImage);
protected
procedure AssignTo(Dest: TPersistent); override;
procedure Changed(Sender: TObject); override;
function CheckAlphaUsed: Boolean;
procedure Draw(ACanvas: TCanvas; const ARect: TRect); override;
function GetEmpty: Boolean; override;
function GetHeight: Integer; override;
function GetIsAlphaUsed: Boolean;
function GetSize: TSize;
function GetTransparent: Boolean; override;
function GetWidth: Integer; override;
procedure SetHeight(Value: Integer); override;
procedure SetWidth(Value: Integer); override;
public
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
class function CreateFromBitmap(ASource: TBitmap): TdxGPImage;
function Compare(AImage: TdxPngImage): Boolean; virtual;
procedure DrawEx(Graphics: GpGraphics; const ADest, ASource: TRect);
function GetAsBitmap: TBitmap; virtual;
procedure SetBitmap(ABitmap: TBitmap); virtual;
procedure LoadFromStream(Stream: TStream); override;
procedure SaveToStream(Stream: TStream); override;
procedure LoadFromClipboardFormat(AFormat: Word; AData: THandle;
APalette: HPALETTE); override;
procedure SaveToClipboardFormat(var AFormat: Word; var AData: THandle;
var APalette: HPALETTE); override;
procedure StretchDraw(DC: HDC; const ADest: TRect); overload; virtual;
procedure StretchDraw(DC: HDC; const ADest, ASource: TRect); overload; virtual;
procedure StretchDrawEx(Graphics: GpGraphics; const ADest, ASource: TRect); virtual;
property Handle: TdxGPImage read FHandle write SetHandle;
property IsAlphaUsed: Boolean read GetIsAlphaUsed;
end;
var
dxGPImageClass: TdxGPImageClass;
implementation
{ TdxGPBrush }
constructor TdxGPBrush.Create;
begin
SetStatus(NotImplemented);
FNativeBrush := nil;
end;
destructor TdxGPBrush.Destroy;
begin
GdipDeleteBrush(FNativeBrush);
inherited;
end;
constructor TdxGPBrush.CreateNative(nativeBrush: GpBrush; AStatus: Status);
begin
inherited Create;
FLastResult := AStatus;
SetNativeBrush(FNativeBrush);
end;
function TdxGPBrush.Clone: TdxGPBrush;
var
gpB: GpBrush;
begin
gpB := nil;
Result := nil;
SetStatus (GdipCloneBrush(FNativeBrush, gpB));
try
Result := TdxGPBrush.CreateNative(gpB, FLastResult);
except
GdipDeleteBrush(gpB);
end;
end;
function TdxGPBrush.GetLastStatus: Status;
begin
Result := FLastResult;
FLastResult := Ok;
end;
function TdxGPBrush.GetType: BrushType;
begin
SetStatus(GdipGetBrushType (FNativeBrush, Result));
end;
procedure TdxGPBrush.SetNativeBrush(ANativeBrush: GpBrush);
begin
FNativeBrush := ANativeBrush;
end;
function TdxGPBrush.SetStatus(AStatus: TdxGPStatus): TdxGPStatus;
begin
Result := AStatus;
if (AStatus <> Ok) and (FLastResult <> AStatus) then
Result := GenericError;
end;
{ TdxGPSolidBrush }
constructor TdxGPSolidBrush.Create(color: TColor);
var
ABrush: GpSolidFill;
begin
ABrush := nil;
FLastResult := GdipCreateSolidFill(color, ABrush);
SetNativeBrush(ABrush);
end;
constructor TdxGPSolidBrush.Create;
begin
// hide parent method
end;
function TdxGPSolidBrush.GetColor: DWORD;
begin
SetStatus(GdipGetSolidFillColor(GPSOLIDFILL(FNativeBrush), Result));
end;
procedure TdxGPSolidBrush.SetColor(const Value: DWORD);
begin
SetStatus(GdipSetSolidFillColor(GpSolidFill(FNativeBrush), Value));
end;
{ TdxGPLinearGradientBrush }
constructor TdxGPLinearGradientBrush.Create(rect: TdxGPRect; color1, color2: DWORD; mode: TdxGPLinearGradientMode);
var
ABrush: GpLineGradient;
begin
ABrush := nil;
FLastResult := GdipCreateLineBrushFromRectI(@rect, color1, color2, mode, WrapModeTile, ABrush);
SetNativeBrush(ABrush);
end;
constructor TdxGPLinearGradientBrush.Create;
begin
// hide parent method
end;
function TdxGPLinearGradientBrush.GetLinearColors(out color1, color2: DWORD): TdxGPStatus;
var
AColors: array[0..1] of DWORD;
begin
SetStatus(GdipGetLineColors(GpLineGradient(FNativeBrush), PARGB(@AColors)));
if (FLastResult = Ok) then
begin
color1 := AColors[0];
color2 := AColors[1];
end;
Result := FLastResult;
end;
function TdxGPLinearGradientBrush.GetRectangle: TdxGPRect;
var
ARect: PdxGPRect;
begin
ARect := @Result;
SetStatus(GdipGetLineRectI(GpLineGradient(FNativeBrush), ARect));
end;
function TdxGPLinearGradientBrush.GetWrapMode: TdxGPWrapMode;
begin
Result := WrapModeTile;
SetStatus(GdipGetLineWrapMode(GpLineGradient(FNativeBrush), Result));
end;
function TdxGPLinearGradientBrush.SetLinearColors(color1, color2: DWORD): TdxGPStatus;
begin
Result := SetStatus(GdipSetLineColors(GpLineGradient(FNativeBrush), color1, color2));
end;
procedure TdxGPLinearGradientBrush.SetWrapMode(const Value: TdxGPWrapMode);
begin
SetStatus(GdipSetLineWrapMode(GpLineGradient(FNativeBrush), Value));
end;
{ TdxGPHatchBrush }
constructor TdxGPHatchBrush.Create;
begin
// hide parent method
end;
constructor TdxGPHatchBrush.Create(hatchStyle: TdxGPHatchStyle; foreColor,
backColor: DWORD);
var
ABrush: GpHatch;
begin
ABrush := nil;
FLastResult := GdipCreateHatchBrush(hatchStyle, foreColor, backColor, ABrush);
SetNativeBrush(ABrush);
end;
function TdxGPHatchBrush.GetBackgroundColor: DWORD;
begin
SetStatus(GdipGetHatchBackgroundColor(GpHatch(FNativeBrush), Result));
end;
function TdxGPHatchBrush.GetForegroundColor: DWORD;
begin
SetStatus(GdipGetHatchForegroundColor(GpHatch(FNativeBrush), Result));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -