Componentes.Terceros.DevExp.../internal/x.46/2/ExpressNavBar 2/Sources/dxNavBarCustomPainters.pas

926 lines
39 KiB
ObjectPascal

{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressNavBar }
{ }
{ Copyright (c) 2002-2009 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 EXPRESSNAVBAR 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 dxNavBarCustomPainters;
{$I cxVer.inc}
interface
uses
{$IFDEF DELPHI6}
Types,
{$ENDIF}
Windows, Graphics, ImgList, dxNavBar, dxNavBarStyles;
type
TdxNavBarCustomImagePainter = class
protected
class function GetRGBColor(Value: TColor): DWORD;
class procedure InternalDrawImage(ACanvas: TCanvas; AImageList: TCustomImageList;
AImageIndex: Integer; ARect: TRect; AEnabled: Boolean); virtual;
public
class procedure DrawImage(ACanvas: TCanvas; AImageList: TCustomImageList;
AImageIndex: Integer; ARect: TRect; AEnabled: Boolean = True);
class function IsValidImage(AImageList: TCustomImageList;AImageIndex: Integer): Boolean;
end;
TdxNavBarCustomImagePainterClass = class of TdxNavBarCustomImagePainter;
TdxNavBarCustomSelectionPainter = class
protected
class procedure GetColors(AState: TdxNavBarObjectStates; ABackColor: TColor; out AFillColor,
ATopLeftOuterColor, ABottomRightOuterColor, ATopLeftInnerColor, ABottomRightInnerColor: TColor); virtual;
class procedure InternalDrawSelection(ACanvas: TCanvas; ARect: TRect;
ABackColor: TColor; AState: TdxNavBarObjectStates); virtual;
class function IsPressed(AState: TdxNavBarObjectStates): Boolean; virtual;
public
class procedure DrawSelection(ACanvas: TCanvas; ARect: TRect;
ABackColor: TColor; AState: TdxNavBarObjectStates);
end;
TdxNavBarCustomSelectionPainterClass = class of TdxNavBarCustomSelectionPainter;
TdxNavBarUltraFlatSelectionPainter = class(TdxNavBarCustomSelectionPainter)
protected
class procedure GetColors(AState: TdxNavBarObjectStates; ABackColor: TColor; out AFillColor,
ATopLeftOuterColor, ABottomRightOuterColor, ATopLeftInnerColor, ABottomRightInnerColor: TColor); override;
class function IsPressed(AState: TdxNavBarObjectStates): Boolean; override;
end;
TdxNavBarCustomBackgroundPainter = class
private
class procedure InternalDrawGradientBackground(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AEraseBackground: Boolean; ABackgroundColor: TColor;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
protected
class procedure DrawPicture(ACanvas: TCanvas; ARect: TRect; APicture: TPicture);
class procedure FillGradientRect(DC: HDC; const ARect: TRect;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode);
class procedure InternalDrawBackground(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AEraseBackground: Boolean; ABackgroundColor: TColor;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode); virtual;
public
class procedure DrawBackground(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AEraseBackground: Boolean; ABackgroundColor: TColor;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
end;
TdxNavBarCustomBackgroundPainterClass = class of TdxNavBarCustomBackgroundPainter;
TdxNavBarCustomGroupBackgroundPainter = class
protected
class procedure InternalDrawBackground(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode); virtual;
public
class procedure DrawBackground(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
end;
TdxNavBarCustomGroupBackgroundPainterClass = class of TdxNavBarCustomGroupBackgroundPainter;
TdxNavBarCustomGroupBorderPainter = class
protected
class procedure InternalDrawBorder(ACanvas: TCanvas; ARect: TRect; AColor: TColor; AWithCaption: Boolean); virtual;
public
class procedure DrawBorder(ACanvas: TCanvas; ARect: TRect; AColor: TColor; AWithCaption: Boolean);
end;
TdxNavBarCustomGroupBorderPainterClass = class of TdxNavBarCustomGroupBorderPainter;
TdxNavBarCustomSignPainter = class
protected
class procedure InternalDrawSign(ACanvas: TCanvas; ARect: TRect;
AForeColor, ABackColor1, ABackColor2: TColor; AState: TdxNavBarObjectStates); virtual;
public
class procedure DrawSign(ACanvas: TCanvas; ARect: TRect;
AForeColor, ABackColor1, ABackColor2: TColor; AState: TdxNavBarObjectStates);
end;
TdxNavBarCustomSignPainterClass = class of TdxNavBarCustomSignPainter;
TdxNavBarCustomHintPainter = class
protected
class procedure InternalDrawHint(ACanvas: TCanvas; ARect: TRect; AHint: string;
APicture: TPicture; AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode; AFont: TFont); virtual;
public
class procedure DrawHint(ACanvas: TCanvas; ARect: TRect; AHint: string;
APicture: TPicture; AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode; AFont: TFont);
end;
TdxNavBarCustomHintPainterClass = class of TdxNavBarCustomHintPainter;
TdxNavBarCustomButtonPainter = class
protected
class procedure InternalDrawButton(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode; ABorderColor: TColor;
AState: TdxNavBarObjectStates); virtual;
public
class procedure DrawButton(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode; ABorderColor: TColor;
AState: TdxNavBarObjectStates);
end;
TdxNavBarCustomButtonPainterClass = class of TdxNavBarCustomButtonPainter;
TdxNavBarCustomScrollButtonsPainter = class
protected
class procedure InternalDrawBottomButton(ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxNavBarCustomButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates); virtual;
class procedure InternalDrawTopButton(ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxNavBarCustomButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates); virtual;
public
class procedure DrawBottomButton(ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxNavBarCustomButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
class procedure DrawTopButton(ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxNavBarCustomButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
end;
TdxNavBarCustomScrollButtonsPainterClass = class of TdxNavBarCustomScrollButtonsPainter;
TdxNavBarCustomDropTargetLinkPainter = class
protected
class procedure InternalDrawTargetLink(ACanvas: TCanvas;
pt1, pt2, pt3, pt4, pt5, pt6: TPoint; AColor: TColor); virtual;
public
class procedure DrawTargetLink(ACanvas: TCanvas;
pt1, pt2, pt3, pt4, pt5, pt6: TPoint; AColor: TColor);
end;
TdxNavBarCustomDropTargetLinkPainterClass = class of TdxNavBarCustomDropTargetLinkPainter;
TdxNavBarCustomDropTargetGroupPainter = class
protected
class procedure InternalDrawTargetGroup(ACanvas: TCanvas; ARect: TRect;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode); virtual;
public
class procedure DrawTargetGroup(ACanvas: TCanvas; ARect: TRect;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
end;
TdxNavBarCustomDropTargetGroupPainterClass = class of TdxNavBarCustomDropTargetGroupPainter;
TdxNavBarViewInfoAccess = class(TdxNavBarViewInfo);
TdxNavBarLinkViewInfoAccess = class(TdxNavBarLinkViewInfo);
TdxNavBarElementPainter = class(TdxNavBarPainter)
protected
// Drawing
procedure DoDrawDropTargetLinkSelection(AItemGroup: TdxNavBarGroupViewInfo; AItem1, AItem2: TdxNavBarLinkViewInfo); virtual;
procedure DoDrawHint(ACanvas: TCanvas; const ARect: TRect); override;
// Painters
class function BackgroundPainterClass: TdxNavBarCustomBackgroundPainterClass; virtual;
class function ButtonPainterClass: TdxNavBarCustomButtonPainterClass; virtual;
class function DropTargetGroupPainterClass: TdxNavBarCustomDropTargetGroupPainterClass; virtual;
class function DropTargetLinkPainterClass: TdxNavBarCustomDropTargetLinkPainterClass; virtual;
class function GroupBackgroundPainterClass: TdxNavBarCustomGroupBackgroundPainterClass; virtual;
class function GroupBorderPainterClass: TdxNavBarCustomGroupBorderPainterClass; virtual;
class function ImagePainterClass: TdxNavBarCustomImagePainterClass; virtual;
class function ScrollButtonsPainterClass: TdxNavBarCustomScrollButtonsPainterClass; virtual;
class function SelectionPainterClass: TdxNavBarCustomSelectionPainterClass; virtual;
class function SignPainterClass: TdxNavBarCustomSignPainterClass; virtual;
public
// Drawing
procedure DrawBackground; override;
procedure DrawDropTargetGroupSelection; override;
procedure DrawDropTargetLinkSelection; override;
procedure DrawGroupBackground(AGroupViewInfo: TdxNavBarGroupViewInfo); override;
procedure DrawGroupBorder(AGroupViewInfo: TdxNavBarGroupViewInfo); override;
procedure DrawGroupCaptionButton(AGroupViewInfo: TdxNavBarGroupViewInfo); override;
procedure DrawGroupCaptionImage(AGroupViewInfo: TdxNavBarGroupViewInfo); override;
procedure DrawGroupCaptionSign(AGroupViewInfo: TdxNavBarGroupViewInfo); override;
procedure DrawGroupControl(ACanvas: TCanvas; ARect: TRect; AGroupViewInfo: TdxNavBarGroupViewInfo); override;
procedure DrawItemImage(ALinkViewInfo: TdxNavBarLinkViewInfo); override;
procedure DrawItemSelection(ALinkViewInfo: TdxNavBarLinkViewInfo); override;
procedure DrawBottomScrollButton; override;
procedure DrawTopScrollButton; override;
end;
implementation
uses
CommCtrl, cxGraphics, cxGeometry, dxOffice11, dxNavBarGraphics;
{ TdxNavBarCustomImagePainter }
class procedure TdxNavBarCustomImagePainter.DrawImage(ACanvas: TCanvas;
AImageList: TCustomImageList; AImageIndex: Integer; ARect: TRect; AEnabled: Boolean);
begin
InternalDrawImage(ACanvas, AImageList, AImageIndex, ARect, AEnabled);
end;
class function TdxNavBarCustomImagePainter.IsValidImage(AImageList: TCustomImageList; AImageIndex: Integer): Boolean;
begin
Result := IsImageAssigned(AImageList, AImageIndex);
end;
class function TdxNavBarCustomImagePainter.GetRGBColor(Value: TColor): DWORD;
begin
Result := ColorToRGB(Value);
case Result of
clNone: Result := CLR_NONE;
clDefault: Result := CLR_DEFAULT;
end;
end;
class procedure TdxNavBarCustomImagePainter.InternalDrawImage(ACanvas: TCanvas;
AImageList: TCustomImageList; AImageIndex: Integer; ARect: TRect; AEnabled: Boolean);
var
ASavedDCInfo: Integer;
begin
if IsValidImage(AImageList, AImageIndex) then
begin
ASavedDCInfo := SaveDC(ACanvas.Handle);
AImageList.Draw(ACanvas, ARect.Left, ARect.Top, AImageIndex, AEnabled or DrawIconsAsEnabled);
RestoreDC(ACanvas.Handle, ASavedDCInfo);
end;
end;
{ TdxNavBarCustomSelectionPainter }
class procedure TdxNavBarCustomSelectionPainter.DrawSelection(ACanvas: TCanvas;
ARect: TRect; ABackColor: TColor; AState: TdxNavBarObjectStates);
begin
InternalDrawSelection(ACanvas, ARect, ABackColor, AState);
end;
class procedure TdxNavBarCustomSelectionPainter.GetColors(AState: TdxNavBarObjectStates; ABackColor: TColor;
out AFillColor, ATopLeftOuterColor, ABottomRightOuterColor, ATopLeftInnerColor, ABottomRightInnerColor: TColor);
begin
AFillColor := clNone;
ATopLeftOuterColor := clNone;
ABottomRightOuterColor := clNone;
ATopLeftInnerColor := clNone;
ABottomRightInnerColor := clNone;
end;
class procedure TdxNavBarCustomSelectionPainter.InternalDrawSelection(
ACanvas: TCanvas; ARect: TRect; ABackColor: TColor; AState: TdxNavBarObjectStates);
var
AFillColor, ATopLeftOuterColor, ABottomRightOuterColor,
ATopLeftInnerColor, ABottomRightInnerColor: TColor;
begin
if [sSelected, sPressed, sHotTracked] * AState <> [] then
begin
GetColors(AState, ABackColor, AFillColor, ATopLeftOuterColor, ABottomRightOuterColor,
ATopLeftInnerColor, ABottomRightInnerColor);
dxNavBarDrawSelectedFrame(ACanvas, ARect, ATopLeftOuterColor, ABottomRightOuterColor,
ATopLeftInnerColor, ABottomRightInnerColor);
if AFillColor <> clNone then
FillRectByColor(ACanvas.Handle, cxRectInflate(ARect, -1, -1), AFillColor);
end;
end;
class function TdxNavBarCustomSelectionPainter.IsPressed(AState: TdxNavBarObjectStates): Boolean;
begin
Result := [sPressed, sSelected] * AState <> [];
end;
{ TdxNavBarUltraFlatSelectionPainter }
class procedure TdxNavBarUltraFlatSelectionPainter.GetColors(AState: TdxNavBarObjectStates; ABackColor: TColor;
out AFillColor, ATopLeftOuterColor, ABottomRightOuterColor, ATopLeftInnerColor, ABottomRightInnerColor: TColor);
begin
inherited;
ATopLeftOuterColor := ColorToRGB(clHighlight);
ABottomRightOuterColor := ColorToRGB(clHighlight);
if IsPressed(AState) then
AFillColor := GetRealColor(GetLightColor(14, 44, 40))
else
AFillColor := GetRealColor(GetLightColor(-2, 30, 72));
end;
class function TdxNavBarUltraFlatSelectionPainter.IsPressed(AState: TdxNavBarObjectStates): Boolean;
begin
Result := (sPressed in AState) and not (sSelected in AState);
end;
{ TdxNavBarCustomBackgroundPainter }
class procedure TdxNavBarCustomBackgroundPainter.DrawBackground(ACanvas: TCanvas; ARect: TRect;
APicture: TPicture; AEraseBackground: Boolean; ABackgroundColor: TColor;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode);
begin
InternalDrawBackground(ACanvas, ARect, APicture, AEraseBackground, ABackgroundColor,
AColor1, AColor2, AAlphaBlend1, AAlphaBlend2, AGradientMode);
end;
class procedure TdxNavBarCustomBackgroundPainter.DrawPicture(ACanvas: TCanvas; ARect: TRect;
APicture: TPicture);
var
dLeft, dTop, dWidth, dHeight: Integer;
ABmp: TBitmap;
ACreatedFlag: Boolean;
begin
ACreatedFlag := not(APicture.Graphic is TBitmap);
if ACreatedFlag then
begin
ABmp := cxCreateBitmap(APicture.Graphic.Height, APicture.Graphic.Height);
ABmp.Canvas.Draw(0, 0, APicture.Graphic);
end
else
ABmp := APicture.Bitmap;
if ABmp <> nil then
begin
dTop := ARect.Top;
while (dTop < ARect.Bottom) do begin
dHeight := ABmp.Height;
if (dTop + dHeight > ARect.Bottom) then
dHeight := ARect.Bottom - dTop;
dLeft := ARect.Left;
while (dLeft < ARect.Right) do begin
dWidth := ABmp.Width;
if (dLeft + dWidth > ARect.Right) then
dWidth := ARect.Right - dLeft;
BitBlt(ACanvas.Handle, dLeft, dTop, dWidth, dHeight, ABmp.Canvas.Handle, 0, 0, SRCCOPY);
Inc(dLeft, dWidth);
end;
Inc(dTop, dHeight);
end;
if ACreatedFlag then ABmp.Free;
end;
end;
class procedure TdxNavBarCustomBackgroundPainter.FillGradientRect(DC: HDC; const ARect: TRect;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode);
function CalcColorComponent(AFromColorComponent, AToColorComponent: Byte;
AGradientSize: TSize; AGradientPos: TPoint): Integer;
var
AFromToColorSize: Integer;
begin
AFromToColorSize := AToColorComponent - AFromColorComponent;
case AGradientMode of
gmHorizontal:
Result := AFromColorComponent +
MulDiv(AGradientPos.X, AFromToColorSize, (AGradientSize.cx - 1));
gmVertical:
Result := AFromColorComponent +
MulDiv(AGradientPos.Y, AFromToColorSize, (AGradientSize.cy - 1));
gmForwardDiagonal:
Result := AFromColorComponent +
(MulDiv(AGradientPos.X, AFromToColorSize, (AGradientSize.cx - 1)) +
MulDiv(AGradientPos.Y, AFromToColorSize, (AGradientSize.cy - 1))) div 2;
gmBackwardDiagonal:
Result := AFromColorComponent +
(MulDiv(AGradientSize.cx - 1 - AGradientPos.X, AFromToColorSize, (AGradientSize.cx - 1)) +
MulDiv(AGradientPos.Y, AFromToColorSize, (AGradientSize.cy - 1))) div 2;
else
Result := 0;
end
end;
function CalcRGBColor(AFromColor, AToColor: TColor;
AGradientSize: TSize; AGradientPos: TPoint): TColor;
var
R, G, B: Byte;
begin
R := CalcColorComponent(GetRValue(AFromColor), GetRValue(AToColor),
AGradientSize, AGradientPos);
G := CalcColorComponent(GetGValue(AFromColor), GetGValue(AToColor),
AGradientSize, AGradientPos);
B := CalcColorComponent(GetBValue(AFromColor), GetBValue(AToColor),
AGradientSize, AGradientPos);
Result := RGB(R, G, B);
end;
function GetGradientSize(ARect: TRect): TSize;
const
MaxGradientHeight = 256;
MaxGradientWidth = 256;
var
ARectWidth, ARectHeight: Integer;
begin
ARectWidth := ARect.Right - ARect.Left;
ARectHeight := ARect.Bottom - ARect.Top;
if ARectWidth < MaxGradientWidth then
Result.cx := ARectWidth
else
Result.cx := MaxGradientWidth;
if ARectHeight < MaxGradientHeight then
Result.cy := ARectHeight
else
Result.cy := MaxGradientHeight;
end;
var
AOneColorRect: TRect;
I, J, ARectWidth, ARectHeight: Integer;
AGradientSize: TSize;
begin
AColor1 := ColorToRGB(AColor1);
AColor2 := ColorToRGB(AColor2);
if AColor1 = AColor2 then
begin
FillRectByColor(DC, ARect, AColor1);
Exit;
end;
AOneColorRect := ARect;
ARectWidth := ARect.Right - ARect.Left;
ARectHeight := ARect.Bottom - ARect.Top;
AGradientSize := GetGradientSize(ARect);
for I := 0 to AGradientSize.cy - 1 do
begin
AOneColorRect.Bottom := ARect.Top + MulDiv(I + 1, ARectHeight, AGradientSize.cy);
for J := 0 to AGradientSize.cx - 1 do
begin
AOneColorRect.Right := ARect.Left + MulDiv(J + 1, ARectWidth, AGradientSize.cx);
if not IsRectEmpty(AOneColorRect) then
FillRectByColor(DC, AOneColorRect, CalcRGBColor(AColor1, AColor2, AGradientSize, Point(J, I)));
AOneColorRect.Left := AOneColorRect.Right;
if AOneColorRect.Left >= ARect.Right then
Break;
end;
AOneColorRect.Top := AOneColorRect.Bottom;
if AOneColorRect.Top >= ARect.Bottom then
Break;
AOneColorRect.Left := ARect.Left;
end;
end;
class procedure TdxNavBarCustomBackgroundPainter.InternalDrawBackground(ACanvas: TCanvas; ARect: TRect;
APicture: TPicture; AEraseBackground: Boolean; ABackgroundColor: TColor;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode);
begin
if (APicture <> nil) and (APicture.Graphic <> nil) and not APicture.Graphic.Empty then
DrawPicture(ACanvas, ARect, APicture)
else
if AEraseBackground then
FillRectByColor(ACanvas.Handle, ARect, ABackgroundColor);
if (AColor1 = AColor2) and (AAlphaBlend1 = 255) and (AAlphaBlend2 = 255) then
FillRectByColor(ACanvas.Handle, ARect, AColor1)
else
InternalDrawGradientBackground(ACanvas, ARect, APicture, AEraseBackground,
ABackgroundColor, AColor1, AColor2, AAlphaBlend1, AAlphaBlend2, AGradientMode);
end;
class procedure TdxNavBarCustomBackgroundPainter.InternalDrawGradientBackground(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AEraseBackground: Boolean; ABackgroundColor: TColor;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
begin
if IsGdiPlusAvailable then
GdipFillGradientRect(ACanvas.Handle, ARect, AColor1, AColor2, AAlphaBlend1, AAlphaBlend2, AGradientMode)
else
if (AAlphaBlend1 <> 0) or (AAlphaBlend2 <> 0) then
FillGradientRect(ACanvas.Handle, ARect, AColor1, AColor2, AAlphaBlend1, AAlphaBlend2, AGradientMode);
end;
{ TdxNavBarCustomGroupBackgroundPainter }
class procedure TdxNavBarCustomGroupBackgroundPainter.DrawBackground(ACanvas: TCanvas;
ARect: TRect; APicture: TPicture; AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
begin
InternalDrawBackground(ACanvas, ARect, APicture, AColor1, AColor2,
AAlphaBlend1, AAlphaBlend2, AGradientMode);
end;
class procedure TdxNavBarCustomGroupBackgroundPainter.InternalDrawBackground(ACanvas: TCanvas; ARect:
TRect; APicture: TPicture; AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
begin
TdxNavBarCustomBackgroundPainter.DrawBackground(ACanvas, ARect, APicture, False, clNone,
AColor1, AColor2, AAlphaBlend1, AAlphaBlend2, AGradientMode);
end;
{ TdxNavBarCustomGroupBorderPainter }
class procedure TdxNavBarCustomGroupBorderPainter.InternalDrawBorder(ACanvas: TCanvas;
ARect: TRect; AColor: TColor; AWithCaption: Boolean);
begin
end;
class procedure TdxNavBarCustomGroupBorderPainter.DrawBorder(ACanvas: TCanvas;
ARect: TRect; AColor: TColor; AWithCaption: Boolean);
begin
InternalDrawBorder(ACanvas, ARect, AColor, AWithCaption);
end;
{ TdxNavBarCustomSignPainter }
class procedure TdxNavBarCustomSignPainter.DrawSign(ACanvas: TCanvas; ARect: TRect;
AForeColor, ABackColor1, ABackColor2: TColor; AState: TdxNavBarObjectStates);
begin
InternalDrawSign(ACanvas, ARect, AForeColor, ABackColor1, ABackColor2, AState);
end;
class procedure TdxNavBarCustomSignPainter.InternalDrawSign(ACanvas: TCanvas; ARect: TRect;
AForeColor, ABackColor1, ABackColor2: TColor; AState: TdxNavBarObjectStates);
begin
end;
{ TdxNavBarCustomHintPainter }
class procedure TdxNavBarCustomHintPainter.DrawHint(ACanvas: TCanvas; ARect: TRect;
AHint: string; APicture: TPicture; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
AFont: TFont);
begin
InternalDrawHint(ACanvas, ARect, AHint, APicture, AColor1, AColor2,
AAlphaBlend1, AAlphaBlend2, AGradientMode, AFont);
end;
class procedure TdxNavBarCustomHintPainter.InternalDrawHint(ACanvas: TCanvas;
ARect: TRect; AHint: string; APicture: TPicture; AColor1,
AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode; AFont: TFont);
begin
if AHint <> '' then
begin
TdxNavBarCustomBackgroundPainter.DrawBackground(ACanvas, ARect, APicture, True, clInfoBk,
AColor1, AColor2, AAlphaBlend1, AAlphaBlend2, AGradientMode);
Windows.DrawEdge(ACanvas.Handle, ARect, BDR_RAISEDOUTER, BF_RECT);
InflateRect(ARect, -1, -1);
Inc(ARect.Left, dxNavBarHintWindowTextOffset.X);
Inc(ARect.Top, dxNavBarHintWindowTextOffset.Y);
ACanvas.Font := AFont;
dxNavBarDrawText(ACanvas, AHint, ARect, DT_LEFT or DT_NOPREFIX or DT_WORDBREAK);
end;
end;
{ TdxNavBarCustomButtonPainter }
class procedure TdxNavBarCustomButtonPainter.DrawButton(ACanvas: TCanvas;
ARect: TRect; APicture: TPicture; AColor1, AColor2: TColor; AAlphaBlend1,
AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
begin
InternalDrawButton(ACanvas, ARect, APicture, AColor1, AColor2,
AAlphaBlend1, AAlphaBlend2, AGradientMode, ABorderColor, AState);
end;
class procedure TdxNavBarCustomButtonPainter.InternalDrawButton(ACanvas: TCanvas;
ARect: TRect; APicture: TPicture; AColor1, AColor2: TColor; AAlphaBlend1,
AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
begin
TdxNavBarCustomBackgroundPainter.DrawBackground(ACanvas, ARect, APicture, False, clBtnFace, AColor1, AColor2,
AAlphaBlend1, AAlphaBlend2, AGradientMode);
end;
{ TdxNavBarCustomScrollButtonsPainter }
class procedure TdxNavBarCustomScrollButtonsPainter.DrawBottomButton(
ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxNavBarCustomButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
begin
InternalDrawBottomButton(ACanvas, ARect, AButtonPainterClass, AColor1, AColor2,
AAlphaBlend1, AAlphaBlend2, AGradientMode, ABorderColor, AState);
end;
class procedure TdxNavBarCustomScrollButtonsPainter.DrawTopButton(ACanvas: TCanvas;
ARect: TRect; AButtonPainterClass: TdxNavBarCustomButtonPainterClass; AColor1,
AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
begin
InternalDrawTopButton(ACanvas, ARect, AButtonPainterClass, AColor1, AColor2,
AAlphaBlend1, AAlphaBlend2, AGradientMode, ABorderColor, AState);
end;
class procedure TdxNavBarCustomScrollButtonsPainter.InternalDrawBottomButton(
ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxNavBarCustomButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
begin
end;
class procedure TdxNavBarCustomScrollButtonsPainter.InternalDrawTopButton(
ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxNavBarCustomButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
begin
end;
{ TdxNavBarCustomDropTargetLinkPainter }
class procedure TdxNavBarCustomDropTargetLinkPainter.DrawTargetLink(
ACanvas: TCanvas; pt1, pt2, pt3, pt4, pt5, pt6: TPoint; AColor: TColor);
begin
InternalDrawTargetLink(ACanvas, pt1, pt2, pt3, pt4, pt5, pt6, AColor);
end;
class procedure TdxNavBarCustomDropTargetLinkPainter.InternalDrawTargetLink(
ACanvas: TCanvas; pt1, pt2, pt3, pt4, pt5, pt6: TPoint; AColor: TColor);
begin
ACanvas.Brush.Style := bsSolid;
ACanvas.Brush.Color := AColor;
ACanvas.Pen.Style := psSolid;
ACanvas.Pen.Color := AColor;
ACanvas.Polygon([pt1, pt2, pt3, pt1, pt4, pt5, pt6, pt4]);
end;
{ TdxNavBarCustomDropTargetGroupPainter }
class procedure TdxNavBarCustomDropTargetGroupPainter.DrawTargetGroup(ACanvas: TCanvas;
ARect: TRect; AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
begin
InternalDrawTargetGroup(ACanvas, ARect, AColor1, AColor2,
AAlphaBlend1, AAlphaBlend2, AGradientMode);
end;
class procedure TdxNavBarCustomDropTargetGroupPainter.InternalDrawTargetGroup(
ACanvas: TCanvas; ARect: TRect; AColor1, AColor2: TColor; AAlphaBlend1,
AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode);
begin
if IsGdiPlusAvailable then
TdxNavBarCustomBackgroundPainter.DrawBackground(ACanvas, ARect, nil, False, clBlack,
AColor1, AColor2, AAlphaBlend1, AAlphaBlend2, AGradientMode)
else
with TcxCanvas.Create(ACanvas) do
begin
DrawComplexFrame(ARect, AColor1, AColor1, cxBordersAll, 2);
Free;
end;
end;
{ TdxNavBarElementPainter }
procedure TdxNavBarElementPainter.DrawBackground;
begin
with ViewInfo do
BackgroundPainterClass.DrawBackground(Canvas, NavBar.ClientRect, BgImage, True, NavBar.Color,
BgBackColor, BgBackColor2, BgAlphaBlend, BgAlphaBlend2,
BgGradientMode);
end;
procedure TdxNavBarElementPainter.DrawDropTargetGroupSelection;
var
AGroupViewInfo: TdxNavBarGroupViewInfo;
begin
if not NavBar.EnableDragging or (NavBar.SourceGroup = nil) or
not (fAllowDropGroup in NavBar.DragDropFlags) then exit;
AGroupViewInfo := ViewInfo.GetGroupViewInfoAtCaptionPos(NavBar.TargetPoint);
if AGroupViewInfo = nil then
AGroupViewInfo := ViewInfo.GetGroupViewInfoAtItemsPos(NavBar.TargetPoint);
if (AGroupViewInfo <> nil) and (AGroupViewInfo.Group <> NavBar.SourceGroup) then
with ViewInfo do
DropTargetGroupPainterClass.DrawTargetGroup(Canvas, AGroupViewInfo.CaptionRect,
DragDropGroupTargetBackColor, DragDropGroupTargetBackColor2,
DragDropGroupTargetAlphaBlend, DragDropGroupTargetAlphaBlend2,
DragDropGroupTargetGradient);
end;
procedure TdxNavBarElementPainter.DrawDropTargetLinkSelection;
var
Item1, Item2: TdxNavBarLinkViewInfo;
ItemGroup: TdxNavBarGroupViewInfo;
begin
if not NavBar.EnableDragging or ((NavBar.SourceLink = nil) and (NavBar.SourceItem = nil)) or
not (fAllowDropLink in NavBar.DragDropFlags) then exit;
ViewInfo.GetViewInfoAtDragPosition(NavBar.TargetPoint, ItemGroup, Item1, Item2);
if (Item1 <> nil) and (NavBar.SourceItem = nil) and (Item1.Link = NavBar.SourceLink) then exit;
if (Item2 <> nil) and (NavBar.SourceItem = nil) and (Item2.Link = NavBar.SourceLink) then exit;
if (Item1 <> nil) or (Item2 <> nil) then
DoDrawDropTargetLinkSelection(ItemGroup, Item1, Item2)
end;
procedure TdxNavBarElementPainter.DrawGroupBackground(AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
with AGroupViewInfo do
GroupBackgroundPainterClass.DrawBackground(Canvas, ItemsRect, BgImage,
BgBackColor, BgBackColor2, BgAlphaBlend, BgAlphaBlend2, BgGradientMode);
end;
procedure TdxNavBarElementPainter.DrawGroupBorder(AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
if not TdxNavBarViewInfoAccess(ViewInfo).IsGroupActive(AGroupViewInfo.Group) then exit;
with AGroupViewInfo do
GroupBorderPainterClass.DrawBorder(Canvas, ItemsRect, BorderColor, IsCaptionVisible);
end;
procedure TdxNavBarElementPainter.DrawGroupCaptionButton(AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
with AGroupViewInfo do
ButtonPainterClass.DrawButton(Canvas, CaptionRect, CaptionImage,
CaptionBackColor, CaptionBackColor2, CaptionAlphaBlend, CaptionAlphaBlend2,
CaptionGradientMode, CaptionBorderColor, State);
end;
procedure TdxNavBarElementPainter.DrawGroupCaptionImage(AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
with AGroupViewInfo do
ImagePainterClass.DrawImage(Canvas, ImageList, ImageIndex, CaptionImageRect);
end;
procedure TdxNavBarElementPainter.DrawGroupCaptionSign(AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
if AGroupViewInfo.Group.ShowExpandButton then
with AGroupViewInfo do
SignPainterClass.DrawSign(Canvas, CaptionSignRect, CaptionSignColor,
CaptionBackColor, CaptionBackColor2, State);
end;
procedure TdxNavBarElementPainter.DrawGroupControl(ACanvas: TCanvas; ARect: TRect; AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
with AGroupViewInfo do
GroupBackgroundPainterClass.DrawBackground(ACanvas, ARect, ControlImage,
ControlBackColor, ControlBackColor2, ControlAlphaBlend, ControlAlphaBlend2,
ControlGradientMode);
end;
procedure TdxNavBarElementPainter.DrawItemImage(ALinkViewInfo: TdxNavBarLinkViewInfo);
begin
with TdxNavBarLinkViewInfoAccess(ALinkViewInfo) do
begin
ImagePainterClass.DrawImage(Canvas, ImageList, ImageIndex, ImageRect,
IsEnabled or UseDisabledImages);
if IsRectEmpty(CaptionRect) and Link.IAccessibilityHelper.IsFocused then
DrawSolidFocusRect(cxRectInflate(ImageRect, 1, 1), FontColor);
end;
end;
procedure TdxNavBarElementPainter.DrawItemSelection(ALinkViewInfo: TdxNavBarLinkViewInfo);
begin
with ALinkViewInfo do
if Item.Enabled then
SelectionPainterClass.DrawSelection(Canvas, SelectionRect, GroupViewInfo.BgBackColor, State);
end;
procedure TdxNavBarElementPainter.DrawBottomScrollButton;
begin
with ViewInfo do
begin
ScrollButtonsPainterClass.DrawBottomButton(Canvas, BottomScrollButtonRect,
ButtonPainterClass, BottomScrollButtonBackColor, BottomScrollButtonBackColor2,
BottomScrollButtonAlphaBlend, BottomScrollButtonAlphaBlend2, BottomScrollButtonGradientMode,
BorderColor, BottomScrollButtonState);
with BottomScrollButtonRect do
ExcludeClipRect(Canvas.Handle, Left, Top, Right, Bottom);
end;
end;
procedure TdxNavBarElementPainter.DrawTopScrollButton;
begin
with ViewInfo do
begin
ScrollButtonsPainterClass.DrawTopButton(Canvas, TopScrollButtonRect,
ButtonPainterClass, TopScrollButtonBackColor, TopScrollButtonBackColor2,
TopScrollButtonAlphaBlend, TopScrollButtonAlphaBlend2, TopScrollButtonGradientMode,
BorderColor, TopScrollButtonState);
with TopScrollButtonRect do
ExcludeClipRect(Canvas.Handle, Left, Top, Right, Bottom);
end;
end;
procedure TdxNavBarElementPainter.DoDrawDropTargetLinkSelection(AItemGroup: TdxNavBarGroupViewInfo;
AItem1, AItem2: TdxNavBarLinkViewInfo);
var
lpt1, lpt2, lapt1, lapt2, lapt3, rapt1, rapt2, rapt3: TPoint;
AViewInfoAccess: TdxNavBarViewInfoAccess;
begin
if AItem1 <> nil then
begin
if not AItemGroup.IsViewAsIconView then
lpt1 := cxRectLeftBottom(AItem1.Rect)
else
lpt1 := cxRectRightTop(AItem1.Rect);
lpt2 := AItem1.Rect.BottomRight;
end
else
begin
lpt1 := AItem2.Rect.TopLeft;
if not AItemGroup.IsViewAsIconView then
lpt2 := cxRectRightTop(AItem2.Rect)
else
lpt2 := cxRectLeftBottom(AItem2.Rect);
end;
AViewInfoAccess := TdxNavBarViewInfoAccess(ViewInfo);
if PtInRect(cxRectInflate(AItemGroup.ItemsRect, 1, 1), lpt1) and PtInRect(cxRectInflate(AItemGroup.ItemsRect, 1, 1), lpt2) then
begin
lapt1 := lpt1;
lapt2 := lpt1;
lapt3 := lpt1;
rapt1 := lpt2;
rapt2 := lpt2;
rapt3 := lpt2;
if not AItemGroup.IsViewAsIconView then
begin
lapt1.x := lpt1.x + AViewInfoAccess.GetDragArrowWidth;
if AItem1 <> nil then
lapt2.y := lpt1.y - AViewInfoAccess.GetDragArrowHeight div 2;
if AItem2 <> nil then
lapt3.y := lpt1.y + AViewInfoAccess.GetDragArrowHeight div 2;
rapt1.x := lapt1.x + cxRectWidth(AItemGroup.Rect) - 1 - 2 * AViewInfoAccess.GetDragArrowWidth;
rapt2.x := lapt2.x + cxRectWidth(AItemGroup.Rect) - 1;
rapt2.y := lapt2.y;
rapt3.x := lapt3.x + cxRectWidth(AItemGroup.Rect) - 1;
rapt3.y := lapt3.y;
end;
DropTargetLinkPainterClass.DrawTargetLink(Canvas, lapt1, lapt2, lapt3, rapt1, rapt2, rapt3,
ViewInfo.DragDropItemTargetBackColor);
end;
end;
procedure TdxNavBarElementPainter.DoDrawHint(ACanvas: TCanvas; const ARect: TRect);
begin
with ViewInfo do
TdxNavBarCustomHintPainter.DrawHint(ACanvas, ARect,
ViewInfo.HintText, HintImage, HintBackColor, HintBackColor2,
HintAlphaBlend, HintAlphaBlend2, HintGradientMode, HintFont);
end;
class function TdxNavBarElementPainter.BackgroundPainterClass: TdxNavBarCustomBackgroundPainterClass;
begin
Result := TdxNavBarCustomBackgroundPainter;
end;
class function TdxNavBarElementPainter.ButtonPainterClass: TdxNavBarCustomButtonPainterClass;
begin
Result := TdxNavBarCustomButtonPainter;
end;
class function TdxNavBarElementPainter.DropTargetGroupPainterClass: TdxNavBarCustomDropTargetGroupPainterClass;
begin
Result := TdxNavBarCustomDropTargetGroupPainter;
end;
class function TdxNavBarElementPainter.DropTargetLinkPainterClass: TdxNavBarCustomDropTargetLinkPainterClass;
begin
Result := TdxNavBarCustomDropTargetLinkPainter;
end;
class function TdxNavBarElementPainter.GroupBackgroundPainterClass: TdxNavBarCustomGroupBackgroundPainterClass;
begin
Result := TdxNavBarCustomGroupBackgroundPainter;
end;
class function TdxNavBarElementPainter.GroupBorderPainterClass: TdxNavBarCustomGroupBorderPainterClass;
begin
Result := TdxNavBarCustomGroupBorderPainter;
end;
class function TdxNavBarElementPainter.ImagePainterClass: TdxNavBarCustomImagePainterClass;
begin
Result := TdxNavBarCustomImagePainter;
end;
class function TdxNavBarElementPainter.ScrollButtonsPainterClass: TdxNavBarCustomScrollButtonsPainterClass;
begin
Result := TdxNavBarCustomScrollButtonsPainter;
end;
class function TdxNavBarElementPainter.SelectionPainterClass: TdxNavBarCustomSelectionPainterClass;
begin
Result := TdxNavBarCustomSelectionPainter;
end;
class function TdxNavBarElementPainter.SignPainterClass: TdxNavBarCustomSignPainterClass;
begin
Result := TdxNavBarCustomSignPainter;
end;
end.