Componentes.Terceros.DevExp.../internal/x.46/1/ExpressNavBar 2/Sources/dxNavBarGraphics.pas
2009-10-27 17:09:30 +00:00

1098 lines
38 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 dxNavBarGraphics;
{$I cxVer.inc}
interface
uses
{$IFDEF DELPHI6}
Types,
{$ENDIF}
Windows, Classes, Controls, CommCtrl, Graphics, ImgList,
cxClasses, cxGraphics, dxNavBar, dxNavBarStyles, dxNavBarCustomPainters;
type
TXPScheme = (schUnknown, schNormalColor, schHomestead, schMetallic);
TXPSchemeColor = schNormalColor .. schMetallic;
var
// AdvExplorerBar bitmaps, colors and fonts
dxAdvExplorerBarGroupCaptionCollapseSignBitmap: TBitmap;
dxAdvExplorerBarGroupCaptionExpandSignBitmap: TBitmap;
// dxAdvExplorerBarSpecialGroupCaptionCollapseSignBitmap: TBitmap;
// dxAdvExplorerBarSpecialGroupCaptionExpandSignBitmap: TBitmap;
dxAdvExplorerBarBackgroundColor1: COLORREF;
dxAdvExplorerBarBackgroundColor2: COLORREF;
dxAdvExplorerBarFontColor: COLORREF;
dxAdvExplorerBarFontHotColor: COLORREF;
dxAdvExplorerBarGroupBackgroundColor: COLORREF;
dxAdvExplorerBarGroupCaptionColor1: COLORREF;
dxAdvExplorerBarGroupCaptionColor2: COLORREF;
dxAdvExplorerBarGroupCaptionSignColor: COLORREF;
dxAdvExplorerBarGroupCaptionSignHotColor: COLORREF;
dxAdvExplorerBarGroupFontColor: COLORREF;
dxAdvExplorerBarGroupFontHotColor: COLORREF;
dxAdvExplorerBarSpecialGroupCaptionColor1: COLORREF;
dxAdvExplorerBarSpecialGroupCaptionColor2: COLORREF;
dxAdvExplorerBarSpecialGroupCaptionSignColor: COLORREF;
dxAdvExplorerBarSpecialGroupCaptionSignHotColor: COLORREF;
dxAdvExplorerBarSpecialGroupFontColor: COLORREF;
dxAdvExplorerBarSpecialGroupFontHotColor: COLORREF;
// Office11 color and bitmaps
dxOffice11BackgroundColor1: COLORREF;
dxOffice11BackgroundColor2: COLORREF;
dxOffice11GroupBackgroundColor1: COLORREF;
dxOffice11GroupBackgroundColor2: COLORREF;
dxOffice11GroupCaptionColor1: COLORREF;
dxOffice11GroupCaptionColor2: COLORREF;
dxOffice11GroupBorderColor: COLORREF;
dxOffice11GroupFontColor: COLORREF;
dxOffice11LinkFontColor: COLORREF;
dxOffice11CaptionExpandSignBitmap: TBitmap;
dxOffice11CaptionCollapseSignBitmap: TBitmap;
// Office11 NavPane bitmaps
dxOffice11NavPaneOverflowPanelBitmap: TBitmap;
dxOffice11NavPaneSplitterBitmap: TBitmap;
dxOffice11NavPaneArrowUpBitmap: TBitmap;
dxOffice11NavPaneArrowDownBitmap: TBitmap;
dxOffice11NavPaneDefaultLargeBitmap: TBitmap;
dxOffice11NavPaneDefaultSmallBitmap: TBitmap;
// XPExplorerBar bitmaps, colors and fonts
dxXPExplorerBarSpecialGroupHeader: TBitmap;
dxXPExplorerBarNormalGroupHeader: TBitmap;
dxXPExplorerBarSpecialGroupCollapseHot: TBitmap;
dxXPExplorerBarNormalGroupCollapseHot: TBitmap;
dxXPExplorerBarSpecialGroupCollapse: TBitmap;
dxXPExplorerBarNormalGroupCollapse: TBitmap;
dxXPExplorerBarSpecialGroupExpandHot: TBitmap;
dxXPExplorerBarNormalGroupExpandHot: TBitmap;
dxXPExplorerBarSpecialGroupExpand: TBitmap;
dxXPExplorerBarNormalGroupExpand: TBitmap;
dxXPExplorerBarBackground: TBitmap;
dxXPExplorerBarItemFont: TFont;
dxXPExplorerBarItemFontHot: TFont;
dxXPExplorerBarGroupHeaderFont: TFont;
dxXPExplorerBarGroupHeaderFontHot: TFont;
dxXPExplorerBarBackgroundColor1: TColor = clNone; // TODO ???
dxXPExplorerBarBackgroundColor2: TColor = clNone; // TODO ???
dxXPExplorerBarGroupBackgroundColor1: TColor = clNone; // TODO ???
dxXPExplorerBarGroupBackgroundColor2: TColor = clNone; // TODO ???
dxXPExplorerBarGroupBorderColor: TColor = clNone;
procedure CreateAdvExplorerBarColors;
procedure RefreshAdvExplorerBarColors;
procedure ReleaseAdvExplorerBarColors;
procedure CreateOffice11Colors;
procedure RefreshOffice11Colors;
procedure ReleaseOffice11Colors;
procedure CreateOffice11NavPaneColors;
procedure RefreshOffice11NavPaneColors;
procedure ReleaseOffice11NavPaneColors;
function CheckShellInstance: Boolean;
procedure CreateXPExplorerBarColors;
procedure RefreshXPExplorerBarColors;
procedure ReleaseXPExplorerBarColors;
function XPScheme: TXPScheme;
function LightColor(AColor: TColor): TColor;
function LightLightColor(AColor: TColor): TColor;
function DarkColor(AColor: TColor): TColor;
function DarkDarkColor(AColor: TColor): TColor;
function LightBorderColor(AColor: TColor): TColor;
function LightLightBorderColor(AColor: TColor): TColor;
function DarkBorderColor(AColor: TColor): TColor;
function DarkDarkBorderColor(AColor: TColor): TColor;
function CalcColor(d: Integer): TColor;
function CalcTextColor(AColor: TColor; AState: TdxNavBarObjectStates): TColor;
function GetFontHeight(AFont: TFont): Integer;
procedure GetSystemFont(AFont: TFont);
procedure dxNavBarDrawSelectedFrame(ACanvas: TCanvas; const ARect: TRect; ATopLeftOuterColor, ABottomRightOuterColor,
ATopLeftInnerColor, ABottomRightInnerColor: TColor);
function dxNavBarDrawText(ACanvas: TCanvas; const AText: string; var ARect: TRect;
AFormat: UINT; ACharCount: Integer = - 1; ABrushStyle: TBrushStyle = bsClear): Integer;
procedure RGBQuadToColorRef(AColor: TRGBQuad; out ARevertedColor: COLORREF);
procedure ColorRefToRGBQuad(AColor: COLORREF; out ARevertedColor: TRGBQuad);
type
PARGB = ^ARGB;
ARGB = DWORD;
{$EXTERNALSYM ARGB}
ARGB64 = Int64;
{$EXTERNALSYM ARGB64}
PdxGPColor = ^TdxGPColor;
TdxGPColor = ARGB;
TdxGPColorDynArray = array of TdxGPColor;
// Color
const
AlphaShift = 24;
{$EXTERNALSYM AlphaShift}
RedShift = 16;
{$EXTERNALSYM RedShift}
GreenShift = 8;
{$EXTERNALSYM GreenShift}
BlueShift = 0;
{$EXTERNALSYM BlueShift}
AlphaMask = $ff000000;
{$EXTERNALSYM AlphaMask}
RedMask = $00ff0000;
{$EXTERNALSYM RedMask}
GreenMask = $0000ff00;
{$EXTERNALSYM GreenMask}
BlueMask = $000000ff;
{$EXTERNALSYM BlueMask}
function IsGdiPlusAvailable: Boolean;
function MakeColor(r, g, b: Byte): TdxGPColor; overload;
function MakeColor(a, r, g, b: Byte): TdxGPColor; overload;
function MakeColor(color: TColor; alpha: Byte): TdxGPColor; overload;
function GetAlpha(color: ARGB): BYTE;
function GetRed(color: ARGB): BYTE;
function GetGreen(color: ARGB): BYTE;
function GetBlue(color: ARGB): BYTE;
function ColorRefToARGB(rgb: COLORREF): ARGB;
function ARGBToColorRef(Color: ARGB): COLORREF;
procedure GdipFillGradientRect(DC: HDC; const ARect: TRect; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode);
implementation
uses
SysUtils, Math, cxGeometry, dxGDIPlusAPI, dxGDIPlusClasses,
dxThemeConsts, dxUxTheme, dxThemeManager, dxOffice11;
const
ShellLibraryName = 'shell32.dll';
type
TdxSHGetShellStyleHInstance = function: LongWord; stdcall;
PdxSHGetShellStyleHInstance = ^TdxSHGetShellStyleHInstance;
var
FCounterAdvExplorerBar: Integer;
FCounterOffice11: Integer;
FCounterOffice11NavPane: Integer;
FCounterXPExplorerBar: Integer;
FShellLibrary: HMODULE;
FSHGetShellStyleHInstancePointer: PdxSHGetShellStyleHInstance;
FSHGetShellStyleHInstance: TdxSHGetShellStyleHInstance;
FShellInstance: LongInt;
{ TdxStyleSheetParser }
type
TdxStyleSheetParser = class
private
FStyles: TStringList;
function TrimChars(AText: string): string;
function LeftString(AText: string; APos: Integer): string;
function RightString(AText: string; APos: Integer): string;
function MiddleString(AText: string; AStartPos, AEndPos: Integer): string;
protected
function GetStyleText(AStyleName: string): string;
function GetStyleAttributeText(AStyleText, AAttributeName: string): string;
procedure ParseColorName(var AColor: TColor; AAttributeText: string);
procedure ParseColor(var AColor: TColor; AAttributeText: string);
procedure ParseFontWeight(AFont: TFont; AStyleText: string);
procedure ParseFontDecoration(AFont: TFont; AStyleText: string);
procedure ParseFontColor(AFont: TFont; AStyleText: string);
procedure ParseFontSize(AFont: TFont; AStyleText: string);
public
constructor Create(AText: string);
destructor Destroy; override;
procedure ParseBackgroundColor(var AColor: TColor; AStyleName: string);
procedure ParseBorderColor(var AColor: TColor; AStyleName: string);
procedure ParseFont(AFont: TFont; AStyleName: string);
end;
constructor TdxStyleSheetParser.Create(AText: string);
begin
FStyles := TStringList.Create;
FStyles.Text := Trim(AText);
end;
destructor TdxStyleSheetParser.Destroy;
begin
FStyles.Free;
inherited;
end;
procedure TdxStyleSheetParser.ParseBackgroundColor(var AColor: TColor; AStyleName: string);
var
AStyleText, AStyleAttributeText: string;
begin
AStyleText := StringReplace(GetStyleText(AStyleName), ' ', '', [rfReplaceAll]);
if AStyleText <> '' then
begin
AStyleAttributeText := GetStyleAttributeText(AStyleText, 'BACKGROUND-COLOR:');
ParseColor(AColor, StringReplace(AStyleAttributeText, ' ', '', [rfReplaceAll]));
end
end;
procedure TdxStyleSheetParser.ParseBorderColor(var AColor: TColor; AStyleName: string);
var
APos: Integer;
AStyleText, AStyleAttributeText: string;
begin
AStyleText := StringReplace(GetStyleText(AStyleName), ' ', '', [rfReplaceAll]);
if AStyleText <> '' then
begin
AStyleAttributeText := GetStyleAttributeText(AStyleText, 'BORDER:');
AStyleAttributeText := StringReplace(AStyleAttributeText, '''', '', [rfReplaceAll]);
APos := Pos(' ', AStyleAttributeText);
if APos > 0 then
AStyleAttributeText := RightString(AStyleAttributeText, APos + 1);
APos := Pos(' ', AStyleAttributeText);
if APos > 0 then
AStyleAttributeText := RightString(AStyleAttributeText, APos + 1);
ParseColor(AColor, StringReplace(AStyleAttributeText, ' ', '', [rfReplaceAll]));
end;
end;
procedure TdxStyleSheetParser.ParseFont(AFont: TFont; AStyleName: string);
var
AStyleText: string;
begin
AStyleText := StringReplace(GetStyleText(AStyleName), ' ', '', [rfReplaceAll]);
if AStyleText <> '' then
begin
ParseFontSize(AFont, AStyleText);
ParseFontWeight(AFont, AStyleText);
ParseFontDecoration(AFont, AStyleText);
ParseFontColor(AFont, AStyleText);
end;
end;
procedure TdxStyleSheetParser.ParseFontWeight(AFont: TFont; AStyleText: string);
var
AFontWeight: string;
begin
AFontWeight := UpperCase(GetStyleAttributeText(AStyleText, 'FONT-WEIGHT:'));
if AFontWeight = 'BOLD' then
AFont.Style := AFont.Style + [fsBold]
else if AFontWeight = 'NORMAL' then
AFont.Style := AFont.Style - [fsBold];
end;
procedure TdxStyleSheetParser.ParseFontDecoration(AFont: TFont; AStyleText: string);
var
AFontDecoration: string;
begin
AFontDecoration := UpperCase(GetStyleAttributeText(AStyleText, 'TEXT-DECORATION:'));
if AFontDecoration = 'UNDERLINE' then
AFont.Style := AFont.Style + [fsUnderline]
else if AFontDecoration = 'NONE' then
AFont.Style := AFont.Style - [fsUnderline];
end;
procedure TdxStyleSheetParser.ParseFontColor(AFont: TFont; AStyleText: string);
var
AFontColor: TColor;
AFontColorString: string;
begin
AFontColorString := GetStyleAttributeText(AStyleText, 'COLOR:');
if AFontColorString <> '' then
begin
ParseColor(AFontColor, AFontColorString);
if AFontColor > 0 then
AFont.Color := AFontColor;
end;
end;
procedure TdxStyleSheetParser.ParseFontSize(AFont: TFont; AStyleText: string);
var
AFontSize: string;
begin
AFontSize := TrimChars(GetStyleAttributeText(AStyleText, 'FONT-SIZE:'));
if AFontSize <> '' then
AFont.Size := StrToInt(AFontSize);
end;
function TdxStyleSheetParser.GetStyleText(AStyleName: string): string;
var
I: Integer;
begin
Result := '';
for I := 0 to FStyles.Count - 1 do
if Pos(UpperCase(AStyleName), UpperCase(FStyles[I])) = 1 then
begin
Result := FStyles[I];
break;
end;
end;
function TdxStyleSheetParser.GetStyleAttributeText(AStyleText, AAttributeName: string): string;
var
ABeginPos, AEndPos: Integer;
begin
Result := '';
ABeginPos := Pos(UpperCase(AAttributeName), UpperCase(AStyleText));
if ABeginPos > 0 then
begin
ABeginPos := ABeginPos + Length(AAttributeName);
Result := RightString(AStyleText, ABeginPos);
AEndPos := Pos(';', Result);
if AEndPos = 0 then
AEndPos := Pos('}', Result);
if AEndPos > 0 then
Result := LeftString(Result, AEndPos);
end;
end;
procedure TdxStyleSheetParser.ParseColorName(var AColor: TColor; AAttributeText: string);
begin
cxColorByName(AAttributeText, AColor);
end;
procedure TdxStyleSheetParser.ParseColor(var AColor: TColor; AAttributeText: string);
var
APos: Integer;
R, G, B: Byte;
begin
APos := Pos('#', AAttributeText);
if APos > 0 then
begin
AAttributeText := RightString(AAttributeText, APos + 1);
R := StrToInt('$' + MiddleString(AAttributeText, 1, 2));
G := StrToInt('$' + MiddleString(AAttributeText, 3, 4));
B := StrToInt('$' + MiddleString(AAttributeText, 5, 6));
AColor := RGB(R, G, B);
end
else
ParseColorName(AColor, AAttributeText);
end;
function TdxStyleSheetParser.TrimChars(AText: string): string;
var
I: Integer;
begin
Result := '';
for I := 1 to Length(AText) do
if (AText[I] >= '0') and (AText[I] <= '9') then
Result := Result + AText[I];
end;
function TdxStyleSheetParser.LeftString(AText: string; APos: Integer): string;
begin
Result := Copy(AText, 1, APos - 1);
end;
function TdxStyleSheetParser.RightString(AText: string; APos: Integer): string;
begin
Result := Copy(AText, APos, Length(AText) - APos + 1);
end;
function TdxStyleSheetParser.MiddleString(AText: string; AStartPos, AEndPos: Integer): string;
begin
Result := Copy(AText, AStartPos, AEndPos - AStartPos + 1);
end;
{ utilities }
procedure InitAdvExplorerBarColors;
const
Colors: array[TXPSchemeColor, 0..11] of COLORREF = (
($E7A27B, $D67563, $C65D21, $FF8E42, $F7DFD6, $FFFFFF, $F7D3C6, $B54900, $CE5D29, $A53C00, $FFCDAC, $FF8E42),
($ADD9CC, $84BDA5, $2D6656, $1D9272, $ECF6F6, $ECFCFF, $B8E7E0, $408C77, $67A896, $1C674B, $BEEDDD, $B8E7E0),
($D4C8C4, $C8B3B1, $3D3D3F, $7C7C7E, $F5F1F0, $FFFFFF, $E0D7D6, $927777, $C7B6B4, $734431, $FEFEF9, $E6E6E6)
);
var
AColorScheme: TXPScheme;
begin
AColorScheme := XPScheme;
if AColorScheme <> schUnknown then
begin
dxAdvExplorerBarBackgroundColor1 := Colors[AColorScheme, 0];
dxAdvExplorerBarBackgroundColor2 := Colors[AColorScheme, 1];
dxAdvExplorerBarFontColor := Colors[AColorScheme, 2];
dxAdvExplorerBarFontHotColor := Colors[AColorScheme, 3];
dxAdvExplorerBarGroupBackgroundColor := Colors[AColorScheme, 4];
dxAdvExplorerBarGroupCaptionColor1 := Colors[AColorScheme, 5];
dxAdvExplorerBarGroupCaptionColor2 := Colors[AColorScheme, 6];
dxAdvExplorerBarGroupFontColor := dxAdvExplorerBarFontColor;
dxAdvExplorerBarGroupFontHotColor := dxAdvExplorerBarFontHotColor;
dxAdvExplorerBarSpecialGroupCaptionColor1 := Colors[AColorScheme, 7];
dxAdvExplorerBarSpecialGroupCaptionColor2 := Colors[AColorScheme, 8];
dxAdvExplorerBarGroupCaptionSignColor := Colors[AColorScheme, 9];
dxAdvExplorerBarGroupCaptionSignHotColor := dxAdvExplorerBarFontHotColor;
dxAdvExplorerBarSpecialGroupCaptionSignColor := dxAdvExplorerBarGroupCaptionSignColor;//clWhite;
dxAdvExplorerBarSpecialGroupCaptionSignHotColor := dxAdvExplorerBarGroupCaptionSignHotColor;//Colors[AColorScheme, 10];
dxAdvExplorerBarSpecialGroupFontColor := clWhite;
dxAdvExplorerBarSpecialGroupFontHotColor := Colors[AColorScheme, 11];
end
else
begin
dxAdvExplorerBarBackgroundColor1 := ColorToRGB(clInactiveCaption);
dxAdvExplorerBarBackgroundColor2 := dxAdvExplorerBarBackgroundColor1;
dxAdvExplorerBarFontColor := CalcTextColor(clNone, []);
dxAdvExplorerBarFontHotColor := CalcTextColor(clNone, [sHotTracked]);
dxAdvExplorerBarGroupBackgroundColor := LightLightColor(clInactiveCaption);
dxAdvExplorerBarGroupCaptionColor1 := ColorToRGB(clWindow);
dxAdvExplorerBarGroupCaptionColor2 := LightLightColor(clHighlight);
dxAdvExplorerBarGroupFontColor := dxAdvExplorerBarFontColor;
dxAdvExplorerBarGroupFontHotColor := dxAdvExplorerBarFontHotColor;
dxAdvExplorerBarSpecialGroupCaptionColor1 := ColorToRGB(clHighlight);
dxAdvExplorerBarSpecialGroupCaptionColor2 := dxAdvExplorerBarSpecialGroupCaptionColor1;
dxAdvExplorerBarGroupCaptionSignColor := dxAdvExplorerBarGroupFontColor;
dxAdvExplorerBarGroupCaptionSignHotColor := dxAdvExplorerBarGroupFontHotColor;
dxAdvExplorerBarSpecialGroupCaptionSignColor := dxAdvExplorerBarSpecialGroupCaptionColor2;
dxAdvExplorerBarSpecialGroupCaptionSignHotColor := dxAdvExplorerBarSpecialGroupCaptionColor2;
dxAdvExplorerBarSpecialGroupFontColor := ColorToRGB(clCaptionText);
dxAdvExplorerBarSpecialGroupFontHotColor := dxAdvExplorerBarSpecialGroupFontColor;
end;
end;
procedure CreateAdvExplorerBarBitmaps;
begin
dxAdvExplorerBarGroupCaptionCollapseSignBitmap := TBitmap.Create;
dxAdvExplorerBarGroupCaptionCollapseSignBitmap.Handle := LoadBitmap(HInstance, 'DXNAVBARADVEXPLORERBARGROUPCAPTIONCOLLAPSESIGN');
dxAdvExplorerBarGroupCaptionExpandSignBitmap := TBitmap.Create;
dxAdvExplorerBarGroupCaptionExpandSignBitmap.Handle := LoadBitmap(HInstance, 'DXNAVBARADVEXPLORERBARGROUPCAPTIONEXPANDSIGN');
// dxAdvExplorerBarSpecialGroupCaptionCollapseSignBitmap := TBitmap.Create;
// dxAdvExplorerBarSpecialGroupCaptionCollapseSignBitmap.Handle := LoadBitmap(HInstance, 'DXNAVBARADVEXPLORERBARSPECIALGROUPCAPTIONCOLLAPSESIGN');
// dxAdvExplorerBarSpecialGroupCaptionExpandSignBitmap := TBitmap.Create;
// dxAdvExplorerBarSpecialGroupCaptionExpandSignBitmap.Handle := LoadBitmap(HInstance, 'DXNAVBARADVEXPLORERBARSPECIALGROUPCAPTIONEXPANDSIGN');
end;
procedure DestroyAdvExplorerBarBitmaps;
begin
dxAdvExplorerBarGroupCaptionCollapseSignBitmap.Free;
dxAdvExplorerBarGroupCaptionCollapseSignBitmap := nil;
dxAdvExplorerBarGroupCaptionExpandSignBitmap.Free;
dxAdvExplorerBarGroupCaptionExpandSignBitmap := nil;
// dxAdvExplorerBarSpecialGroupCaptionCollapseSignBitmap.Free;
// dxAdvExplorerBarSpecialGroupCaptionCollapseSignBitmap := nil;
// dxAdvExplorerBarSpecialGroupCaptionExpandSignBitmap.Free;
// dxAdvExplorerBarSpecialGroupCaptionExpandSignBitmap := nil;
end;
procedure CreateAdvExplorerBarColors;
begin
if FCounterAdvExplorerBar = 0 then
begin
InitAdvExplorerBarColors;
CreateAdvExplorerBarBitmaps;
end;
Inc(FCounterAdvExplorerBar);
end;
procedure RefreshAdvExplorerBarColors;
begin
InitAdvExplorerBarColors;
if FCounterAdvExplorerBar > 0 then
begin
DestroyAdvExplorerBarBitmaps;
CreateAdvExplorerBarBitmaps;
end;
end;
procedure ReleaseAdvExplorerBarColors;
begin
Dec(FCounterAdvExplorerBar);
if FCounterAdvExplorerBar = 0 then
DestroyAdvExplorerBarBitmaps;
end;
procedure InitOffice11Colors;
const
Office11Colors: array[TXPSchemeColor, 0..8] of COLORREF = (
($FADAC4, $C97A4A, $FEECDD, $F1D0BA, $F9DBC4, $E08F65, $FFFFFF, $862D00, $B23D00),
($E7F2F3, $98C6BE, $FFFFFF, $E7F2F3, $AEDFD2, $80B0A1, $FFFFFF, $466B5A, $5E8674),
($F4EEEE, $C3B0B1, $FCFBFB, $F5F0F0, $DFD0D0, $BFA8A9, $FFFFFF, $795B5C, $99797A)
);
var
AOffice11Scheme: TXPScheme;
begin
AOffice11Scheme := XPScheme;
if AreVisualStylesAvailable and (AOffice11Scheme <> schUnknown){luna} then
begin
dxOffice11BackgroundColor1 := Office11Colors[AOffice11Scheme, 0];
dxOffice11BackgroundColor2 := Office11Colors[AOffice11Scheme, 1];
dxOffice11GroupBackgroundColor1 := Office11Colors[AOffice11Scheme, 2];
dxOffice11GroupBackgroundColor2 := Office11Colors[AOffice11Scheme, 3];
dxOffice11GroupCaptionColor1 := Office11Colors[AOffice11Scheme, 4];
dxOffice11GroupCaptionColor2 := Office11Colors[AOffice11Scheme, 5];
dxOffice11GroupBorderColor := Office11Colors[AOffice11Scheme, 6];
dxOffice11GroupFontColor := Office11Colors[AOffice11Scheme, 7];
dxOffice11LinkFontColor := Office11Colors[AOffice11Scheme, 8];
end
else
begin
dxOffice11BackgroundColor1 := GetMiddleRGB(clBtnFace, clWindow, 50);
dxOffice11BackgroundColor2 := GetMiddleRGB(clBtnFace, clWindow, 100);
dxOffice11GroupBackgroundColor1 := GetMiddleRGB(clBtnFace, clWindow, 15);
dxOffice11GroupBackgroundColor2 := GetMiddleRGB(clBtnFace, clWindow, 20);
dxOffice11GroupCaptionColor1 := GetMiddleRGB(clBtnFace, clWindow, 45);
dxOffice11GroupCaptionColor2 := GetMiddleRGB(clBtnFace, clWindow, 70);
dxOffice11GroupBorderColor := GetMiddleRGB(clBtnFace, clWindow, 5);
dxOffice11GroupFontColor := clBlack;
dxOffice11LinkFontColor := clBlue;
end;
end;
procedure CreateOffice11Bitmaps;
begin
dxOffice11CaptionExpandSignBitmap := TBitmap.Create;
dxOffice11CaptionExpandSignBitmap.Handle := LoadBitmap(HInstance, 'DXNAVBAROFFICE11EXPANDSIGN');
dxOffice11CaptionCollapseSignBitmap := TBitmap.Create;
dxOffice11CaptionCollapseSignBitmap.Handle := LoadBitmap(HInstance, 'DXNAVBAROFFICE11COLLAPSESIGN');
end;
procedure DestroyOffice11Bitmaps;
begin
FreeAndNil(dxOffice11CaptionExpandSignBitmap);
FreeAndNil(dxOffice11CaptionCollapseSignBitmap);
end;
procedure CreateOffice11Colors;
begin
if FCounterOffice11 = 0 then
begin
InitOffice11Colors;
CreateOffice11Bitmaps;
end;
Inc(FCounterOffice11);
end;
procedure RefreshOffice11Colors;
begin
InitOffice11Colors;
if FCounterOffice11 <> 0 then
begin
DestroyOffice11Bitmaps;
CreateOffice11Bitmaps;
end;
end;
procedure ReleaseOffice11Colors;
begin
Dec(FCounterOffice11);
if FCounterOffice11 = 0 then
DestroyOffice11Bitmaps;
end;
procedure CreateOffice11NavPaneBitmaps;
begin
dxOffice11NavPaneOverflowPanelBitmap := TBitmap.Create;
dxOffice11NavPaneOverflowPanelBitmap.Handle := LoadBitmap(HInstance, 'DXNAVBAROFFICE11NAVPANEOVERFLOW');
dxOffice11NavPaneOverflowPanelBitmap.Transparent := True;
dxOffice11NavPaneSplitterBitmap := TBitmap.Create;
dxOffice11NavPaneSplitterBitmap.Handle := LoadBitmap(HInstance, 'DXNAVBAROFFICE11NAVPANESPLITTER');
dxOffice11NavPaneSplitterBitmap.Transparent := True;
dxOffice11NavPaneArrowUpBitmap := TBitmap.Create;
dxOffice11NavPaneArrowUpBitmap.Handle := LoadBitmap(HInstance, 'DXNAVBAROFFICE11NAVPANEARROWUP');
dxOffice11NavPaneArrowUpBitmap.Transparent := True;
dxOffice11NavPaneArrowDownBitmap := TBitmap.Create;
dxOffice11NavPaneArrowDownBitmap.Handle := LoadBitmap(HInstance, 'DXNAVBAROFFICE11NAVPANEARROWDOWN');
dxOffice11NavPaneArrowDownBitmap.Transparent := True;
dxOffice11NavPaneDefaultLargeBitmap := TBitmap.Create;
dxOffice11NavPaneDefaultLargeBitmap.Handle := LoadBitmap(HInstance, 'DXNAVBAROFFICE11NAVPANEDEFAULTLARGE');
dxOffice11NavPaneDefaultLargeBitmap.Transparent := True;
dxOffice11NavPaneDefaultSmallBitmap := TBitmap.Create;
dxOffice11NavPaneDefaultSmallBitmap.Handle := LoadBitmap(HInstance, 'DXNAVBAROFFICE11NAVPANEDEFAULTSMALL');
dxOffice11NavPaneDefaultSmallBitmap.Transparent := True;
end;
procedure DestroyOffice11NavPaneBitmaps;
begin
FreeAndNil(dxOffice11NavPaneArrowUpBitmap);
FreeAndNil(dxOffice11NavPaneArrowDownBitmap);
FreeAndNil(dxOffice11NavPaneOverflowPanelBitmap);
FreeAndNil(dxOffice11NavPaneSplitterBitmap);
FreeAndNil(dxOffice11NavPaneDefaultLargeBitmap);
FreeAndNil(dxOffice11NavPaneDefaultSmallBitmap);
end;
procedure CreateOffice11NavPaneColors;
begin
if FCounterOffice11NavPane = 0 then
CreateOffice11NavPaneBitmaps;
Inc(FCounterOffice11NavPane);
end;
procedure RefreshOffice11NavPaneColors;
begin
if FCounterOffice11NavPane <> 0 then
begin
DestroyOffice11NavPaneBitmaps;
CreateOffice11NavPAneBitmaps;
end;
end;
procedure ReleaseOffice11NavPaneColors;
begin
Dec(FCounterOffice11NavPane);
if FCounterOffice11NavPane = 0 then
DestroyOffice11NavPaneBitmaps;
end;
function GetResourceImage(AID: Byte): TBitmap;
var
AResType, AResID: PChar;
AResInfo: THandle;
begin
Result := nil;
if CheckShellInstance then
begin
AResType := RT_BITMAP;
AResID := PChar(char(AID));
AResInfo := FindResource(FShellInstance, AResID, AResType);
if AResInfo > 0 then
begin
Result := TBitmap.Create;
Result.LoadFromResourceID(FShellInstance, AID);
end;
end;
end;
function GetResourceText(AName: string): string;
var
AResType, AResName: PChar;
AStream: TResourceStream;
AResInfo: THandle;
begin
Result := '';
if CheckShellInstance then
begin
AResType := PChar(23);
AResName := PChar(AName);
AResInfo := FindResource(FShellInstance, AResName, AResType);
if AResInfo > 0 then
begin
AStream := TResourceStream.Create(FShellInstance, AResName, AResType);
try
Result := Copy(PChar(AStream.Memory), 1, AStream.Size);
finally
AStream.Free;
end;
end;
end;
end;
procedure CreateXPExplorerBarBitmaps;
begin
dxXPExplorerBarSpecialGroupHeader := GetResourceImage(110);
dxXPExplorerBarNormalGroupHeader := GetResourceImage(112);
dxXPExplorerBarSpecialGroupCollapseHot := GetResourceImage(105);
dxXPExplorerBarNormalGroupCollapseHot := GetResourceImage(101);
dxXPExplorerBarSpecialGroupCollapse := GetResourceImage(104);
dxXPExplorerBarNormalGroupCollapse := GetResourceImage(100);
dxXPExplorerBarSpecialGroupExpandHot := GetResourceImage(107);
dxXPExplorerBarNormalGroupExpandHot := GetResourceImage(103);
dxXPExplorerBarSpecialGroupExpand := GetResourceImage(106);
dxXPExplorerBarNormalGroupExpand := GetResourceImage(102);
dxXPExplorerBarBackground := GetResourceImage(114);
end;
procedure CreateXPExplorerBarStyleSheetAttributes;
var
AStyleSheetText: string;
AParser: TdxStyleSheetParser;
begin
AStyleSheetText := GetResourceText('CPWEBVW.CSS');
AParser := TdxStyleSheetParser.Create(AStyleSheetText);
try
dxXPExplorerBarItemFont := TFont.Create;
dxXPExplorerBarItemFontHot := TFont.Create;
dxXPExplorerBarGroupHeaderFont := TFont.Create;
dxXPExplorerBarGroupHeaderFontHot := TFont.Create;
GetSystemFont(dxXPExplorerBarItemFont);
GetSystemFont(dxXPExplorerBarItemFontHot);
GetSystemFont(dxXPExplorerBarGroupHeaderFont);
GetSystemFont(dxXPExplorerBarGroupHeaderFontHot);
AParser.ParseFont(dxXPExplorerBarGroupHeaderFont, 'BODY ');
AParser.ParseFont(dxXPExplorerBarGroupHeaderFontHot, 'BODY ');
AParser.ParseFont(dxXPExplorerBarItemFont, 'BODY ');
AParser.ParseFont(dxXPExplorerBarItemFontHot, 'BODY ');
AParser.ParseFont(dxXPExplorerBarItemFont, 'A ');
AParser.ParseFont(dxXPExplorerBarItemFontHot, 'A ');
AParser.ParseFont(dxXPExplorerBarGroupHeaderFont, '.LEARNABOUTCAPTION ');
AParser.ParseFont(dxXPExplorerBarGroupHeaderFontHot, '.LEARNABOUTCAPTION ');
AParser.ParseFont(dxXPExplorerBarGroupHeaderFontHot, 'A:HOVER ');
AParser.ParseFont(dxXPExplorerBarItemFontHot, 'A:HOVER ');
AParser.ParseBorderColor(dxXPExplorerBarGroupBorderColor, '.LEARNABOUTBOX');
finally
AParser.Free;
end;
end;
procedure DestroyXPExplorerBarBitmaps;
begin
FreeAndNil(dxXPExplorerBarSpecialGroupHeader);
FreeAndNil(dxXPExplorerBarNormalGroupHeader);
FreeAndNil(dxXPExplorerBarSpecialGroupCollapseHot);
FreeAndNil(dxXPExplorerBarNormalGroupCollapseHot);
FreeAndNil(dxXPExplorerBarSpecialGroupCollapse);
FreeAndNil(dxXPExplorerBarNormalGroupCollapse);
FreeAndNil(dxXPExplorerBarSpecialGroupExpandHot);
FreeAndNil(dxXPExplorerBarNormalGroupExpandHot);
FreeAndNil(dxXPExplorerBarSpecialGroupExpand);
FreeAndNil(dxXPExplorerBarNormalGroupExpand);
FreeAndNil(dxXPExplorerBarBackground);
end;
procedure DestroyXPExplorerBarStyleSheetAttributes;
begin
FreeAndNil(dxXPExplorerBarItemFont);
FreeAndNil(dxXPExplorerBarItemFontHot);
FreeAndNil(dxXPExplorerBarGroupHeaderFont);
FreeAndNil(dxXPExplorerBarGroupHeaderFontHot);
dxXPExplorerBarGroupBorderColor := clNone;
end;
procedure LoadShellInstance;
begin
FShellLibrary := LoadLibrary(ShellLibraryName);
if FShellLibrary <> 0 then
FSHGetShellStyleHInstancePointer := GetProcAddress(FShellLibrary, 'SHGetShellStyleHInstance');
if FSHGetShellStyleHInstancePointer <> nil then
@FSHGetShellStyleHInstance := FSHGetShellStyleHInstancePointer;
end;
procedure UnloadShellInstance;
begin
if FShellLibrary <> 0 then
FreeLibrary(FShellLibrary);
end;
function CheckShellInstance: Boolean;
begin
Result := FShellInstance > 0;
end;
procedure CreateXPExplorerBarColors;
begin
if FCounterXPExplorerBar = 0 then
begin
if FSHGetShellStyleHInstancePointer <> nil then
begin
FShellInstance := FSHGetShellStyleHInstance;
end;
CreateXPExplorerBarBitmaps;
CreateXPExplorerBarStyleSheetAttributes;
end;
Inc(FCounterXPExplorerBar);
end;
procedure RefreshXPExplorerBarColors;
begin
if FCounterXPExplorerBar <> 0 then
begin
FShellInstance := 0;
DestroyXPExplorerBarBitmaps;
DestroyXPExplorerBarStyleSheetAttributes;
if FSHGetShellStyleHInstancePointer <> nil then
begin
FShellInstance := FSHGetShellStyleHInstance;
end;
CreateXPExplorerBarBitmaps;
CreateXPExplorerBarStyleSheetAttributes;
end;
end;
procedure ReleaseXPExplorerBarColors;
begin
Dec(FCounterXPExplorerBar);
if FCounterXPExplorerBar = 0 then
begin
FShellInstance := 0;
DestroyXPExplorerBarBitmaps;
DestroyXPExplorerBarStyleSheetAttributes;
end;
end;
function XPScheme: TXPScheme;
begin
Result := TXPScheme(GetOffice11Scheme);
end;
function LightColor(AColor: TColor): TColor;
begin
Result := Light(AColor, 80);
end;
function LightLightColor(AColor: TColor): TColor;
begin
Result := Light(AColor, 40);
end;
function DarkColor(AColor: TColor): TColor;
begin
Result := Dark(AColor, 60);
end;
function DarkDarkColor(AColor: TColor): TColor;
begin
Result := Dark(AColor, 40);
end;
function LightBorderColor(AColor: TColor): TColor;
begin
Result := Light(AColor, 70);
end;
function LightLightBorderColor(AColor: TColor): TColor;
begin
Result := Light(AColor, 20);
end;
function DarkBorderColor(AColor: TColor): TColor;
begin
Result := Dark(AColor, 70);
end;
function DarkDarkBorderColor(AColor: TColor): TColor;
begin
Result := Dark(AColor, 20);
end;
function CalcColor(d: Integer): TColor;
var
clrColor: TColor;
r, g, b: Integer;
AMax, ADelta, AMaxDelta: Integer;
begin
clrColor := clHighlight;
r := GetRed(clrColor);
g := GetGreen(clrColor);
b := GetBlue(clrColor);
AMax := Max(Max(r, g), b);
ADelta := $23 + d;
AMaxDelta := (255 - (AMax + ADelta));
if AMaxDelta > 0 then AMaxDelta := 0;
Inc(r, (ADelta + AMaxDelta + 5));
Inc(g, (ADelta + AMaxDelta));
Inc(b, (ADelta + AMaxDelta));
if r > 255 then r := 255;
if g > 255 then g := 255;
if b > 255 then b := 255;
Result := RGB(Abs(r), Abs(g), Abs(b));
Result := ColorRefToARGB(Result);
end;
function CalcTextColor(AColor: TColor; AState: TdxNavBarObjectStates): TColor;
begin
if AColor = clNone then
Result := CalcColor(-50)
else Result := AColor;
if (sDisabled in AState) then
Result := LightLightColor(Result)
else if (sSelected in AState) or (sHotTracked in AState) or (sPressed in AState) then
Result := LightColor(Result);
end;
function GetFontHeight(AFont: TFont): Integer;
begin
Result := cxScreenCanvas.FontHeight(AFont);
end;
procedure GetSystemFont(AFont: TFont);
var
ANonClientMetrics: TNonClientMetrics;
begin
{$IFDEF DELPHI14}
ANonClientMetrics.cbSize := TNonClientMetrics.SizeOf;
{$ELSE}
ANonClientMetrics.cbSize := SizeOf(TNonClientMetrics);
{$ENDIF}
if SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, @ANonClientMetrics, 0) then
AFont.Handle := Windows.CreateFontIndirect(ANonClientMetrics.lfMessageFont)
else
AFont.Handle := GetStockObject(DEFAULT_GUI_FONT);
end;
procedure dxNavBarDrawSelectedFrame(ACanvas: TCanvas; const ARect: TRect; ATopLeftOuterColor, ABottomRightOuterColor,
ATopLeftInnerColor, ABottomRightInnerColor: TColor);
function GetBorders(ATopLeftColor, ABottomRightColor: TColor): TcxBorders;
begin
Result := [];
if ATopLeftColor <> clNone then
Result := Result + [bLeft, bTop];
if ABottomRightColor <> clNone then
Result := Result + [bRight, bBottom];
end;
begin
with TcxCanvas.Create(ACanvas) do
begin
DrawComplexFrame(ARect, ATopLeftOuterColor, ABottomRightOuterColor,
GetBorders(ATopLeftOuterColor, ABottomRightOuterColor));
DrawComplexFrame(cxRectInflate(ARect, -1, -1), ATopLeftInnerColor, ABottomRightInnerColor,
GetBorders(ATopLeftInnerColor, ABottomRightInnerColor));
Free;
end;
end;
function dxNavBarDrawText(ACanvas: TCanvas; const AText: string; var ARect: TRect;
AFormat: UINT; ACharCount: Integer = - 1; ABrushStyle: TBrushStyle = bsClear): Integer;
begin
ACanvas.Brush.Style := ABrushStyle;
Result := cxDrawText(ACanvas.Handle, AText, ARect, AFormat, ACharCount);
ACanvas.Brush.Style := bsSolid;
end;
procedure RGBQuadToColorRef(AColor: TRGBQuad; out ARevertedColor: COLORREF);
begin
ARevertedColor := RGB(AColor.rgbRed, AColor.rgbGreen, AColor.rgbBlue);
end;
procedure ColorRefToRGBQuad(AColor: COLORREF; out ARevertedColor: TRGBQuad);
begin
ARevertedColor.rgbBlue := GetBValue(AColor);
ARevertedColor.rgbGreen := GetGValue(AColor);
ARevertedColor.rgbRed := GetRValue(AColor);
end;
function IsGdiPlusAvailable: Boolean;
begin
Result := CheckGdiPlus;
end;
{ TdxGPColor }
function MakeColor(r, g, b: Byte): ARGB; overload;
begin
result := MakeColor(255, r, g, b);
end;
function MakeColor(a, r, g, b: Byte): ARGB; overload;
begin
result := ((DWORD(b) shl BlueShift) or
(DWORD(g) shl GreenShift) or
(DWORD(r) shl RedShift) or
(DWORD(a) shl AlphaShift));
end;
function MakeColor(color: TColor; alpha: Byte): ARGB; overload;
begin
result := MakeColor(alpha, GetRValue(color), GetGValue(color), GetBValue(color));
end;
function GetAlpha(color: ARGB): BYTE;
begin
result := BYTE(color shr AlphaShift);
end;
function GetRed(color: ARGB): BYTE;
begin
result := BYTE(color shr RedShift);
end;
function GetGreen(color: ARGB): BYTE;
begin
result := BYTE(color shr GreenShift);
end;
function GetBlue(color: ARGB): BYTE;
begin
result := BYTE(color shr BlueShift);
end;
function ColorRefToARGB(rgb: COLORREF): ARGB;
begin
result := MakeColor(255, GetRValue(rgb), GetGValue(rgb), GetBValue(rgb));
end;
function ARGBToColorRef(Color: ARGB): COLORREF;
begin
result := RGB(GetRed(Color), GetGreen(Color), GetBlue(Color));
end;
procedure GdipFillGradientRect(DC: HDC; const ARect: TRect; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode);
var
AGPCanvas: TdxGPGraphics;
AGPBrush: TdxGPLinearGradientBrush;
AGPRect, AGPBrushRect: TdxGPRect;
AGPGradientMode: TdxGPLinearGradientMode;
AGPColor1, AGPColor2: TdxGPColor;
begin
AGPRect := MakeRect(ARect);
AGPColor1 := MakeColor(ColorToRGB(AColor1), AAlphaBlend1);
AGPColor2 := MakeColor(ColorToRGB(AColor2), AAlphaBlend2);
AGPGradientMode := TdxGPLinearGradientMode(AGradientMode);
AGPCanvas := TdxGPGraphics.Create(DC);
try
AGPBrushRect := MakeRect(cxRectInflate(ARect, 1, 1));// Inflate: Avoid GDIPlus gradient fill bug
AGPBrush := TdxGPLinearGradientBrush.Create(AGPBrushRect, AGPColor1, AGPColor2, AGPGradientMode);
try
AGPCanvas.FillRectangle(AGPBrush, AGPRect);
finally
AGPBrush.Free;
end;
finally
AGPCanvas.Free;
end;
end;
initialization
LoadShellInstance;
finalization
UnloadShellInstance;
end.