| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822 | unit TBXThemes;// TBX Package// Copyright 2001-2004 Alex A. Denisov. All Rights Reserved// See TBX.chm for license and installation instructions//// Id: TBXThemes.pas 16 2004-05-26 02:02:55Z Alex@ZEISSinterface{$I TB2Ver.inc}uses  Windows, Messages, Classes, Forms, Graphics, ImgList, Controls, TB2Item;{ TBX_SYSCOMMAND message }const  TBX_SYSCOMMAND = WM_USER + 312;  TSC_BEFOREVIEWCHANGE = 1;  TSC_VIEWCHANGE       = 2;  TSC_AFTERVIEWCHANGE  = 3;  TSC_APPACTIVATE      = 4;  TSC_APPDEACTIVATE    = 5;{ Integer Metric IDs }const  TMI_SPLITBTN_ARROWWIDTH    = 10;  TMI_DROPDOWN_ARROWWIDTH    = 20;  TMI_DROPDOWN_ARROWMARGIN   = 21;  TMI_MENU_IMGTEXTSPACE      = 32;  TMI_MENU_LCAPTIONMARGIN    = 33;  TMI_MENU_RCAPTIONMARGIN    = 34;  TMI_MENU_SEPARATORSIZE     = 35;  TMI_TLBR_SEPARATORSIZE     = 50;  TMI_EDIT_FRAMEWIDTH        = 60;  TMI_EDIT_TEXTMARGINHORZ    = 61;  TMI_EDIT_TEXTMARGINVERT    = 62;  TMI_EDIT_BTNWIDTH          = 65;  TMI_EDIT_MENURIGHTINDENT   = 66;{ Boolean Metric IDs }const  TMB_OFFICEXPPOPUPALIGNMENT = 1;  TMB_EDITMENUFULLSELECT     = 3; // highlights the full edit item  TMB_EDITHEIGHTEVEN         = 4; // forces the height of the edit item to be even number (otherwise it will be odd)  TMB_PAINTDOCKBACKGROUND    = 5; // docks are painted by the theme instead of having a uniform color  TMB_SOLIDTOOLBARNCAREA     = 6; // no transparency in NC area of toolbars{ Margins Metric IDs}const  MID_TOOLBARITEM            = 1;  MID_MENUITEM               = 2;  MID_STATUSPANE             = 3;{ View types }const  VT_UNKNOWN                 = $0;  VT_TOOLBAR                 = $01000;  VT_POPUP                   = $02000;  VT_DOCKPANEL               = $04000;  VT_DOCKWINDOW              = $08000;  VT_STATUSBAR               = $10000; // technicaly, this is not a view  VT_SECTIONHEADER           = $20000; // for retrieving colors only  { Toolbar view types }  TVT_FLOATING               = $800;  TVT_RESIZABLE              = $400;  // valid only when floating  TVT_EMBEDDED               = $200;  // when the toolbar is not floating or docked  TVT_NORMALTOOLBAR          = VT_TOOLBAR or $01;  TVT_MENUBAR                = VT_TOOLBAR or $02;  TVT_TOOLWINDOW             = VT_TOOLBAR or $04;  { Popup view types }  PVT_POPUPMENU              = VT_POPUP or $01;  PVT_LISTBOX                = VT_POPUP or $02;  PVT_TOOLBOX                = VT_POPUP or $04;  PVT_CHEVRONMENU            = VT_POPUP or $08;  { Dockable panel view types }  DPVT_FLOATING              = $800;  DPVT_RESIZABLE             = $400;  DPVT_NORMAL                = VT_DOCKPANEL or $01;  { Dockable window view types }  DWVT_FLOATING              = $800;  DWVT_RESIZABLE             = $400;  DWVT_NORMAL                = VT_DOCKWINDOW or $01;{ Item types }const  IT_TOOLBARBUTTON           = 1;  IT_MENUITEM                = 2;{ Item options (bit flags) }const  IO_TOOLBARSTYLE            = $01;  IO_SUBMENUITEM             = $04;  IO_COMBO                   = $08;  IO_DESIGNING               = $10;  IO_APPACTIVE               = $20;  // True when Application.Active = True  IO_RADIO                   = $40;{ Drag handle styles }const  DHS_DOUBLE                 = 0;  DHS_NONE                   = 1;  DHS_SINGLE                 = 2;{ Caption/drag handle button states (bit flags) }const  CDBS_VISIBLE               = $1;  CDBS_HOT                   = $2;  CDBS_PRESSED               = $4;{ Window info's RedrawPart (bit flags) }const  WRP_BORDER                 = $1;  WRP_CAPTION                = $2;  WRP_CLOSEBTN               = $4;{ Popup shadow types }const  PST_NONE                   = 0;     // no popup shadows  PST_WINDOWSXP              = 1;  PST_OFFICEXP               = 2;  PST_WINDOWS2K              = 3;{ Edit (ComboBox) button types }const  EBT_DROPDOWN               = 1;  EBT_SPIN                   = 2;  { Edit (ComboBox) button states for EBT_DROPDOWN type (bit flags) }  EBDS_DISABLED              = $1;  EBDS_HOT                   = $2;  EBDS_PRESSED               = $4;  { Edit (ComboBox) button states for EBT_SPIN type (bit flags) }  EBSS_DISABLED              = $1;  EBSS_HOT                   = $2;  EBSS_UP                    = $4;  EBSS_DOWN                  = $8;{ Page scroll button types }const  PSBT_UP                    = 1;  PSBT_DOWN                  = 2;  PSBT_LEFT                  = 3;  PSBT_RIGHT                 = 4;{ Item state flags }const  ISF_DISABLED               = $001;  ISF_HOT                    = $002;  ISF_PUSHED                 = $004;  ISF_SELECTED               = $008;  ISF_LOCATIONMASK           = $F00;  ISF_TOOLBARCOLOR           = $000;  // for text and images painted in toolbars  ISF_MENUCOLOR              = $100;  // for text and images painted in popups and DkPanels  ISF_STATUSCOLOR            = $200;  // for text and images painted in status bars{ StatusBar parts }const  SBP_BODY                   = 0;  SBP_PANE                   = 1;  SBP_LASTPANE               = 2;  SBP_GRIPPER                = 3;{ Dock positions }const  DP_TOP                     = 1;  DP_BOTTOM                  = 2;  DP_LEFT                    = 3;  DP_RIGHT                   = 4;type  TTBXItemLayout = (tbxlAuto, tbxlGlyphLeft, tbxlGlyphTop);  TTBXMargins = record    LeftWidth: Integer;    RightWidth: Integer;    TopHeight: Integer;    BottomHeight: Integer;  end;  TTBXHoverKind = (hkNone, hkKeyboardHover, hkMouseHover);  TTBXComboPart = (cpNone, cpCombo, cpSplitLeft, cpSplitRight);  TTBXItemInfo = record    Control: TControl;    ViewType: Integer;          // VT_*, TVT_*, PVT_*, or DPVT_* constant    ItemOptions: Integer;       // IO_* flags    Enabled: Boolean;    Pushed: Boolean;    HoverKind: TTBXHoverKind;    Selected: Boolean;    ImageShown: Boolean;    ImageWidth: Integer;    ImageHeight: Integer;    IsVertical: Boolean;    ComboPart: TTBXComboPart;    IsPopupParent: Boolean;     // used in officexp theme    PopupMargin: Integer;    AppFlags: Integer;          // reserved for extensions    AppData: Integer;  end;  TTBXWindowInfo = record    ParentControl: TControl;    ParentHandle: HWND;         // handle of a parent floating window    WindowHandle: HWND;         // handle of a toolbar or dockable panel    ViewType: Integer;          // TVT_* or DPVT_* view types (loating)    ClientWidth: Integer;    ClientHeight: Integer;    ShowCaption: Boolean;    FloatingBorderSize: TPoint;    CloseButtonState: Integer;  // CDBS_* state flags    RedrawPart: Integer;        // WRP_ constants    Caption: PChar;    EffectiveColor: TColor;    Active: Boolean;    AppFlags: Integer;          // reserved for extensions    AppData: Integer;  end;  TTBXPopupInfo = record    WindowHandle: HWND;    ViewType: Integer;    ParentRect: TRect;    BorderSize: TPoint;    AppFlags: Integer;          // reserved for extensions    AppData: Integer;  end;  TTBXToolbarInfo = record    WindowHandle: HWND;    ViewType: Integer;          // TVT_* view types (docked)    IsVertical: Boolean;    AllowDrag: Boolean;    BorderStyle: TBorderStyle;    BorderSize: TPoint;    ClientWidth: Integer;    ClientHeight: Integer;    DragHandleStyle: Integer;    CloseButtonState: Integer;  // CDBS_* state flags    Caption: PChar;    EffectiveColor: TColor;    AppFlags: Integer;          // reserved for extensions    AppData: Integer;  end;  TTBXDockPanelInfo = record    WindowHandle: HWND;    ViewType: Integer;         // DPVT_* view types (docked)    IsVertical: Boolean;    AllowDrag: Boolean;    BorderStyle: TBorderStyle;    BorderSize: TPoint;    ClientWidth: Integer;    ClientHeight: Integer;    ShowCaption: Boolean;    CloseButtonState: Integer;    Caption: PChar;    EffectiveColor: TColor;    AppFlags: Integer;           // reserved for extensions    AppData: Integer;  end;  TTBXEditBtnInfo = record    ButtonType: Integer;         // EBT_* button type    ButtonState: Integer;  end;  TTBXEditInfo = record    LeftBtnWidth: Integer;    RightBtnWidth: Integer;    LeftBtnInfo: TTBXEditBtnInfo;   // valid only if LeftBtnWidth > 0    RightBtnInfo: TTBXEditBtnInfo;  // valid only if RightBtnWidth > 0  end;  TTBXTheme = class  private    FName: string;    FTag: Integer;  public    constructor Create(const AName: string); virtual;    { Margins, color, etc. }    function  GetImageOffset(Canvas: TCanvas; const ItemInfo: TTBXItemInfo; ImageList: TCustomImageList): TPoint; virtual; abstract;    function  GetItemColor(const ItemInfo: TTBXItemInfo): TColor; virtual; abstract;    function  GetItemTextColor(const ItemInfo: TTBXItemInfo): TColor; virtual; abstract;    function  GetItemImageBackground(const ItemInfo: TTBXItemInfo): TColor; virtual; abstract;    procedure GetMargins(MarginID: Integer; out Margins: TTBXMargins); virtual; abstract;    function  GetPopupShadowType: Integer; virtual; abstract; // returns one of the PST_ constants    procedure GetViewBorder(Control: TControl; ViewType: Integer; out Border: TPoint); virtual; abstract;    function  GetViewColor(ViewType: Integer): TColor; virtual; abstract;    procedure GetViewMargins(ViewType: Integer; out Margins: TTBXMargins); virtual; abstract;    function GetSysColor(nIndex: Integer): DWORD; virtual; abstract;    { General painting routines }    procedure PaintBackgnd(Canvas: TCanvas; const ADockRect, ARect, AClipRect: TRect; AColor: TColor; Transparent: Boolean; AViewType: Integer); virtual; abstract;    procedure PaintButton(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo); virtual; abstract;    procedure PaintCaption(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo; const ACaption: string; AFormat: Cardinal; Rotated: Boolean); virtual; abstract;    procedure PaintCheckMark(Canvas: TCanvas; ARect: TRect; const ItemInfo: TTBXItemInfo); virtual; abstract;    procedure PaintChevron(Canvas: TCanvas; ARect: TRect; const ItemInfo: TTBXItemInfo); virtual; abstract;    procedure PaintEditFrame(Monitor: TMonitor; Canvas: TCanvas; const ARect: TRect; var ItemInfo: TTBXItemInfo; const EditInfo: TTBXEditInfo); virtual; abstract;    procedure PaintEditButton(Canvas: TCanvas; const ARect: TRect; var ItemInfo: TTBXItemInfo; ButtonInfo: TTBXEditBtnInfo); virtual; abstract;    procedure PaintDock(Canvas: TCanvas; const ClientRect, DockRect: TRect; DockPosition: Integer); virtual; abstract;    procedure PaintDropDownArrow(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo); virtual; abstract;    procedure PaintFloatingBorder(Canvas: TCanvas; const ARect: TRect; const WindowInfo: TTBXWindowInfo); virtual; abstract;    procedure PaintFrame(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo); virtual; abstract;    procedure PaintImage(Canvas: TCanvas; ARect: TRect; const ItemInfo: TTBXItemInfo; ImageList: TCustomImageList; ImageIndex: Integer); virtual; abstract;    procedure PaintMenuItem(Canvas: TCanvas; const ARect: TRect; var ItemInfo: TTBXItemInfo); virtual; abstract;    procedure PaintMenuItemFrame(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo); virtual; abstract;    procedure PaintPopupNCArea(Canvas: TCanvas; R: TRect; const PopupInfo: TTBXPopupInfo); virtual; abstract;    procedure PaintSeparator(Canvas: TCanvas; ARect: TRect; ItemInfo: TTBXItemInfo; Horizontal, LineSeparator: Boolean); virtual; abstract;    procedure PaintToolbarNCArea(Monitor: TMonitor; Canvas: TCanvas; R: TRect; const WindowInfo: TTBXToolbarInfo); virtual; abstract;    procedure PaintStatusBar(Control: TWinControl; Canvas: TCanvas; R: TRect; Part: Integer); virtual; abstract;    function GetIntegerMetrics(Viewer: TTBItemViewer; Index: Integer): Integer; overload;    function GetIntegerMetrics(Monitor: TMonitor; Index: Integer): Integer; overload; virtual; abstract;    { Boolean metrics access }    function GetBooleanMetrics(Index: Integer): Boolean; virtual; abstract;    property OfficeXPPopupAlignment: Boolean index TMB_OFFICEXPPOPUPALIGNMENT read GetBooleanMetrics;    property EditMenuFullSelect: Boolean index TMB_EDITMENUFULLSELECT read GetBooleanMetrics;    property EditHeightEven: Boolean index TMB_EDITHEIGHTEVEN read GetBooleanMetrics;    property PaintDockBackground: Boolean index TMB_PAINTDOCKBACKGROUND read GetBooleanMetrics;    property SolidToolbarNCArea: Boolean index TMB_SOLIDTOOLBARNCAREA read GetBooleanMetrics;    property Name: string read FName;    property Tag: Integer read FTag write FTag;  end;  TTBXThemeClass = class of TTBXTheme;const{ TBXSysParam Params }  TSP_FLATMENUSTYLE    = 1;  TSP_XPVISUALSTYLE    = 2;{ Flat menu styles }  FMS_AUTOMATIC = 0;  FMS_DISABLED  = 1;  FMS_ENABLED   = 2;{ XP visual styles}  XPVS_AUTOMATIC = 0;  XPVS_DISABLED  = 2;procedure SetTBXSysParam(Param: Integer; Value: Integer);function  GetTBXSysParam(Param: Integer): Integer;procedure AddTBXSysChangeNotification(AObject: TObject);procedure RemoveTBXSysChangeNotification(AObject: TObject);procedure RegisterTBXTheme(const AName: string; AThemeClass: TTBXThemeClass);procedure UnregisterTBXTheme(const AName: string);function  IsTBXThemeAvailable(const AName: string): Boolean;procedure GetAvailableTBXThemes(Strings: TStrings);function  GetTBXTheme(const AName: string): TTBXTheme;procedure ReleaseTBXTheme(var ATheme: TTBXTheme);{ Additional "system" variables - do not change }var  { Additional colors }  clHotLight: TColor;  clPopup: TColor;  clPopupText: TColor;  clToolbar: TColor;  clToolbarText: TColor;  { Auxiliary flags corresponding to the system color scheme }  TBXLoColor: Boolean;var  USE_FLATMENUS: Boolean;  USE_THEMES: Boolean;{ Misc. Functions }{ Warning: These functions may be changed or relocated in future versions }function GetTBXCaptionRect(const WindowInfo: TTBXWindowInfo; AdjustForBorder, MinusCloseButton: Boolean): TRect;function GetTBXCloseButtonRect(const WindowInfo: TTBXWindowInfo; AdjustForBorder: Boolean): TRect;function GetTBXDockedCloseButtonRect(const ToolbarInfo: TTBXToolbarInfo): TRect;function GetTBXDragHandleSize(const ToolbarInfo: TTBXToolbarInfo): Integer;implementationuses  SysUtils, TBXUtils, UxTheme, Types, PasTools;const  SPI_GETFLATMENU = $1022;type  TThemeInfo = record    Name: {MP}string;    ThemeClass: TTBXThemeClass;    ThemeInstance: TTBXTheme;    RefCount: Integer;  end;var  Themes: array of TThemeInfo;  InitedThemeLibrary: Boolean;{ TTBXThemeManager }type  TTBXThemeManager = class  private    FEnableVisualStyles: Boolean;    FFlatMenuStyle: Integer;    FNotifies: TList;    FWindowHandle: HWND;    procedure SetEnableVisualStyles(Value: Boolean);    procedure SetFlatMenuStyle(Value: Integer);  protected    procedure VisualStylesClose;    procedure VisualStylesOpen;    procedure UpdateVariables;    procedure WndProc(var Message: TMessage);  public    constructor Create;    destructor Destroy; override;    function  Broadcast(Msg: Cardinal; Param1, Param2: Integer): Integer;    procedure Notify;    procedure AddNotification(AObject: TObject);    procedure RemoveNotification(AObject: TObject);    property EnableVisualStyles: Boolean read FEnableVisualStyles write SetEnableVisualStyles;    property FlatMenuStyle: Integer read FFlatMenuStyle write SetFlatMenuStyle;  end;var  ThemeManager: TTBXThemeManager;procedure SetTBXSysParam(Param: Integer; Value: Integer);begin  case Param of    TSP_FLATMENUSTYLE: ThemeManager.FlatMenuStyle := Value;    TSP_XPVISUALSTYLE: ThemeManager.EnableVisualStyles := (Value = XPVS_AUTOMATIC);  end;end;function  GetTBXSysParam(Param: Integer): Integer;const  CXPVStyles: array [Boolean] of Integer = (XPVS_DISABLED, XPVS_AUTOMATIC);begin  Assert(ThemeManager <> nil);  case Param of    TSP_FLATMENUSTYLE: Result := ThemeManager.FlatMenuStyle;    TSP_XPVISUALSTYLE: Result := CXPVStyles[ThemeManager.EnableVisualStyles];  else    Result := -1;  end;end;procedure AddTBXSysChangeNotification(AObject: TObject);begin  ThemeManager.AddNotification(AObject);end;procedure RemoveTBXSysChangeNotification(AObject: TObject);begin  ThemeManager.RemoveNotification(AObject);end;function FindTBXTheme(const AName: string): Integer;begin  for Result := 0 to Length(Themes) - 1 do    if CompareText(Themes[Result].Name, AName) = 0 then Exit;  Result := -1;end;procedure RegisterTBXTheme(const AName: string; AThemeClass: TTBXThemeClass);var  Index: Integer;begin  if (Length(AName) = 0) or (AThemeClass = nil) then    raise Exception.Create('Cannot register theme');  Index := FindTBXTheme(AName);  if Index >= 0 then raise Exception.CreateFmt('Theme %s is already registered', [AName]);  Index := Length(Themes);  SetLength(Themes, Index + 1);  with Themes[Index] do  begin    Name := AName;    ThemeClass := AThemeClass;    ThemeInstance := nil;    RefCount := 0;  end;end;procedure UnregisterTBXTheme(const AName: string);var  Index, L: Integer;begin  Index := FindTBXTheme(AName);  if Index < 0 then raise Exception.CreateFmt('Cannot unregister unknown theme %s', [AName]);  L := Length(Themes);  if Index < L - 1 then    Move(Themes[Index + 1], Themes[Index], SizeOf(TThemeInfo) * (L - Index - 1));  SetLength(Themes, L - 1);end;function IsTBXThemeAvailable(const AName: string): Boolean;begin  Result := FindTBXTheme(AName) >= 0;end;procedure GetAvailableTBXThemes(Strings: TStrings);var  I: Integer;begin  Assert(Strings <> nil);  for I := 0 to Length(Themes) - 1 do    Strings.Add(Themes[I].Name);end;function GetTBXTheme(const AName: string): TTBXTheme;var  Index: Integer;  M: TMessage;begin  Index := FindTBXTheme(AName);  if Index < 0 then raise Exception.Create('Unknown theme ' + AName);  with Themes[Index] do  begin    if RefCount = 0 then    begin      { Create a new instance and increase reference count }      Assert(ThemeInstance = nil);      ThemeInstance := ThemeClass.Create(Name);      M.Msg := TBX_SYSCOMMAND;      M.WParam := Integer(Application.Active);      M.LParam := 0;      M.Result := 0;      ThemeInstance.Dispatch(M);    end;    Inc(RefCount);    Result := ThemeInstance;  end;end;procedure ReleaseTBXTheme(var ATheme: TTBXTheme);var  Index: Integer;begin  for Index := 0 to Length(Themes) - 1 do    with Themes[Index] do      if ThemeInstance = ATheme then      begin        if RefCount < 1 then raise Exception.Create('Cannot release theme ' + Themes[Index].Name);        Dec(RefCount);        if RefCount = 0 then        begin          ThemeInstance.Free;          ThemeInstance := nil;          ATheme := nil;        end;        Exit;      end;  raise Exception.Create('Cannot release theme');end;{ TTBXTheme }constructor TTBXTheme.Create(const AName: string);begin  FName := AName;end;function TTBXTheme.GetIntegerMetrics(Viewer: TTBItemViewer; Index: Integer): Integer;begin  Result := GetIntegerMetrics(Viewer.View.GetMonitor, Index);end;{ Misc. Functions }function GetTBXCaptionRect(const WindowInfo: TTBXWindowInfo;  AdjustForBorder, MinusCloseButton: Boolean): TRect;begin  Result := Rect(0, 0, WindowInfo.ClientWidth, GetSystemMetricsForControl(WindowInfo.ParentControl, SM_CYSMCAPTION) - 1);  if MinusCloseButton then Dec(Result.Right, Result.Bottom);  if AdjustForBorder then    with WindowInfo.FloatingBorderSize do OffsetRect(Result, X, Y);end;function GetTBXCloseButtonRect(const WindowInfo: TTBXWindowInfo;  AdjustForBorder: Boolean): TRect;begin  Result := GetTBXCaptionRect(WindowInfo, AdjustForBorder, False);  Result.Left := Result.Right - Result.Bottom + Result.Top;end;function GetTBXDockedCloseButtonRect(const ToolbarInfo: TTBXToolbarInfo): TRect;var  X, Y, Z: Integer;begin  with ToolbarInfo do  begin    Z := GetTBXDragHandleSize(ToolbarInfo) - 1;    if not IsVertical then    begin      X := BorderSize.X;      Y := BorderSize.Y;    end    else    begin      X := (ClientWidth + BorderSize.X) - Z;      Y := BorderSize.Y;    end;    Result := Bounds(X, Y, Z, Z);  end;end;function GetTBXDragHandleSize(const ToolbarInfo: TTBXToolbarInfo): Integer;const  DragHandleSizes: array [Boolean, 0..2] of Integer = ((9, 0, 6), (14, 14, 14));begin  with ToolbarInfo do  begin    if AllowDrag then      Result :=        ScaleByPixelsPerInch(          DragHandleSizes[(CloseButtonState and CDBS_VISIBLE) <> 0, DragHandleStyle],          Screen.MonitorFromWindow(ToolbarInfo.WindowHandle, mdNearest))    else      Result := 0;  end;end;{ TTBXThemeManager }procedure TTBXThemeManager.AddNotification(AObject: TObject);begin  FNotifies.Add(AObject);end;function TTBXThemeManager.Broadcast(Msg: Cardinal; Param1, Param2: Integer): Integer;var  I: Integer;  M: TMessage;begin  if FNotifies.Count > 0 then  begin    M.Msg := Msg;    M.WParam := Param1;    M.LParam := Param2;    M.Result := 0;    for I := 0 to FNotifies.Count - 1 do TObject(FNotifies[I]).Dispatch(M);    Result := M.Result;  end  else Result := 0;end;constructor TTBXThemeManager.Create;begin  FEnableVisualStyles := True;  FFlatMenuStyle := FMS_AUTOMATIC;  FNotifies := TList.Create;  FWindowHandle := Classes.AllocateHWnd(WndProc);  UpdateVariables;end;destructor TTBXThemeManager.Destroy;begin  VisualStylesClose;  Classes.DeallocateHWnd(FWindowHandle);  FNotifies.Free;  VisualStylesClose;  inherited;end;procedure TTBXThemeManager.Notify;begin  if FNotifies.Count > 0 then  begin    Broadcast(TBX_SYSCOMMAND, TSC_BEFOREVIEWCHANGE, 0);    Broadcast(TBX_SYSCOMMAND, TSC_VIEWCHANGE, 0);    Broadcast(TBX_SYSCOMMAND, TSC_AFTERVIEWCHANGE, 0);  end;end;procedure TTBXThemeManager.RemoveNotification(AObject: TObject);begin  FNotifies.Remove(AObject);end;procedure TTBXThemeManager.SetEnableVisualStyles(Value: Boolean);begin  if Value <> FEnableVisualStyles then  begin    FEnableVisualStyles := Value;    UpdateVariables;    Notify;  end;end;procedure TTBXThemeManager.SetFlatMenuStyle(Value: Integer);begin  if Value <> FFlatMenuStyle then  begin    FFlatMenuStyle := Value;    UpdateVariables;    Notify;  end;end;procedure TTBXThemeManager.UpdateVariables;var  DC: HDC;  SysFlatMenus: Boolean;  ToolbarTheme: THandle;begin  TBXUtils.RecreateStock;  DC := GetDC(0);  try    TBXLoColor := GetDeviceCaps(DC, BITSPIXEL) * GetDeviceCaps(DC, PLANES) < 12;  finally    ReleaseDC(0, DC);  end;  VisualStylesClose;  VisualStylesOpen;  clToolbar := clBtnFace;  clToolbarText := clBtnText;  if USE_THEMES then  begin    ToolbarTheme := OpenThemeData(FWindowHandle, 'TOOLBAR');    GetThemeColor(ToolbarTheme, 0, 0, TMT_FILLCOLOR, Cardinal(clToolbar));    GetThemeColor(ToolbarTheme, 0, 0, TMT_TEXTCOLOR, Cardinal(clToolbarText));    CloseThemeData(ToolbarTheme);  end;  SysFlatMenus := False;  SystemParametersInfo(SPI_GETFLATMENU, 0, @SysFlatMenus, 0);  if SysFlatMenus then // System indicates support for flat menus  begin    if FlatMenuStyle in [FMS_AUTOMATIC, FMS_ENABLED] then    begin      USE_FLATMENUS := True;      clPopup := clMenu;      clPopupText := clMenuText;    end    else    begin      USE_FLATMENUS := False;      clPopup := clToolbar;      clPopupText := clToolbarText;    end;  end  else  begin    if FlatMenuStyle = FMS_ENABLED then    begin      USE_FLATMENUS := True;      clPopup := clWindow;      clPopupText := clWindowText;    end    else    begin      USE_FLATMENUS := False;      clPopup := clMenu;      clPopupText := clMenuText;    end;  end;end;procedure TTBXThemeManager.VisualStylesClose;begin  if InitedThemeLibrary then  begin    InitedThemeLibrary := False;    FreeThemeLibrary;  end;end;procedure TTBXThemeManager.VisualStylesOpen;begin  USE_THEMES := False;  if EnableVisualStyles then  begin    InitedThemeLibrary := InitThemeLibrary;    USE_THEMES := UseThemes;  end;end;procedure TTBXThemeManager.WndProc(var Message: TMessage);const  ActiveFlags: array [Boolean] of Integer = (TSC_APPDEACTIVATE, TSC_APPACTIVATE);begin  case Message.Msg of    WM_DISPLAYCHANGE, WM_SYSCOLORCHANGE, WM_THEMECHANGED:      begin        UpdateVariables;        Notify;      end;    WM_ACTIVATEAPP:      Broadcast(TBX_SYSCOMMAND, ActiveFlags[Boolean(Message.WParam)], 0);  end;  with Message do Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);end;initializationif GetSysColorBrush(COLOR_HOTLIGHT) = 0 then clHotLight := clHighlightelse clHotLight := TColor($80000000 or 26);Themes := nil;ThemeManager := TTBXThemeManager.Create;finalizationThemeManager.Free;SetLength(Themes, 0);end.
 |