unit TBXOffice2003Theme; // TBX Package // Copyright 2001-2002 Alex A. Denisov. All Rights Reserved // See TBX.chm for license and installation instructions // // $Id: TBXOfficeXPTheme.pas,v 1.55 2002/12/24 04:32:45 Alex Exp $ // // Modified OfficeXP theme by Roy Magne Klever - I named it 'Office11XPtheme' // // 07.02.2003 - Roy Magne Klever roy.magne@os.ino.no // Added gradient to toolbars // Changed statusbar and draghandels... // Unknown Changes by Dmitriy Babkin mailto:dimonka@tnt.gov.lv // Added gradients to menu popups // Added TBXDock // Color adjustment... // 10.04.2003 - Roy Magne Klever // Just change menu title color... // Your modifications here interface uses Windows, Messages, Graphics, TBXThemes, ImgList; {$DEFINE ALTERNATIVE_DISABLED_STYLE} // remove the asterisk to change appearance of disabled images {*$DEFINE SMALL_CLOSE_BUTTON} // remove the asterisk for smaller close button size type TGradDir = (tGLeftRight, tGTopBottom); TItemPart = (ipBody, ipText, ipFrame); TBtnItemState = (bisNormal, bisDisabled, bisSelected, bisPressed, bisHot, bisDisabledHot, bisSelectedHot, bisPopupParent); TMenuItemState = (misNormal, misDisabled, misHot, misDisabledHot); TWinFramePart = (wfpBorder, wfpCaption, wfpCaptionText); TWinFrameState = (wfsActive, wfsInactive); TTBXOffice2003Theme = class(TTBXTheme) private procedure TBXSysCommand(var Message: TMessage); message TBX_SYSCOMMAND; protected { View/Window Colors } MenubarColor: TColor; ToolbarColor: TColor; PopupColor: TColor; DockPanelColor: TColor; PopupFrameColor: TColor; WinFrameColors: array [TWinFrameState, TWinFramePart] of TColor; PnlFrameColors: array [TWinFrameState, TWinFramePart] of TColor; MenuItemColors: array [TMenuItemState, TItemPart] of TColor; BtnItemColors: array [TBtnItemState, TItemPart] of TColor; { Other Colors } DragHandleColor: TColor; PopupSeparatorColor: TColor; ToolbarSeparatorColor: TColor; IconShadowColor: TColor; StatusPanelFrameColor: TColor; procedure SetupColorCache; virtual; protected { Internal Methods } function GetPartColor(const ItemInfo: TTBXItemInfo; ItemPart: TItemPart): TColor; function GetBtnColor(const ItemInfo: TTBXItemInfo; ItemPart: TItemPart): TColor; public constructor Create(const AName: string); override; destructor Destroy; override; { Metrics access} function GetBooleanMetrics(Index: Integer): Boolean; override; function GetImageOffset(Canvas: TCanvas; const ItemInfo: TTBXItemInfo; ImageList: TCustomImageList): TPoint; override; function GetIntegerMetrics(Index: Integer): Integer; override; function GetItemColor(const ItemInfo: TTBXItemInfo): TColor; override; function GetItemTextColor(const ItemInfo: TTBXItemInfo): TColor; override; function GetItemImageBackground(const ItemInfo: TTBXItemInfo): TColor; override; procedure GetMargins(MarginID: Integer; out Margins: TTBXMargins); override; function GetPopupShadowType: Integer; override; procedure GetViewBorder(ViewType: Integer; out Border: TPoint); override; function GetViewColor(AViewType: Integer): TColor; override; procedure GetViewMargins(ViewType: Integer; out Margins: TTBXMargins); override; { Painting routines } procedure PaintBackgnd(Canvas: TCanvas; const ADockRect, ARect, AClipRect: TRect; AColor: TColor; Transparent: Boolean; AViewType: Integer); override; procedure PaintButton(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo); override; procedure PaintCaption(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo; const ACaption: string; AFormat: Cardinal; Rotated: Boolean); override; procedure PaintCheckMark(Canvas: TCanvas; ARect: TRect; const ItemInfo: TTBXItemInfo); override; procedure PaintChevron(Canvas: TCanvas; ARect: TRect; const ItemInfo: TTBXItemInfo); override; procedure PaintDockPanelNCArea(Canvas: TCanvas; R: TRect; const DockPanelInfo: TTBXDockPanelInfo); override; procedure PaintDropDownArrow(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo); override; procedure PaintEditButton(Canvas: TCanvas; const ARect: TRect; var ItemInfo: TTBXItemInfo; ButtonInfo: TTBXEditBtnInfo); override; procedure PaintEditFrame(Canvas: TCanvas; const ARect: TRect; var ItemInfo: TTBXItemInfo; const EditInfo: TTBXEditInfo); override; procedure PaintFloatingBorder(Canvas: TCanvas; const ARect: TRect; const WindowInfo: TTBXWindowInfo); override; procedure PaintFrame(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo); override; procedure PaintImage(Canvas: TCanvas; ARect: TRect; const ItemInfo: TTBXItemInfo; ImageList: TCustomImageList; ImageIndex: Integer); override; procedure PaintMDIButton(Canvas: TCanvas; ARect: TRect; const ItemInfo: TTBXItemInfo; ButtonKind: Cardinal); override; procedure PaintMenuItem(Canvas: TCanvas; var ARect: TRect; var ItemInfo: TTBXItemInfo); override; procedure PaintMenuItemFrame(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo); override; procedure PaintPageScrollButton(Canvas: TCanvas; const ARect: TRect; ButtonType: Integer; Hot: Boolean); override; procedure PaintPopupNCArea(Canvas: TCanvas; R: TRect; const PopupInfo: TTBXPopupInfo); override; procedure PaintSeparator(Canvas: TCanvas; ARect: TRect; ItemInfo: TTBXItemInfo; Horizontal, LineSeparator: Boolean); override; procedure PaintToolbarNCArea(Canvas: TCanvas; R: TRect; const ToolbarInfo: TTBXToolbarInfo); override; procedure PaintGlyph(Canvas: TCanvas; R: TRect; Kind, State: Integer); override; procedure PaintStatusBar(Canvas: TCanvas; R: TRect; Part: Integer); override; end; implementation {.$R tbx_glyphs.res} uses TBXUtils, TB2Common, TB2Item, Classes, Controls, Commctrl, Forms; var StockImgList: TImageList; StockPatternBitmap: TBitmap; CounterLock: Integer; gradCol1, gradCol2, gradHandle1, gradHandle2, gradHandle3, gradBL: TColor; procedure InitializeStock; begin StockImgList := TImageList.Create(nil); StockImgList.Handle := ImageList_LoadBitmap(HInstance, 'TBXGLYPHS', 16, 0, clWhite); end; procedure FinalizeStock; begin StockImgList.Free; end; { TTBXOffice2003Theme } function TTBXOffice2003Theme.GetBooleanMetrics(Index: Integer): Boolean; begin case Index of TMB_OFFICEXPPOPUPALIGNMENT: Result := True; TMB_EDITCAPTIONINDENTED: Result := True; TMB_EDITHEIGHTEVEN: Result := False; else Result := False; end; end; function TTBXOffice2003Theme.GetIntegerMetrics(Index: Integer): Integer; const DEFAULT = -1; begin case Index of TMI_SPLITBTN_ARROWWIDTH: Result := 12; TMI_DROPDOWN_ARROWWIDTH: Result := 8; TMI_DROPDOWN_ARROWMARGIN: Result := 3; TMI_MENU_VMARGIN: Result := 3; TMI_MENU_HMARGIN: Result := 1; TMI_MENU_IMGTEXTSPACE: Result := 0; TMI_MENU_LCAPTIONMARGIN: Result := 8; TMI_MENU_RCAPTIONMARGIN: Result := 3; TMI_MENU_SEPARATORSIZE: Result := 3; TMI_MENU_MDI_DW: Result := 2; TMI_MENU_MDI_DH: Result := 2; TMI_LINE_SPACING: Result := 6; TMI_TLBR_SEPARATORSIZE: Result := DEFAULT; TMI_EDIT_FRAMEWIDTH: Result := 1; TMI_EDIT_TEXTMARGINHORZ: Result := 2; TMI_EDIT_TEXTMARGINVERT: Result := 2; TMI_EDIT_MENUMIDWIDTH: Result := 0; TMI_EDIT_BTNWIDTH: Result := 14; else Result := DEFAULT; end; end; function TTBXOffice2003Theme.GetViewColor(AViewType: Integer): TColor; begin Result := clBtnFace; if (AViewType and VT_TOOLBAR) = VT_TOOLBAR then begin if (AViewType and TVT_MENUBAR) = TVT_MENUBAR then Result := MenubarColor else Result := ToolbarColor; end else if (AViewType and VT_POPUP) = VT_POPUP then begin if (AViewType and PVT_LISTBOX) = PVT_LISTBOX then Result := clWindow else Result := PopupColor; end else if (AViewType and VT_DOCKPANEL) = VT_DOCKPANEL then Result := DockPanelColor; end; function TTBXOffice2003Theme.GetBtnColor(const ItemInfo: TTBXItemInfo; ItemPart: TItemPart): TColor; const BFlags1: array [Boolean] of TBtnItemState = (bisDisabled, bisDisabledHot); BFlags2: array [Boolean] of TBtnItemState = (bisSelected, bisSelectedHot); BFlags3: array [Boolean] of TBtnItemState = (bisNormal, bisHot); var B: TBtnItemState; Embedded: Boolean; begin with ItemInfo do begin Embedded := (ViewType and VT_TOOLBAR = VT_TOOLBAR) and (ViewType and TVT_EMBEDDED = TVT_EMBEDDED); if not Enabled then B := BFlags1[HoverKind = hkKeyboardHover] else if ItemInfo.IsPopupParent then B := bisPopupParent else if Pushed then B := bisPressed else if Selected then B := BFlags2[HoverKind <> hkNone] else B := BFlags3[HoverKind <> hkNone]; Result := BtnItemColors[B, ItemPart]; if Embedded then begin if (ItemPart = ipBody) and (Result = clNone) then Result := ToolbarColor; if ItemPart = ipFrame then begin if Selected then Result := clWindowFrame else if (Result = clNone) then Result := clBtnShadow; end; end; end; end; function TTBXOffice2003Theme.GetPartColor(const ItemInfo: TTBXItemInfo; ItemPart: TItemPart): TColor; const MFlags1: array [Boolean] of TMenuItemState = (misDisabled, misDisabledHot); MFlags2: array [Boolean] of TMenuItemState = (misNormal, misHot); BFlags1: array [Boolean] of TBtnItemState = (bisDisabled, bisDisabledHot); BFlags2: array [Boolean] of TBtnItemState = (bisSelected, bisSelectedHot); BFlags3: array [Boolean] of TBtnItemState = (bisNormal, bisHot); var IsMenuItem, Embedded: Boolean; M: TMenuItemState; B: TBtnItemState; begin with ItemInfo do begin IsMenuItem := ((ViewType and PVT_POPUPMENU) = PVT_POPUPMENU) and ((ItemOptions and IO_TOOLBARSTYLE) = 0); Embedded := ((ViewType and VT_TOOLBAR) = VT_TOOLBAR) and ((ViewType and TVT_EMBEDDED) = TVT_EMBEDDED); if IsMenuItem then begin if not Enabled then M := MFlags1[HoverKind = hkKeyboardHover] else M := MFlags2[HoverKind <> hkNone]; Result := MenuItemColors[M, ItemPart]; end else begin if not Enabled then B := BFlags1[HoverKind = hkKeyboardHover] else if ItemInfo.IsPopupParent then B := bisPopupParent else if Pushed then B := bisPressed else if Selected then B := BFlags2[HoverKind <> hkNone] else B := BFlags3[HoverKind <> hkNone]; Result := BtnItemColors[B, ItemPart]; if Embedded and (Result = clNone) then begin if ItemPart = ipBody then Result := ToolbarColor; if ItemPart = ipFrame then Result := clBtnShadow; end; end; end; end; procedure FillGradient(const DC: HDC; const ARect: TRect; const StartColor, EndColor: TColor; const Direction: TGradDir); var rc1, rc2, gc1, gc2, bc1, bc2, Counter: Integer; Brush: HBrush; begin rc1 := GetRValue(ColorToRGB(StartColor)); gc1 := GetGValue(ColorToRGB(StartColor)); bc1 := GetBValue(ColorToRGB(StartColor)); rc2 := GetRValue(ColorToRGB(EndColor)); gc2 := GetGValue(ColorToRGB(EndColor)); bc2 := GetBValue(ColorToRGB(EndColor)); if Direction = tGTopBottom then for Counter := ARect.Top to ARect.Bottom - 1 do begin Brush:= CreateSolidBrush( RGB(Byte(rc1 + (((rc2 - rc1) * (ARect.Top + Counter)) div ARect.Bottom)), Byte(gc1 + (((gc2 - gc1) * (ARect.Top + Counter)) div ARect.Bottom)), Byte(bc1 + (((bc2 - bc1) * (ARect.Top + Counter)) div ARect.Bottom)))); FillRect(DC, Rect(ARect.Left, ARect.Top, ARect.Right, ARect.Bottom - Counter + 1), Brush); DeleteObject(Brush); end else for Counter := ARect.Left to ARect.Right - 1 do begin Brush := CreateSolidBrush( RGB(Byte(rc1 + (((rc2 - rc1) * (ARect.Left + Counter)) div ARect.Right)), Byte(gc1 + (((gc2 - gc1) * (ARect.Left + Counter)) div ARect.Right)), Byte(bc1 + (((bc2 - bc1) * (ARect.Left + Counter)) div ARect.Right)))); FillRect(DC, Rect(ARect.Left, ARect.Top, ARect.Right - Counter +1, ARect.Bottom), Brush); DeleteObject(Brush); end; end; function TTBXOffice2003Theme.GetItemColor(const ItemInfo: TTBXItemInfo): TColor; begin Result := GetPartColor(ItemInfo, ipBody); if Result = clNone then Result := GetViewColor(ItemInfo.ViewType); end; function TTBXOffice2003Theme.GetItemTextColor(const ItemInfo: TTBXItemInfo): TColor; begin Result := GetPartColor(ItemInfo, ipText); end; function TTBXOffice2003Theme.GetItemImageBackground(const ItemInfo: TTBXItemInfo): TColor; begin Result := GetBtnColor(ItemInfo, ipBody); if Result = clNone then result := GetViewColor(ItemInfo.ViewType); end; procedure TTBXOffice2003Theme.GetViewBorder(ViewType: Integer; out Border: TPoint); const XMetrics: array [Boolean] of Integer = (SM_CXDLGFRAME, SM_CXFRAME); YMetrics: array [Boolean] of Integer = (SM_CYDLGFRAME, SM_CYFRAME); var Resizable: Boolean; procedure SetBorder(X, Y: Integer); begin Border.X := X; Border.Y := Y; end; begin if (ViewType and VT_TOOLBAR) = VT_TOOLBAR then begin if (ViewType and TVT_FLOATING) = TVT_FLOATING then begin Resizable := (ViewType and TVT_RESIZABLE) = TVT_RESIZABLE; Border.X := GetSystemMetrics(XMetrics[Resizable]) - 1; Border.Y := GetSystemMetrics(YMetrics[Resizable]) - 1; end else SetBorder(2, 2); end else if (ViewType and VT_POPUP) = VT_POPUP then begin if (ViewType and PVT_POPUPMENU) = PVT_POPUPMENU then Border.X := 1 else Border.X := 2; Border.Y := 2; end else if (ViewType and VT_DOCKPANEL) = VT_DOCKPANEL then begin if (ViewType and DPVT_FLOATING) = DPVT_FLOATING then begin Resizable := (ViewType and DPVT_RESIZABLE) = DPVT_RESIZABLE; Border.X := GetSystemMetrics(XMetrics[Resizable]) - 1; Border.Y := GetSystemMetrics(YMetrics[Resizable]) - 1; end else SetBorder(2, 2); end else SetBorder(0, 0); end; procedure TTBXOffice2003Theme.GetMargins(MarginID: Integer; out Margins: TTBXMargins); begin with Margins do case MarginID of MID_TOOLBARITEM: begin LeftWidth := 2; RightWidth := 2; TopHeight := 2; BottomHeight := 2; end; MID_STATUSPANE: begin LeftWidth := 1; RightWidth := 3; TopHeight := 1; BottomHeight := 1; end; else LeftWidth := 0; RightWidth := 0; TopHeight := 0; BottomHeight := 0; end; end; procedure TTBXOffice2003Theme.PaintBackgnd(Canvas: TCanvas; const ADockRect, ARect, AClipRect: TRect; AColor: TColor; Transparent: Boolean; AViewType: Integer); var Brush: HBrush; R, AR: TRect; IsHoriz: boolean; begin if not Transparent then begin if ((AViewType and TVT_NORMALTOOLBAR) = TVT_NORMALTOOLBAR) //or ((AViewType and TVT_TOOLWINDOW) = TVT_TOOLWINDOW) {or ((AViewType and TVT_MENUBAR) = TVT_MENUBAR)} then begin IntersectRect(R, ARect, AClipRect); if (ADockRect.Top = 0) and (ADockRect.Left = 0) and (ADockRect.Right = 0) and (ADockRect.Bottom = 0) then IsHoriz:= (ARect.Right > ARect.Bottom) else IsHoriz:= Abs(R.Right - R.Left) > Abs(R.Bottom - R.Top); if IsHoriz then begin R.Bottom:= R.Bottom + 1; FillGradient(Canvas.Handle, R, gradCol1, gradCol2, TGTopBottom); R.Bottom:= R.Bottom - 1; end else begin R.Right:= R.Right + 1; FillGradient(Canvas.Handle, R, gradCol1, gradCol2, TGLeftRight); R.Right:= R.Right - 1; end; end else begin Brush := CreateSolidBrush(ColorToRGB(AColor)); IntersectRect(R, ARect, AClipRect); //The rects are compared to determine if we're drawing a toolbar, not a popup menu... if (ADockRect.Left <> ARect.Left) or (ADockRect.Top <> ARect.Top) or (ADockRect.Right <> ARect.Right) or (ADockRect.Bottom <> ARect.Bottom) then FillGradient(Canvas.Handle, R, gradCol2, gradCol1, TGLeftRight) else FillRect(Canvas.Handle, R, Brush); DeleteObject(Brush); end; end; end; procedure TTBXOffice2003Theme.PaintCaption(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo; const ACaption: string; AFormat: Cardinal; Rotated: Boolean); var R: TRect; begin with ItemInfo, Canvas do begin R := ARect; Brush.Style := bsClear; Font.Color := GetPartColor(ItemInfo, ipText); if not Rotated then Windows.DrawText(Handle, PChar(ACaption), Length(ACaption), R, AFormat) else DrawRotatedText(Handle, ACaption, R, AFormat); Brush.Style := bsSolid; end; end; procedure TTBXOffice2003Theme.PaintCheckMark(Canvas: TCanvas; ARect: TRect; const ItemInfo: TTBXItemInfo); var X, Y: Integer; begin X := (ARect.Left + ARect.Right) div 2 - 2; Y := (ARect.Top + ARect.Bottom) div 2 + 1; Canvas.Pen.Color := GetBtnColor(ItemInfo, ipText); Canvas.Polyline([Point(X-2, Y-2), Point(X, Y), Point(X+4, Y-4), Point(X+4, Y-3), Point(X, Y+1), Point(X-2, Y-1), Point(X-2, Y-2)]); end; procedure TTBXOffice2003Theme.PaintChevron(Canvas: TCanvas; ARect: TRect; const ItemInfo: TTBXItemInfo); const Pattern: array[Boolean, 0..15] of Byte = ( ($CC, 0, $66, 0, $33, 0, $66, 0, $CC, 0, 0, 0, 0, 0, 0, 0), ($88, 0, $D8, 0, $70, 0, $20, 0, $88, 0, $D8, 0, $70, 0, $20, 0)); var R2: TRect; Bmp: TBitmap; begin R2 := ARect; PaintButton(Canvas, ARect, ItemInfo); if not ItemInfo.IsVertical then begin R2.Top := 4; R2.Bottom := R2.Top + 5; Inc(R2.Left, 2); R2.Right := R2.Left + 8; end else begin R2.Left := R2.Right - 9; R2.Right := R2.Left + 5; Inc(R2.Top, 2); R2.Bottom := R2.Top + 8; end; Bmp := TBitmap.Create; try Bmp.Handle := CreateBitmap(8, 8, 1, 1, @Pattern[ItemInfo.IsVertical]); Canvas.Brush.Color := GetPartColor(ItemInfo, ipText); SetTextColor(Canvas.Handle, clBlack); SetBkColor(Canvas.Handle, clWhite); with R2 do BitBlt(Canvas.Handle, Left, Top, Right - Left, Bottom - Top, Bmp.Canvas.Handle, 0, 0, ROP_DSPDxax); finally Bmp.Free; end; end; procedure TTBXOffice2003Theme.PaintEditButton(Canvas: TCanvas; const ARect: TRect; var ItemInfo: TTBXItemInfo; ButtonInfo: TTBXEditBtnInfo); var BtnDisabled, BtnHot, BtnPressed, Embedded: Boolean; R, BR: TRect; X, Y: Integer; SaveItemInfoPushed: Boolean; begin R := ARect; Embedded := ((ItemInfo.ViewType and VT_TOOLBAR) = VT_TOOLBAR) and ((ItemInfo.ViewType and TVT_EMBEDDED) = TVT_EMBEDDED); InflateRect(R, 1, 1); Inc(R.Left); with Canvas do if ButtonInfo.ButtonType = EBT_DROPDOWN then begin BtnDisabled := (ButtonInfo.ButtonState and EBDS_DISABLED) <> 0; BtnHot := (ButtonInfo.ButtonState and EBDS_HOT) <> 0; BtnPressed := (ButtonInfo.ButtonState and EBDS_PRESSED) <> 0; if not BtnDisabled then begin if BtnPressed or BtnHot or Embedded then PaintButton(Canvas, R, ItemInfo) else if (ItemInfo.ViewType and VT_TOOLBAR) = VT_TOOLBAR then begin R := ARect; if not Embedded then begin FrameRectEx(Canvas, R, clWindow); Pen.Color := clWindow; end else Pen.Color := GetBtnColor(ItemInfo, ipFrame); MoveTo(R.Left - 1, R.Top); LineTo(R.Left - 1, R.Bottom); end; end; PaintDropDownArrow(Canvas, R, ItemInfo); end else if ButtonInfo.ButtonType = EBT_SPIN then begin BtnDisabled := (ButtonInfo.ButtonState and EBSS_DISABLED) <> 0; BtnHot := (ButtonInfo.ButtonState and EBSS_HOT) <> 0; { Upper button } BR := R; BR.Bottom := (R.Top + R.Bottom + 1) div 2; BtnPressed := (ButtonInfo.ButtonState and EBSS_UP) <> 0; SaveItemInfoPushed := ItemInfo.Pushed; ItemInfo.Pushed := BtnPressed; if not BtnDisabled then begin if BtnPressed or BtnHot or Embedded then PaintButton(Canvas, BR, ItemInfo) else if (ItemInfo.ViewType and VT_TOOLBAR) = VT_TOOLBAR then begin BR.Left := ARect.Left; BR.Top := ARect.Top; BR.Right := ARect.Right; if not Embedded then begin FrameRectEx(Canvas, BR, clWindow); Pen.Color := clWindow; end else Pen.Color := GetBtnColor(ItemInfo, ipFrame); MoveTo(BR.Left - 1, BR.Top); LineTo(BR.Left - 1, BR.Bottom); end; end; X := (BR.Left + BR.Right) div 2; Y := (BR.Top + BR.Bottom - 1) div 2; Pen.Color := GetPartColor(ItemInfo, ipText); Brush.Color := Pen.Color; Polygon([Point(X - 2, Y + 1), Point(X + 2, Y + 1), Point(X, Y - 1)]); { Lower button } BR := R; BR.Top := (R.Top + R.Bottom) div 2; BtnPressed := (ButtonInfo.ButtonState and EBSS_DOWN) <> 0; ItemInfo.Pushed := BtnPressed; if not BtnDisabled then begin if BtnPressed or BtnHot or Embedded then PaintButton(Canvas, BR, ItemInfo) else if (ItemInfo.ViewType and VT_TOOLBAR) = VT_TOOLBAR then begin BR.Left := ARect.Left; BR.Bottom := ARect.Bottom; BR.Right := ARect.Right; if not Embedded then begin FrameRectEx(Canvas, BR, clWindow); Pen.Color := clWindow; end else Pen.Color := GetBtnColor(ItemInfo, ipFrame); MoveTo(BR.Left - 1, BR.Top); LineTo(BR.Left - 1, BR.Bottom); end; end; X := (BR.Left + BR.Right) div 2; Y := (BR.Top + BR.Bottom) div 2; Pen.Color := GetPartColor(ItemInfo, ipText); Brush.Color := Pen.Color; Polygon([Point(X - 2, Y - 1), Point(X + 2, Y - 1), Point(X, Y + 1)]); ItemInfo.Pushed := SaveItemInfoPushed; end; end; procedure TTBXOffice2003Theme.PaintEditFrame(Canvas: TCanvas; const ARect: TRect; var ItemInfo: TTBXItemInfo; const EditInfo: TTBXEditInfo); var R: TRect; W: Integer; Embedded: Boolean; begin R := ARect; PaintFrame(Canvas, R, ItemInfo); W := EditFrameWidth; InflateRect(R, -W, -W); Embedded := ((ItemInfo.ViewType and VT_TOOLBAR) = VT_TOOLBAR) and ((ItemInfo.ViewType and TVT_EMBEDDED) = TVT_EMBEDDED); if not (ItemInfo.Enabled or Embedded) then FrameRectEx(Canvas, R, BtnItemColors[bisDisabled, ipText]); with EditInfo do begin if LeftBtnWidth > 0 then Inc(R.Left, LeftBtnWidth - 2); if RightBtnWidth > 0 then Dec(R.Right, RightBtnWidth - 2); end; if ItemInfo.Enabled then begin if ((ItemInfo.ViewType and VT_TOOLBAR) <> VT_TOOLBAR) and (GetPartColor(ItemInfo, ipFrame) = clNone) then FrameRectEx(Canvas, R, ToolbarColor) else begin Canvas.Brush.Color := clWindow; Canvas.FrameRect(R); end; end; InflateRect(R, -1, -1); if ItemInfo.Enabled then begin Canvas.Brush.Color := clWindow; Canvas.FillRect(R); if ((ItemInfo.ViewType and VT_TOOLBAR) <> VT_TOOLBAR) and (GetPartColor(ItemInfo, ipFrame) = clNone) then begin Canvas.Brush.Color := ToolbarColor; R := ARect; InflateRect(R, -1, -1); Canvas.FrameRect(R); end; end; if EditInfo.RightBtnWidth > 0 then begin R := ARect; InflateRect(R, -W, -W); R.Left := R.Right - EditInfo.RightBtnWidth; PaintEditButton(Canvas, R, ItemInfo, EditInfo.RightBtnInfo); end; end; procedure TTBXOffice2003Theme.PaintDropDownArrow(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo); var X, Y: Integer; begin with ARect, Canvas do begin X := (Left + Right) div 2; Y := (Top + Bottom) div 2 - 1; Pen.Color := GetPartColor(ItemInfo, ipText); Brush.Color := Pen.Color; if ItemInfo.IsVertical then Polygon([Point(X, Y + 2), Point(X, Y - 2), Point(X - 2, Y)]) else Polygon([Point(X - 2, Y), Point(X + 2, Y), Point(X, Y + 2)]); end; end; procedure TTBXOffice2003Theme.PaintButton(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo); var R: TRect; begin with ItemInfo, Canvas do begin R := ARect; if ((ItemOptions and IO_DESIGNING) <> 0) and not Selected then begin Brush.Color := GetNearestColor(Handle, MixColors(clBtnShadow, clBtnFace, 100)); if ComboPart = cpSplitRight then Dec(R.Left); FrameRect(R); end else begin FrameRectEx(Canvas, R, GetBtnColor(ItemInfo, ipFrame), True); if (ComboPart = cpSplitLeft) and IsPopupParent then Inc(R.Right); if ComboPart = cpSplitRight then Dec(R.Left); // rmk if (Selected) and ((ViewType and VT_TOOLBAR) = VT_TOOLBAR) then begin if IsVertical then FillGradient(Canvas.Handle, R, GetBtnColor(ItemInfo, ipBody), gradCol2, TGLeftRight) else FillGradient(Canvas.Handle, R, GetBtnColor(ItemInfo, ipBody), gradCol2, TGTopBottom); end else FillRectEx(Canvas, R, GetBtnColor(ItemInfo, ipBody)); end; if ComboPart = cpSplitRight then PaintDropDownArrow(Canvas, R, ItemInfo); end; end; procedure TTBXOffice2003Theme.PaintFloatingBorder(Canvas: TCanvas; const ARect: TRect; const WindowInfo: TTBXWindowInfo); const WinStates: array [Boolean] of TWinFramestate = (wfsInactive, wfsActive); function GetBtnItemState(BtnState: Integer): TBtnItemState; begin if not WindowInfo.Active then Result := bisDisabled else if (BtnState and CDBS_PRESSED) <> 0 then Result := bisPressed else if (BtnState and CDBS_HOT) <> 0 then Result := bisHot else Result := bisNormal; end; var WinState: TWinFrameState; BtnItemState: TBtnItemState; SaveIndex, X, Y: Integer; Sz: TPoint; R: TRect; BodyColor, CaptionColor, CaptionText: TColor; IsDockPanel: Boolean; procedure DrawGlyph(C: TColor); var Bmp: TBitmap; DC: HDC; begin Bmp := TBitmap.Create; try Bmp.Monochrome := True; StockImgList.GetBitmap(0, Bmp); Canvas.Brush.Color := C; DC := Canvas.Handle; SetTextColor(DC, clBlack); SetBkColor(DC, clWhite); BitBlt(DC, X, Y, StockImgList.Width, StockImgList.Height, Bmp.Canvas.Handle, 0, 0, ROP_DSPDxax); finally Bmp.Free; end; end; begin with Canvas do begin WinState := WinStates[WindowInfo.Active]; IsDockPanel := (WindowInfo.ViewType and VT_DOCKPANEL) = VT_DOCKPANEL; BodyColor := Brush.Color; if (WRP_BORDER and WindowInfo.RedrawPart) <> 0 then begin R := ARect; if not IsDockPanel then Brush.Color := WinFrameColors[WinState, wfpBorder] else Brush.Color := PnlFrameColors[WinState, wfpBorder]; SaveIndex := SaveDC(Canvas.Handle); Sz := WindowInfo.FloatingBorderSize; with R, Sz do ExcludeClipRect(Canvas.Handle, Left + X, Top + Y, Right - X, Bottom - Y); FillRect(R); RestoreDC(Canvas.Handle, SaveIndex); InflateRect(R, -Sz.X, -Sz.Y); Pen.Color := BodyColor; with R do if not IsDockPanel then Canvas.Polyline([ Point(Left, Top - 1), Point(Right - 1, Top - 1), Point(Right, Top), Point(Right, Bottom - 1), Point(Right - 1, Bottom), Point(Left, Bottom), Point(Left - 1, Bottom - 1), Point(Left - 1, Top), Point(Left, Top - 1) ]) else Canvas.Polyline([ Point(Left, Top - 1), Point(Right - 1, Top - 1), Point(Right, Top), Point(Right, Bottom), Point(Left - 1, Bottom), Point(Left - 1, Top), Point(Left, Top - 1) ]); end; if not WindowInfo.ShowCaption then Exit; if (WindowInfo.ViewType and VT_TOOLBAR) = VT_TOOLBAR then begin CaptionColor := WinFrameColors[WinState, wfpCaption]; CaptionText := WinFrameColors[WinState, wfpCaptionText]; end else begin CaptionColor := PnlFrameColors[WinState, wfpCaption]; CaptionText := PnlFrameColors[WinState, wfpCaptionText]; end; { Caption } if (WRP_CAPTION and WindowInfo.RedrawPart) <> 0 then begin R := Rect(0, 0, WindowInfo.ClientWidth, GetSystemMetrics(SM_CYSMCAPTION) - 1); with WindowInfo.FloatingBorderSize do OffsetRect(R, X, Y); DrawLineEx(Canvas, R.Left, R.Bottom, R.Right, R.Bottom, BodyColor); if ((CDBS_VISIBLE and WindowInfo.CloseButtonState) <> 0) and ((WRP_CLOSEBTN and WindowInfo.RedrawPart) <> 0) then Dec(R.Right, GetSystemMetrics(SM_CYSMCAPTION) - 1); Brush.Color := CaptionColor; FillRect(R); InflateRect(R, -2, 0); Font.Assign(SmCaptionFont); Font.Color := CaptionText; DrawText(Canvas.Handle, WindowInfo.Caption, -1, R, DT_SINGLELINE or DT_VCENTER or DT_END_ELLIPSIS or DT_HIDEPREFIX); end; { Close button } if (CDBS_VISIBLE and WindowInfo.CloseButtonState) <> 0 then begin R := Rect(0, 0, WindowInfo.ClientWidth, GetSystemMetrics(SM_CYSMCAPTION) - 1); with WindowInfo.FloatingBorderSize do OffsetRect(R, X, Y); R.Left := R.Right - (R.Bottom - R.Top); DrawLineEx(Canvas, R.Left - 1, R.Bottom, R.Right, R.Bottom, BodyColor); Brush.Color := CaptionColor; FillRect(R); with R do begin X := (Left + Right - StockImgList.Width + 1) div 2; Y := (Top + Bottom - StockImgList.Height) div 2; end; BtnItemState := GetBtnItemState(WindowInfo.CloseButtonState); FrameRectEx(Canvas, R, BtnItemColors[BtnItemState, ipFrame], True); if FillRectEx(Canvas, R, BtnItemColors[BtnItemState, ipBody]) then DrawGlyph(BtnItemColors[BtnItemState, ipText]) else DrawGlyph(CaptionText); end; end; end; procedure TTBXOffice2003Theme.PaintFrame(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo); var R: TRect; begin R := ARect; FrameRectEx(Canvas, R, GetPartColor(ItemInfo, ipFrame), True); FillRectEx(Canvas, R, GetPartColor(ItemInfo, ipBody)); end; function TTBXOffice2003Theme.GetImageOffset(Canvas: TCanvas; const ItemInfo: TTBXItemInfo; ImageList: TCustomImageList): TPoint; begin Result.X := 0; if not (ImageList is TTBCustomImageList) then with ItemInfo do if Enabled and (HoverKind <> hkNone) and not (Selected or Pushed and not IsPopupParent) then Result.X := -1; Result.Y := Result.X end; procedure TTBXOffice2003Theme.PaintImage(Canvas: TCanvas; ARect: TRect; const ItemInfo: TTBXItemInfo; ImageList: TCustomImageList; ImageIndex: Integer); var HiContrast: Boolean; begin with ItemInfo do begin if ImageList is TTBCustomImageList then begin TTBCustomImageList(ImageList).DrawState(Canvas, ARect.Left, ARect.Top, ImageIndex, Enabled, (HoverKind <> hkNone), Selected); Exit; end; {$IFNDEF ALTERNATIVE_DISABLED_STYLE} HiContrast := IsDarkColor(GetItemImageBackground(ItemInfo), 64); if not Enabled then begin DrawTBXIconFlatShadow(Canvas, ARect, ImageList, ImageIndex, BtnItemColors[bisDisabled, ipText]); end else if Selected or Pushed or (HoverKind <> hkNone) then begin if not (Selected or Pushed and not IsPopupParent) then begin OffsetRect(ARect, 1, 1); DrawTBXIconFullShadow(Canvas, ARect, ImageList, ImageIndex, IconShadowColor); OffsetRect(ARect, -2, -2); end; DrawTBXIcon(Canvas, ARect, ImageList, ImageIndex, HiContrast); end else if HiContrast or TBXHiContrast or TBXLoColor then DrawTBXIcon(Canvas, ARect, ImageList, ImageIndex, HiContrast) else HighlightTBXIcon(Canvas, ARect, ImageList, ImageIndex, clWindow, 178); {$ELSE} HiContrast := ColorIntensity(GetItemImageBackground(ItemInfo)) < 80; if not Enabled then begin if not HiContrast then DrawTBXIconShadow(Canvas, ARect, ImageList, ImageIndex, 0) else DrawTBXIconFlatShadow(Canvas, ARect, ImageList, ImageIndex, clBtnShadow); end else if Selected or Pushed or (HoverKind <> hkNone) then begin if not (Selected or Pushed and not IsPopupParent) then begin //DrawTBXIconShadow(Canvas, ARect, ImageList, ImageIndex, 1); //OffsetRect(ARect, 1, 1); //DrawTBXIconShadow(Canvas, ARect, ImageList, ImageIndex, 1); //OffsetRect(ARect, -2, -2); end; DrawTBXIcon(Canvas, ARect, ImageList, ImageIndex, HiContrast); end else if HiContrast or TBXHiContrast or TBXLoColor then DrawTBXIcon(Canvas, ARect, ImageList, ImageIndex, HiContrast) else HighlightTBXIcon(Canvas, ARect, ImageList, ImageIndex, clWindow, 178); {$ENDIF} end; end; procedure TTBXOffice2003Theme.PaintMDIButton(Canvas: TCanvas; ARect: TRect; const ItemInfo: TTBXItemInfo; ButtonKind: Cardinal); var Index: Integer; X, Y: Integer; Bmp: TBitmap; begin PaintButton(Canvas, ARect, ItemInfo); with ARect do begin X := (Left + Right - StockImgList.Width) div 2; Y := (Top + Bottom - StockImgList.Height) div 2; end; case ButtonKind of DFCS_CAPTIONMIN: Index := 2; DFCS_CAPTIONRESTORE: Index := 3; DFCS_CAPTIONCLOSE: Index := 0; else Exit; end; Bmp := TBitmap.Create; Bmp.Monochrome := True; StockImgList.GetBitmap(Index, Bmp); Canvas.Brush.Color := GetPartColor(ItemInfo, ipText); SetTextColor(Canvas.Handle, clBlack); SetBkColor(Canvas.Handle, clWhite); BitBlt(Canvas.Handle, X, Y, StockImgList.Width, StockImgList.Height, Bmp.Canvas.Handle, 0, 0, ROP_DSPDxax); Bmp.Free; end; procedure TTBXOffice2003Theme.PaintMenuItemFrame(Canvas: TCanvas; const ARect: TRect; const ItemInfo: TTBXItemInfo); var R: TRect; begin R := ARect; if (ItemInfo.ViewType and PVT_TOOLBOX) <> PVT_TOOLBOX then with Canvas do begin R.Right := R.Left + ItemInfo.PopupMargin + 2; Brush.Color := ToolbarColor; //FillRect(R); FillGradient(Handle, R, gradCol1, gradCol2, tGLeftRight); Inc(R.Left); R.Right := ARect.Right - 1; end; PaintFrame(Canvas, R, ItemInfo); end; procedure TTBXOffice2003Theme.PaintMenuItem(Canvas: TCanvas; var ARect: TRect; var ItemInfo: TTBXItemInfo); var R: TRect; X, Y: Integer; ArrowWidth: Integer; ClrText: TColor; procedure DrawArrow(AColor: TColor); begin Canvas.Pen.Color := AColor; Canvas.Brush.Color := AColor; Canvas.Polygon([Point(X, Y - 3), Point(X, Y + 3), Point(X + 3, Y)]); end; begin with Canvas, ItemInfo do begin ArrowWidth := GetSystemMetrics(SM_CXMENUCHECK); PaintMenuItemFrame(Canvas, ARect, ItemInfo); ClrText := GetPartColor(ItemInfo, ipText); R := ARect; if (ItemOptions and IO_COMBO) <> 0 then begin X := R.Right - ArrowWidth - 1; if not ItemInfo.Enabled then Pen.Color := ClrText else if HoverKind = hkMouseHover then Pen.Color := GetPartColor(ItemInfo, ipFrame) else Pen.Color := PopupSeparatorColor; MoveTo(X, R.Top + 1); LineTo(X, R.Bottom - 1); end; if (ItemOptions and IO_SUBMENUITEM) <> 0 then begin Y := ARect.Bottom div 2; X := ARect.Right - ArrowWidth * 2 div 3 - 1; DrawArrow(ClrText); end; InflateRect(ARect, -1, -1); if Selected and Enabled then begin R := ARect; R.Left := ARect.Left + 1; R.Right := R.Left + ItemInfo.PopupMargin - 2; FrameRectEx(Canvas, R, GetBtnColor(ItemInfo, ipFrame), True); // rmk FillGradient(Canvas.Handle, R, GetBtnColor(ItemInfo, ipBody), gradCol2, TGTopBottom); //FillRectEx(Canvas, R, GetBtnColor(ItemInfo, ipBody)); end; end; end; procedure TTBXOffice2003Theme.PaintPopupNCArea(Canvas: TCanvas; R: TRect; const PopupInfo: TTBXPopupInfo); var PR: TRect; begin with Canvas do begin Brush.Color := PopupFrameColor; FrameRect(R); InflateRect(R, -1, -1); Brush.Color := PopupColor; FillRect(R); if not IsRectEmpty(PopupInfo.ParentRect) then begin PR := PopupInfo.ParentRect; if not IsRectEmpty(PR) then with PR do begin Pen.Color := ToolbarColor; if Bottom = R.Top then begin if Left <= R.Left then Left := R.Left - 1; if Right >= R.Right then Right := R.Right + 1; MoveTo(Left + 1, Bottom - 1); LineTo(Right - 1, Bottom- 1); end else if Top = R.Bottom then begin if Left <= R.Left then Left := R.Left - 1; if Right >= R.Right then Right := R.Right + 1; MoveTo(Left + 1, Top); LineTo(Right - 1, Top); end; if Right = R.Left then begin if Top <= R.Top then Top := R.Top - 1; if Bottom >= R.Bottom then Bottom := R.Bottom + 1; MoveTo(Right - 1, Top + 1); LineTo(Right - 1, Bottom - 1); end else if Left = R.Right then begin if Top <= R.Top then Top := R.Top - 1; if Bottom >= R.Bottom then Bottom := R.Bottom + 1; MoveTo(Left, Top + 1); LineTo(Left, Bottom - 1); end; end; end; end; end; procedure TTBXOffice2003Theme.PaintSeparator(Canvas: TCanvas; ARect: TRect; ItemInfo: TTBXItemInfo; Horizontal, LineSeparator: Boolean); var IsToolbox: Boolean; R: TRect; begin with ItemInfo, ARect, Canvas do begin if Horizontal then begin IsToolbox := (ViewType and PVT_TOOLBOX) = PVT_TOOLBOX; if ((ItemOptions and IO_TOOLBARSTYLE) = 0) and not IsToolBox then begin R := ARect; R.Right := ItemInfo.PopupMargin + 2; Brush.Color := ToolbarColor; //FillRect(R); FillGradient(Canvas.Handle, R, gradCol1, gradCol2, tGLeftRight); Inc(Left, ItemInfo.PopupMargin + 9); Pen.Color := PopupSeparatorColor; end else Pen.Color := ToolbarSeparatorColor; // rmkPaint Top:= Bottom div 2; Left:= Left + 1; Right:= Right - 2; Bottom:= Top + 1; DrawLineEx(Canvas, Left, Top, Right, Top, clWhite); Left:= Left - 1; Right:= Right + 2; DrawLineEx(Canvas, Left, Top, Right, Top, PopupSeparatorColor); //Top := Bottom div 2; //MoveTo(Left, Top); LineTo(Right, Top); end else begin Top:= Top + 4; Bottom:= Bottom - 4; Left:= Right div 2; DrawLineEx(Canvas, Left, Top, Left, Bottom, clWhite); Top:= Top - 1; Left:= Left - 1; Bottom:= Bottom - 1; DrawLineEx(Canvas, Left, Top, Left, Bottom, ToolbarSeparatorColor); end; end; end; procedure DrawButtonBitmap(Canvas: TCanvas; R: TRect; Color: TColor); const {$IFNDEF SMALL_CLOSE_BUTTON} Pattern: array [0..15] of Byte = ($C3, 0, $66, 0, $3C, 0, $18, 0, $3C, 0, $66, 0, $C3, 0, 0, 0); {$ELSE} Pattern: array [0..15] of Byte = (0, 0, $63, 0, $36, 0, $1C, 0, $1C, 0, $36, 0, $63, 0, 0, 0); {$ENDIF} var Bmp: TBitmap; W, H: Integer; Index: Integer; begin Bmp := TBitmap.Create; try Bmp.Handle := CreateBitmap(8, 8, 1, 1, @Pattern); Index := SaveDC(Canvas.Handle); Canvas.Brush.Color := Color; SetTextColor(Canvas.Handle, clBlack); SetBkColor(Canvas.Handle, clWhite); W := 8; H := 7; with R do begin BitBlt(Canvas.Handle, (Left + Right - W + 1) div 2, (Top + Bottom - H) div 2, W, H, Bmp.Canvas.Handle, 0, 0, ROP_DSPDxax); end; RestoreDC(Canvas.Handle, Index); finally Bmp.Free; end; end; procedure TTBXOffice2003Theme.PaintToolbarNCArea(Canvas: TCanvas; R: TRect; const ToolbarInfo: TTBXToolbarInfo); const DragHandleOffsets: array [Boolean, DHS_DOUBLE..DHS_SINGLE] of Integer = ((2, 0, 1), (5, 0, 5)); function GetBtnItemState(BtnState: Integer): TBtnItemState; begin if (BtnState and CDBS_PRESSED) <> 0 then Result := bisPressed else if (BtnState and CDBS_HOT) <> 0 then Result := bisHot else Result := bisNormal; end; var Sz: Integer; R2: TRect; C: TColor; Hi1, Lo1, Hi2, Lo2, Hi3, Lo3, Hi4: TColor; I: Integer; BtnVisible, Horz: Boolean; BtnItemState: TBtnItemState; begin with Canvas do begin if ((ToolbarInfo.ViewType and TVT_NORMALTOOLBAR) = TVT_NORMALTOOLBAR) then begin with R do begin if (R.Right > R.Bottom) then begin FillGradient(Canvas.Handle, R, gradCol1, gradCol2, TGTopBottom); R2:= R; R2.Left:= R2.Right - 1; FillGradient(Canvas.Handle, R2, GradBL, gradCol1, TGTopBottom); Pen.Color:= gradBL; MoveTo(Left+ 1, Bottom - 1); LineTo(Right-1, Bottom - 1); Pen.Color:= gradCol1; MoveTo(Right-1, Bottom - 1); LineTo(Right-1, Bottom - 2); Pen.Color:= gradCol1; MoveTo(Left, Top); LineTo(Left, Top + 1); MoveTo(Right-2, Top); LineTo(Right-2, Top + 1); end else begin FillGradient(Canvas.Handle, R, gradCol1, gradCol2, TGLeftRight); R2:= R; R2.Top:= R2.Bottom - 1; FillGradient(Canvas.Handle, R2, GradBL, gradCol1, TGLeftRight); Pen.Color:= gradBL;; MoveTo(Right-1, Top + 1); LineTo(Right-1, Bottom - 1); Pen.Color:= gradCol1; MoveTo(Left, Top); LineTo(Left, Top + 1); MoveTo(Left, Bottom - 2); LineTo(Left, Bottom); end; end; InflateRect(R, -2, -2); end else begin FillGradient(Handle, R, gradCol2, gradCol1, TGLeftRight); InflateRect(R, -2, -2); end; if not ToolbarInfo.AllowDrag then Exit; BtnVisible := (ToolbarInfo.CloseButtonState and CDBS_VISIBLE) <> 0; Sz := GetTBXDragHandleSize(ToolbarInfo); Horz := not ToolbarInfo.IsVertical; if Horz then R.Right := R.Left + Sz else R.Bottom := R.Top + Sz; { Drag Handle } c:= gradHandle1;//clBtnFace; clBtnShadow Brush.Color:= c; Hi1:= GetNearestColor(Handle, MixColors(c, gradHandle2, 64)); Lo1:= GetNearestColor(Handle, MixColors(c, gradHandle2, 48)); Hi2:= GetNearestColor(Handle, MixColors(c, gradHandle2, 32)); Lo2:= GetNearestColor(Handle, MixColors(c, gradHandle2, 16)); Hi3:= GetNearestColor(Handle, MixColors(c, gradHandle3, 128)); Lo3:= GetNearestColor(Handle, MixColors(c, gradHandle3, 96)); Hi4:= GetNearestColor(Handle, MixColors(c, gradHandle3, 72)); { if (ToolbarInfo.ViewType and TVT_MENUBAR) <> TVT_MenuBar then begin if (R.Right < R.Bottom) then begin R.Left:= R.Left - 1; R.Bottom:= R.Bottom + 1; FillGradient(Canvas.Handle, R, gradCol1, gradCol2, TGTopBottom); with R do begin Pixels[Left, Top]:= gradCol1; Pixels[Left, Bottom - 2]:= gradCol1; end; R.Bottom:= R.Bottom - 1; R.Left:= R.Left + 1 end else begin R.Top:= R.Top - 1; R.Right:= R.Right + 1; FillGradient(Canvas.Handle, R, gradCol1, gradCol2, TGLeftRight); with R do begin Pixels[Left, Top]:= gradCol1; Pixels[Right - 2, Top]:= gradCol1; end; R.Right:= R.Right - 1; R.Top:= R.Top + 1; end; end; } if ToolbarInfo.DragHandleStyle <> DHS_NONE then begin R2:= R; if Horz then begin Inc(R2.Top, 4); Dec(R2.Bottom, 2); Inc(R2.Left, 1); if BtnVisible then begin Inc(R2.Top, Sz - 2); Inc(R2.Left, 4); Dec(R2.Right, 4); end; i:= R2.Top; while (i < R2.Bottom-3) do begin Pixels[R2.Left, i]:= Hi1; Pixels[R2.Left, i + 1]:= Hi2; Pixels[R2.Left + 1, i]:= Lo1; Pixels[R2.Left + 1, i + 1]:= Lo2; Pixels[R2.Left + 1, i + 2]:= Hi4; Pixels[R2.Left + 2, i + 2]:= Hi3; Pixels[R2.Left + 2, i + 1]:= Lo3; if ToolbarInfo.DragHandleStyle = DHS_DOUBLE then begin Pixels[R2.Left + 4, i]:= Hi1; Pixels[R2.Left + 4, i + 1]:= Hi2; Pixels[R2.Left + 4 + 1, i]:= Lo1; Pixels[R2.Left + 4 + 1, i + 1]:= Lo2; Pixels[R2.Left + 4 + 1, i + 2]:= Hi4; Pixels[R2.Left + 4 + 2, i + 2]:= Hi3; Pixels[R2.Left + 4 + 2, i + 1]:= Lo3; end; Inc(i, 4); end; end else begin Inc(R2.Left, 4); Dec(R2.Right, 2); Inc(R2.Top, 1); if BtnVisible then begin Dec(R2.Right, Sz - 2); Inc(R2.Top, 4); Dec(R2.Bottom, 4); end; i:= R2.Left; while (i < R2.Right-3) do begin Pixels[i, R2.Top]:= Hi1; Pixels[i, R2.Top + 1]:= Hi2; Pixels[i + 1, R2.Top]:= Lo1; Pixels[i + 1, R2.Top + 1]:= Lo2; Pixels[i + 1, R2.Top + 2]:= Hi4; Pixels[i + 2, R2.Top + 2]:= Hi3; Pixels[i + 2, R2.Top + 1]:= Lo3; if ToolbarInfo.DragHandleStyle = DHS_DOUBLE then begin Pixels[i, R2.Top + 4]:= Hi1; Pixels[i, R2.Top + 1 + 4]:= Hi2; Pixels[i + 1, R2.Top + 4]:= Lo1; Pixels[i + 1, R2.Top + 1 + 4]:= Lo2; Pixels[i + 1, R2.Top + 2 + 4]:= Hi4; Pixels[i + 2, R2.Top + 2 + 4]:= Hi3; Pixels[i + 2, R2.Top + 1 + 4]:= Lo3; end; Inc(i, 4); end; end; end; { Close button } if BtnVisible then begin R2 := R; if Horz then begin Dec(R2.Right); R2.Bottom := R2.Top + R2.Right - R2.Left; end else begin Dec(R2.Bottom); R2.Left := R2.Right - R2.Bottom + R2.Top; end; BtnItemState := GetBtnItemState(ToolbarInfo.CloseButtonState); FrameRectEx(Canvas, R2, BtnItemColors[BtnItemState, ipFrame], True); FillRectEx(Canvas, R2, BtnItemColors[BtnItemState, ipBody]); DrawButtonBitmap(Canvas, R2, BtnItemColors[BtnItemState, ipText]); end; end; end; procedure TTBXOffice2003Theme.PaintDockPanelNCArea(Canvas: TCanvas; R: TRect; const DockPanelInfo: TTBXDockPanelInfo); function GetBtnItemState(BtnState: Integer): TBtnItemState; begin if (BtnState and CDBS_PRESSED) <> 0 then Result := bisPressed else if (BtnState and CDBS_HOT) <> 0 then Result := bisHot else Result := bisNormal; end; var C, HeaderColor: TColor; I, Sz, Flags: Integer; R2: TRect; BtnItemState: TBtnItemState; begin with Canvas, DockPanelInfo do begin C := Brush.Color; // Dock panel passes its body color in Canvas.Brush I := ColorIntensity(ColorToRGB(clBtnFace)); R2 := R; if not TBXLoColor and (I in [64..250]) then begin FrameRectEx(Canvas, R, clBtnFace, True); FrameRectEx(Canvas, R, C); with R do begin Pixels[Left, Top] := clBtnFace; if IsVertical then Pixels[Right - 1, Top] := clBtnFace else Pixels[Left, Bottom - 1] := clBtnFace; end; end else begin FrameRectEx(Canvas, R, C, True); if I < 64 then Brush.Bitmap := AllocPatternBitmap(C, clWhite) else Brush.Bitmap := AllocPatternBitmap(C, clBtnShadow); FrameRect(R); with R do begin Pixels[Left, Top] := C; if IsVertical then Pixels[Right - 1, Top] := C else Pixels[Left, Bottom - 1] := C; end; InflateRect(R, -1, -1); FrameRectEx(Canvas, R, C); end; R := R2; InflateRect(R, -BorderSize.X, -BorderSize.Y); Sz := GetSystemMetrics(SM_CYSMCAPTION); if IsVertical then begin R.Bottom := R.Top + Sz - 1; DrawLineEx(Canvas, R.Left, R.Bottom, R.Right, R.Bottom, C); end else begin R.Right := R.Left + Sz - 1; DrawLineEx(Canvas, R.Right, R.Top, R.Right, R.Bottom, C); end; HeaderColor := clBtnFace; FillRectEx(Canvas, R, HeaderColor); if (CDBS_VISIBLE and CloseButtonState) <> 0 then begin R2 := R; if IsVertical then begin R2.Left := R2.Right - Sz + 1; R.Right := R2.Left; end else begin R2.Top := R2.Bottom - Sz + 1; R.Bottom := R2.Top; end; BtnItemState := GetBtnItemState(CloseButtonState); FrameRectEx(Canvas, R2, BtnItemColors[BtnItemState, ipFrame], True); FillRectEx(Canvas, R2, BtnItemColors[BtnItemState, ipBody]); DrawButtonBitmap(Canvas, R2, BtnItemColors[BtnItemState, ipText]); end; if IsVertical then InflateRect(R, -4, 0) else InflateRect(R, 0, -4); Font.Assign(SmCaptionFont); Font.Color := clBtnText; Brush.Color := HeaderColor; Brush.Style := bsSolid; Flags := DT_SINGLELINE or DT_VCENTER or DT_END_ELLIPSIS or DT_HIDEPREFIX; if IsVertical then DrawText(Canvas.Handle, Caption, -1, R, Flags) else DrawRotatedText(Canvas.Handle, string(Caption), R, Flags); end; end; procedure TTBXOffice2003Theme.SetupColorCache; var DC: HDC; HotBtnFace, DisabledText: TColor; procedure Undither(var C: TColor); begin if C <> clNone then C := GetNearestColor(DC, ColorToRGB(C)); end; begin DC := StockCompatibleBitmap.Canvas.Handle; // gradColors rmk gradCol1:= clBtnFace; gradCol2:= RGB(245, 244, 242); gradHandle1:= clBtnFace; gradHandle2:= clGray; gradHandle3:= clWhite; gradBL:= RGB(219, 216, 209); //clBtnShadow; // alternativ colors why not give it a try! // Blue { gradCol1:= $00FECA9C; gradCol2:= clWhite; gradHandle1:= $00FECA9C; gradHandle2:= clNavy; gradHandle3:= clWhite; gradBL:= clNavy; } //Olive { gradCol1:= $009CCFCF; gradCol2:= clWhite; gradHandle1:= $009CCFCF; gradHandle2:= clOlive; gradHandle3:= clWhite; gradBL:= clOlive; // Maybe these are better? gradCol1:= $00B8DCDC; gradHandle1:= $00B8DCDC; } // gradColors rmk end if TBXLoColor then begin { View/Window Colors } MenubarColor := clBtnFace; ToolbarColor := clBtnFace; PopupColor := clWindow; DockPanelColor := clWindow; StatusPanelFrameColor := clBtnShadow; PopupFrameColor := clBtnText; WinFrameColors[wfsActive, wfpBorder] := clBtnShadow; WinFrameColors[wfsActive, wfpCaption] := clBtnShadow; WinFrameColors[wfsActive, wfpCaptionText] := clBtnHighlight; WinFrameColors[wfsInactive, wfpBorder] := clBtnShadow; WinFrameColors[wfsInactive, wfpCaption] := clBtnShadow; WinFrameColors[wfsInactive, wfpCaptionText] := clBtnHighlight; PnlFrameColors[wfsActive, wfpBorder] := clBtnShadow; PnlFrameColors[wfsActive, wfpCaption] := clBtnFace; PnlFrameColors[wfsActive, wfpCaptionText] := clBtnText; PnlFrameColors[wfsInactive, wfpBorder] := clBtnShadow; PnlFrameColors[wfsInactive, wfpCaption] := clBtnFace; PnlFrameColors[wfsInactive, wfpCaptionText] := clBtnText; MenuItemColors[misNormal, ipBody] := clNone; MenuItemColors[misNormal, ipText] := clWindowText; MenuItemColors[misNormal, ipFrame] := clNone; MenuItemColors[misDisabled, ipBody] := clNone; MenuItemColors[misDisabled, ipText] := clGrayText; MenuItemColors[misDisabled, ipFrame] := clNone; MenuItemColors[misHot, ipBody] := clWindow; MenuItemColors[misHot, ipText] := clWindowtext; MenuItemColors[misHot, ipFrame] := clHighlight; MenuItemColors[misDisabledHot, ipBody] := clWindow; MenuItemColors[misDisabledHot, ipText] := clGrayText; MenuItemColors[misDisabledHot, ipFrame] := clHighlight; BtnItemColors[bisNormal, ipBody] := clNone; BtnItemColors[bisNormal, ipText] := clBtnText; BtnItemColors[bisNormal, ipFrame] := clNone; BtnItemColors[bisDisabled, ipBody] := clNone; BtnItemColors[bisDisabled, ipText] := clBtnShadow; BtnItemColors[bisDisabled, ipFrame] := clNone; BtnItemColors[bisSelected, ipBody] := clWindow; BtnItemColors[bisSelected, ipText] := clWindowText; BtnItemColors[bisSelected, ipFrame] := clHighlight; BtnItemColors[bisPressed, ipBody] := clHighlight; BtnItemColors[bisPressed, ipText] := clHighlightText; BtnItemColors[bisPressed, ipFrame] := clHighlight; BtnItemColors[bisHot, ipBody] := clWindow; BtnItemColors[bisHot, ipText] := clWindowText; BtnItemColors[bisHot, ipFrame] := clHighlight; BtnItemColors[bisDisabledHot, ipBody] := clWindow; BtnItemColors[bisDisabledHot, ipText] := clBtnShadow; BtnItemColors[bisDisabledHot, ipFrame] := clHighlight; BtnItemColors[bisSelectedHot, ipBody] := clHighlight; BtnItemColors[bisSelectedHot, ipText] := clHighlightText; BtnItemColors[bisSelectedHot, ipFrame] := clHighlight; BtnItemColors[bisPopupParent, ipBody] := clBtnFace; BtnItemColors[bisPopupParent, ipText] := clBtnText; BtnItemColors[bisPopupParent, ipFrame] := PopupFrameColor; { Other Colors } DragHandleColor := clBtnText; IconShadowColor := clBtnFace; PopupSeparatorColor := RGB(166,166,166); //clBtnShadow; ToolbarSeparatorColor := RGB(166,166,166); //clBtnShadow; end else begin { View/Window Colors } MenubarColor := gradCol1; ToolbarColor := gradCol2; PopupColor := Blend(clBtnFace, clWindow, 143); DockPanelColor := PopupColor; PopupFrameColor := Blend(clBtnText, clBtnShadow, 20); SetContrast(PopupFrameColor, PopupColor, 100); HotBtnFace := Blend(clHighlight, clWindow, 30); SetContrast(HotBtnFace, ToolbarColor, 50); DisabledText := Blend(clBtnshadow, clWindow, 90); WinFrameColors[wfsActive, wfpBorder] := Blend(clBtnText, clBtnShadow, 15); SetContrast(WinFrameColors[wfsActive, wfpBorder], ToolbarColor, 120); WinFrameColors[wfsActive, wfpCaption] := clBtnShadow; WinFrameColors[wfsActive, wfpCaptionText] := clBtnHighlight; SetContrast(WinFrameColors[wfsActive, wfpCaptionText], clBtnShadow, 180); WinFrameColors[wfsInactive, wfpBorder] := WinFrameColors[wfsActive, wfpBorder]; WinFrameColors[wfsInactive, wfpCaption] := clBtnFace; WinFrameColors[wfsInactive, wfpCaptionText] := DisabledText; SetContrast(WinFrameColors[wfsInactive, wfpCaptionText], clBtnFace, 120); PnlFrameColors[wfsActive, wfpBorder] := clBtnShadow; PnlFrameColors[wfsActive, wfpCaption] := clBtnFace; PnlFrameColors[wfsActive, wfpCaptionText] := clBtnText; PnlFrameColors[wfsInactive, wfpBorder] := clBtnShadow; PnlFrameColors[wfsInactive, wfpCaption] := clBtnFace; PnlFrameColors[wfsInactive, wfpCaptionText] := DisabledText; SetContrast(PnlFrameColors[wfsInactive, wfpCaptionText], clBtnFace, 120); BtnItemColors[bisNormal, ipBody] := clNone; BtnItemColors[bisNormal, ipText] := clBtnText; SetContrast(BtnItemColors[bisNormal, ipText], ToolbarColor, 180); BtnItemColors[bisNormal, ipFrame] := clNone; BtnItemColors[bisDisabled, ipBody] := clNone; BtnItemColors[bisDisabled, ipText] := DisabledText; SetContrast(BtnItemColors[bisDisabled, ipText], ToolbarColor, 80); BtnItemColors[bisDisabled, ipFrame] := clNone; BtnItemColors[bisSelected, ipBody] := Blend(clHighlight, Blend(clBtnFace, clWindow, 50), 10); SetContrast(BtnItemColors[bisSelected, ipBody], ToolbarColor, 5); BtnItemColors[bisSelected, ipText] := BtnItemColors[bisNormal, ipText]; BtnItemColors[bisSelected, ipFrame] := clHighlight; BtnItemColors[bisPressed, ipBody] := Blend(clHighlight, clWindow, 50); BtnItemColors[bisPressed, ipText] := clHighlightText; BtnItemColors[bisPressed, ipFrame] := clHighlight; BtnItemColors[bisHot, ipBody] := HotBtnFace; BtnItemColors[bisHot, ipText] := clMenuText; SetContrast(BtnItemColors[bisHot, ipText], BtnItemColors[bisHot, ipBody], 180); BtnItemColors[bisHot, ipFrame] := clHighlight; SetContrast(BtnItemColors[bisHot, ipFrame], ToolbarColor, 100); BtnItemColors[bisDisabledHot, ipBody] := HotBtnFace; BtnItemColors[bisDisabledHot, ipText] := DisabledText; BtnItemColors[bisDisabledHot, ipFrame] := clHighlight; BtnItemColors[bisSelectedHot, ipBody] := Blend(clHighlight, clWindow, 50); SetContrast(BtnItemColors[bisSelectedHot, ipBody], ToolbarColor, 30); BtnItemColors[bisSelectedHot, ipText] := clHighlightText; SetContrast(BtnItemColors[bisSelectedHot, ipText], BtnItemColors[bisSelectedHot, ipBody], 180); BtnItemColors[bisSelectedHot, ipFrame] := clHighlight; SetContrast(BtnItemColors[bisSelectedHot, ipFrame], BtnItemColors[bisSelectedHot, ipBody], 100); BtnItemColors[bisPopupParent, ipBody] := ToolbarColor; BtnItemColors[bisPopupParent, ipText] := BtnItemColors[bisNormal, ipText]; BtnItemColors[bisPopupParent, ipFrame] := PopupFrameColor; MenuItemColors[misNormal, ipBody] := clNone; MenuItemColors[misNormal, ipText] := clWindowText; SetContrast(MenuItemColors[misNormal, ipText], PopupColor, 180); MenuItemColors[misNormal, ipFrame] := clNone; MenuItemColors[misDisabled, ipBody] := clNone; MenuItemColors[misDisabled, ipText] := Blend(clGrayText, clWindow, 70); SetContrast(MenuItemColors[misDisabled, ipText], PopupColor, 80); // 145? MenuItemColors[misDisabled, ipFrame] := clNone; MenuItemColors[misHot, ipBody] := BtnItemColors[bisHot, ipBody]; MenuItemColors[misHot, ipText] := BtnItemColors[bisHot, ipText]; MenuItemColors[misHot, ipFrame] := BtnItemColors[bisHot, ipFrame]; MenuItemColors[misDisabledHot, ipBody] := PopupColor; MenuItemColors[misDisabledHot, ipText] := Blend(clGrayText, clWindow, 70); MenuItemColors[misDisabledHot, ipFrame] := clHighlight; DragHandleColor := Blend(clBtnShadow, clWindow, 75); SetContrast(DragHandleColor, ToolbarColor, 85); IconShadowColor := Blend(clBlack, HotBtnFace, 25); ToolbarSeparatorColor := Blend(clBtnShadow, clWindow, 70); SetContrast(ToolbarSeparatorColor, ToolbarColor, 50); PopupSeparatorColor := ToolbarSeparatorColor; StatusPanelFrameColor := Blend(clWindow, clBtnFace, 30); SetContrast(StatusPanelFrameColor, clBtnFace, 30); Undither(MenubarColor); Undither(ToolbarColor); Undither(PopupColor); Undither(DockPanelColor); Undither(PopupFrameColor); Undither(WinFrameColors[wfsActive, wfpBorder]); Undither(WinFrameColors[wfsActive, wfpCaption]); Undither(WinFrameColors[wfsActive, wfpCaptionText]); Undither(WinFrameColors[wfsInactive, wfpBorder]); Undither(WinFrameColors[wfsInactive, wfpCaption]); Undither(WinFrameColors[wfsInactive, wfpCaptionText]); Undither(PnlFrameColors[wfsActive, wfpBorder]); Undither(PnlFrameColors[wfsActive, wfpCaption]); Undither(PnlFrameColors[wfsActive, wfpCaptionText]); Undither(PnlFrameColors[wfsInactive, wfpBorder]); Undither(PnlFrameColors[wfsInactive, wfpCaption]); Undither(PnlFrameColors[wfsInactive, wfpCaptionText]); Undither(BtnItemColors[bisNormal, ipBody]); Undither(BtnItemColors[bisNormal, ipText]); Undither(BtnItemColors[bisNormal, ipFrame]); Undither(BtnItemColors[bisDisabled, ipBody]); Undither(BtnItemColors[bisDisabled, ipText]); Undither(BtnItemColors[bisDisabled, ipFrame]); Undither(BtnItemColors[bisSelected, ipBody]); Undither(BtnItemColors[bisSelected, ipText]); Undither(BtnItemColors[bisSelected, ipFrame]); Undither(BtnItemColors[bisPressed, ipBody]); Undither(BtnItemColors[bisPressed, ipText]); Undither(BtnItemColors[bisPressed, ipFrame]); Undither(BtnItemColors[bisHot, ipBody]); Undither(BtnItemColors[bisHot, ipText]); Undither(BtnItemColors[bisHot, ipFrame]); Undither(BtnItemColors[bisDisabledHot, ipBody]); Undither(BtnItemColors[bisDisabledHot, ipText]); Undither(BtnItemColors[bisDisabledHot, ipFrame]); Undither(BtnItemColors[bisSelectedHot, ipBody]); Undither(BtnItemColors[bisSelectedHot, ipText]); Undither(BtnItemColors[bisSelectedHot, ipFrame]); Undither(BtnItemColors[bisPopupParent, ipBody]); Undither(BtnItemColors[bisPopupParent, ipText]); Undither(BtnItemColors[bisPopupParent, ipFrame]); Undither(MenuItemColors[misNormal, ipBody]); Undither(MenuItemColors[misNormal, ipText]); Undither(MenuItemColors[misNormal, ipFrame]); Undither(MenuItemColors[misDisabled, ipBody]); Undither(MenuItemColors[misDisabled, ipText]); Undither(MenuItemColors[misDisabled, ipFrame]); Undither(MenuItemColors[misHot, ipBody]); Undither(MenuItemColors[misHot, ipText]); Undither(MenuItemColors[misHot, ipFrame]); Undither(MenuItemColors[misDisabledHot, ipBody]); Undither(MenuItemColors[misDisabledHot, ipText]); Undither(MenuItemColors[misDisabledHot, ipFrame]); Undither(DragHandleColor); Undither(IconShadowColor); Undither(ToolbarSeparatorColor); Undither(PopupSeparatorColor); Undither(StatusPanelFrameColor); end; end; function TTBXOffice2003Theme.GetPopupShadowType: Integer; begin Result := PST_OFFICEXP; end; constructor TTBXOffice2003Theme.Create(const AName: string); begin inherited; if CounterLock = 0 then InitializeStock; Inc(CounterLock); AddTBXSysChangeNotification(Self); SetupColorCache; end; destructor TTBXOffice2003Theme.Destroy; begin RemoveTBXSysChangeNotification(Self); Dec(CounterLock); if CounterLock = 0 then FinalizeStock; inherited; end; procedure TTBXOffice2003Theme.GetViewMargins(ViewType: Integer; out Margins: TTBXMargins); begin Margins.LeftWidth := 0; Margins.TopHeight := 0; Margins.RightWidth := 0; Margins.BottomHeight := 0; end; procedure TTBXOffice2003Theme.PaintPageScrollButton(Canvas: TCanvas; const ARect: TRect; ButtonType: Integer; Hot: Boolean); var R: TRect; X, Y, Sz: Integer; begin R := ARect; if Hot then Canvas.Brush.Color := BtnItemColors[bisHot, ipFrame] else Canvas.Brush.Color := clBtnShadow; Canvas.FrameRect(R); if Hot then Canvas.Brush.Color := BtnItemColors[bisHot, ipBody] else Canvas.Brush.Color := clBtnFace; InflateRect(R, -1, -1); Canvas.FillRect(R); X := (R.Left + R.Right) div 2; Y := (R.Top + R.Bottom) div 2; Sz := Min(X - R.Left, Y - R.Top) * 3 div 4; if Hot then Canvas.Pen.Color := BtnItemColors[bisHot, ipText] else Canvas.Pen.Color := BtnItemColors[bisNormal, ipText]; Canvas.Brush.Color := Canvas.Pen.Color; case ButtonType of PSBT_UP: begin Inc(Y, Sz div 2); Canvas.Polygon([Point(X + Sz, Y), Point(X, Y - Sz), Point(X - Sz, Y)]); end; PSBT_DOWN: begin Y := (R.Top + R.Bottom - 1) div 2; Dec(Y, Sz div 2); Canvas.Polygon([Point(X + Sz, Y), Point(X, Y + Sz), Point(X - Sz, Y)]); end; PSBT_LEFT: begin Inc(X, Sz div 2); Canvas.Polygon([Point(X, Y + Sz), Point(X - Sz, Y), Point(X, Y - Sz)]); end; PSBT_RIGHT: begin X := (R.Left + R.Right - 1) div 2; Dec(X, Sz div 2); Canvas.Polygon([Point(X, Y + Sz), Point(X + Sz, Y), Point(X, Y - Sz)]); end; end; end; procedure TTBXOffice2003Theme.PaintGlyph(Canvas: TCanvas; R: TRect; Kind, State: Integer); var X, Y: Integer; procedure SetupPen; begin if Boolean(State and GS_DISABLED) then Canvas.Pen.Color := clBtnShadow else if Boolean(State and GS_PUSHED) then Canvas.Pen.Color := BtnItemColors[bisPressed, ipFrame] else if Boolean(State and GS_HOT) then Canvas.Pen.Color := BtnItemColors[bisHot, ipFrame] else Canvas.Pen.Color := clBtnShadow; end; procedure SetupBrush; begin Canvas.Brush.Style := bsSolid; if Boolean(State and GS_DISABLED) then Canvas.Brush.Style := bsClear else if Boolean(State and GS_PUSHED) then Canvas.Brush.Color := BtnItemColors[bisPressed, ipBody] else if Boolean(State and GS_HOT) then Canvas.Brush.Color := BtnItemColors[bisHot, ipBody] else if Boolean(State and GS_MIXED) then Canvas.Brush.Bitmap := AllocPatternBitmap(clWindow, clBtnFace) else Canvas.Brush.Style := bsClear; end; function TextColor: TColor; begin if Boolean(State and GS_DISABLED) then Result := BtnItemColors[bisDisabled, ipText] else if Boolean(State and GS_PUSHED) then Result := BtnItemColors[bisPressed, ipText] else if Boolean(State and GS_MIXED) then Result := clBtnShadow else if Boolean(State and GS_HOT) then Result := BtnItemColors[bisHot, ipText] else Result := BtnItemColors[bisNormal, ipText]; end; procedure DiagLine(C: TColor); begin with Canvas, R do begin Pen.Color := C; MoveTo(Right - 1 - X, Bottom - 1); LineTo(Right, Bottom - X - 2); Inc(X); end; end; begin with Canvas do case Kind of GK_CHECKBOX: begin SetupPen; SetupBrush; InflateRect(R, -1, -1); with R do Rectangle(Left, Top, Right, Bottom); Pen.Style := psSolid; Brush.Style := bsSolid; if Boolean(State and (GS_CHECKED or GS_MIXED)) then begin X := (R.Left + R.Right) div 2 - 1; Y := (R.Top + R.Bottom) div 2 + 1; Pen.Color := TextColor; Brush.Color := Pen.Color; Polygon([Point(X-2, Y), Point(X, Y+2), Point(X+4, Y-2), Point(X+4, Y-4), Point(X, Y), Point(X-2, Y-2), Point(X-2, Y)]); end; end; GK_RADIOBUTTON: begin SetupPen; SetupBrush; InflateRect(R, -1, -1); with R do Ellipse(Left, Top, Right, Bottom); Pen.Style := psSolid; Brush.Style := bsSolid; if Boolean(State and GS_CHECKED) then begin InflateRect(R, -3, -3); Pen.Color := TextColor; Brush.Color := Pen.Color; with R do Ellipse(Left, Top, Right, Bottom); end; end; end; end; procedure TTBXOffice2003Theme.PaintStatusBar(Canvas: TCanvas; R: TRect; Part: Integer); var I, D, Sz: integer; procedure DiagLine(C: TColor); begin with R do DrawLineEx(Canvas, Right - 1 - D, Bottom - 1, Right, Bottom - D - 2, C); Inc(D); end; begin with Canvas do case Part of SBP_BODY: begin FillRectEx(Canvas, R, clBtnFace); end; SBP_PANE, SBP_LASTPANE: begin if Part = SBP_PANE then Dec(R.Right, 2); FrameRectEx(Canvas, R, StatusPanelFrameColor); end; SBP_GRIPPER: begin D := 0; Sz := Min(R.Right - R.Left, R.Bottom - R.Top); //for I := 1 to 3 do case Sz of 0..8: begin DiagLine(clBtnShadow); DiagLine(clBtnHighlight); DiagLine(clBtnShadow); DiagLine(clBtnHighlight); DiagLine(clBtnShadow); DiagLine(clBtnHighlight); end; 9..11: begin DiagLine(clBtnFace); DiagLine(clBtnShadow); DiagLine(clBtnHighlight); DiagLine(clBtnFace); DiagLine(clBtnShadow); DiagLine(clBtnHighlight); DiagLine(clBtnFace); DiagLine(clBtnShadow); DiagLine(clBtnHighlight); end; 12..14: begin DiagLine(clBtnShadow); DiagLine(clBtnShadow); DiagLine(clBtnHighlight); DiagLine(clBtnShadow); DiagLine(clBtnShadow); DiagLine(clBtnHighlight); DiagLine(clBtnShadow); DiagLine(clBtnShadow); DiagLine(clBtnHighlight); end; else DiagLine(clBtnShadow); DiagLine(clBtnShadow); DiagLine(clBtnHighlight); DiagLine(clBtnFace); DiagLine(clBtnShadow); DiagLine(clBtnShadow); DiagLine(clBtnShadow); DiagLine(clBtnHighlight); DiagLine(clBtnFace); DiagLine(clBtnShadow); DiagLine(clBtnShadow); DiagLine(clBtnShadow); DiagLine(clBtnHighlight); end; end; end; end; procedure TTBXOffice2003Theme.TBXSysCommand(var Message: TMessage); begin if Message.WParam = TSC_VIEWCHANGE then SetupColorCache; end; initialization RegisterTBXTheme('Office2003', TTBXOffice2003Theme); end.