📄 dxribbonstatusbar.pas
字号:
{********************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressStatusBar }
{ }
{ Copyright (c) 1998-2008 Developer Express Inc. }
{ ALL RIGHTS RESERVED }
{ }
{ The entire contents of this file is protected by U.S. and }
{ International Copyright Laws. Unauthorized reproduction, }
{ reverse-engineering, and distribution of all or any portion of }
{ the code contained in this file is strictly prohibited and may }
{ result in severe civil and criminal penalties and will be }
{ prosecuted to the maximum extent possible under the law. }
{ }
{ RESTRICTIONS }
{ }
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
{ LICENSED TO DISTRIBUTE THE EXPRESSSTATUSBAR 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 dxRibbonStatusBar;
{$I cxVer.inc}
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Graphics, ImgList, Forms, Types,
ExtCtrls, dxThemeManager, cxClasses, cxGraphics, cxControls, cxLookAndFeels,
dxBar, dxStatusBar, dxRibbonSkins, dxRibbon;
type
TdxRibbonStatusBar = class;
TdxStatusBarToolbarPanelStyle = class;
{ TdxRibbonStatusBarBarControlPainter }
TdxRibbonStatusBarBarControlPainter = class(TdxBarSkinnedPainter)
protected
procedure DrawToolbarContentPart(ABarControl: TdxBarControl; ACanvas: TcxCanvas); override;
procedure DrawToolbarNonContentPart(ABarControl: TdxBarControl; DC: HDC); override;
public
function BarBeginGroupSize: Integer; override;
procedure BarDrawBeginGroup(ABarControl: TCustomdxBarControl; DC: HDC;
ABeginGroupRect: TRect; AToolbarBrush: HBRUSH; AHorz: Boolean); override;
function GetButtonBorderHeight: Integer; override;
function GetEnabledTextColor(ABarItemControl: TdxBarItemControl;
ASelected, AFlat: Boolean): TColor; override;
procedure GetDisabledTextColors(ABarItemControl: TdxBarItemControl;
ASelected, AFlat: Boolean; var AColor1, AColor2: TColor); override;
function GetToolbarContentOffsets(ABar: TdxBar;
ADockingStyle: TdxBarDockingStyle; AHasSizeGrip: Boolean): TRect; override;
function MarkButtonOffset: Integer; virtual;
function MarkSizeX(ABarControl: TdxBarControl): Integer; override;
function GetColorScheme(ABarControl: TCustomdxBarControl): TdxCustomRibbonSkin;
end;
{ TdxDefaultRibbonStatusBarBarControlPainter }
TdxDefaultRibbonStatusBarBarControlPainter = class(TdxBarFlatPainter)
public
function GetButtonBorderHeight: Integer; override;
function GetToolbarContentOffsets(ABar: TdxBar;
ADockingStyle: TdxBarDockingStyle; AHasSizeGrip: Boolean): TRect; override;
function MarkButtonOffset: Integer; virtual;
function MarkSizeX(ABarControl: TdxBarControl): Integer; override;
end;
{ TdxRibbonStatusBarBarControlViewInfo }
TdxRibbonStatusBarBarControlViewInfo = class(TdxRibbonQuickAccessBarControlViewInfo)
protected
function CanShowButtonGroups: Boolean; override;
function CanShowSeparators: Boolean; override;
end;
{ TdxRibbonStatusBarBarControl }
TdxRibbonStatusBarBarControl = class(TdxRibbonQuickAccessBarControl)
private
procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
function GetStatusBar: TdxRibbonStatusBar;
protected
function CanShowPopupMenuOnMouseClick(AMousePressed: Boolean): Boolean; override;
procedure DoPaintItem(AControl: TdxBarItemControl; ACanvas: TcxCanvas; const AItemRect: TRect); override;
function GetDefaultItemGlyph: TBitmap; override;
function GetItemControlDefaultViewLevel(
AItemControl: TdxBarItemControl): TdxBarItemViewLevel; override;
function GetMinHeight(AStyle: TdxBarDockingStyle): Integer; override;
function GetRibbon: TdxCustomRibbon; override;
function GetViewInfoClass: TCustomdxBarControlViewInfoClass; override;
procedure InitCustomizationPopup(AItemLinks: TdxBarItemLinks); override;
function IsValid: Boolean;
function MarkExists: Boolean; override;
procedure UpdateDoubleBuffered; override;
property StatusBar: TdxRibbonStatusBar read GetStatusBar;
end;
{ TdxRibbonStatusBarBarControlDesignHelper }
TdxRibbonStatusBarBarControlDesignHelper = class(TCustomdxBarControlDesignHelper)
public
class function GetForbiddenActions: TdxBarCustomizationActions; override;
end;
{ TdxRibbonStatusBarDockControl }
TdxRibbonStatusBarDockControl = class(TdxCustomRibbonDockControl)
private
FStatusBar: TdxRibbonStatusBar;
FPainter: TdxBarPainter;
FPanel: TdxStatusBarPanel;
function GetBarControl: TdxRibbonStatusBarBarControl;
function GetColorScheme: TdxCustomRibbonSkin;
function GetRibbon: TdxCustomRibbon;
protected
procedure CalcLayout; override;
procedure UpdateDoubleBuffered; override;
procedure FillBackground(DC: HDC; const ADestR, ASourceR: TRect; ABrush: HBRUSH; AColor: TColor); override;
function GetDockedBarControlClass: TdxBarControlClass; override;
function GetOwner: TPersistent; override;
function GetPainter: TdxBarPainter; override;
procedure ShowCustomizePopup; override;
procedure VisibleChanged; override;
property BarControl: TdxRibbonStatusBarBarControl read GetBarControl;
public
constructor Create(AOwner: TdxStatusBarToolbarPanelStyle); reintroduce; virtual;
destructor Destroy; override;
property ColorScheme: TdxCustomRibbonSkin read GetColorScheme;
property Panel: TdxStatusBarPanel read FPanel;
property Ribbon: TdxCustomRibbon read GetRibbon;
property StatusBar: TdxRibbonStatusBar read FStatusBar;
end;
{ TdxStatusBarToolbarPanelStyle }
TdxStatusBarToolbarPanelStyle = class(TdxStatusBarPanelStyle)
private
FDockControl: TdxRibbonStatusBarDockControl;
FLoadedToolbarName: string;
FToolbar: TdxBar;
function GetToolbar: TdxBar;
procedure ReadToolbarName(AReader: TReader);
procedure SetToolbar(Value: TdxBar);
procedure UpdateToolbarValue;
procedure WriteToolbarName(AWriter: TWriter);
protected
function CanDelete: Boolean; override;
function CanSizing: Boolean; override;
procedure DefineProperties(Filer: TFiler); override;
procedure DrawContent(ACanvas: TcxCanvas; R: TRect; APainter: TdxStatusBarPainterClass); override;
function GetMinWidth: Integer; override;
class function GetVersion: Integer; override;
procedure Loaded; override;
procedure PanelVisibleChanged; override;
function FindBarManager: TdxBarManager;
procedure UpdateByRibbon(ARibbon: TdxCustomRibbon); virtual;
public
constructor Create(AOwner: TdxStatusBarPanel); override;
destructor Destroy; override;
procedure Assign(Source: TPersistent); override;
property DockControl: TdxRibbonStatusBarDockControl read FDockControl;
published
property Toolbar: TdxBar read GetToolbar write SetToolbar stored False;
end;
{ TdxRibbonStatusBarPainter }
TdxRibbonStatusBarPainter = class(TdxStatusBarPainter)
public
// calc
class function BorderSizes(AStatusBar: TdxCustomStatusBar): TRect; override;
class function GripAreaSize: TSize; override;
class function SeparatorSize: Integer; override;
// draw
class procedure DrawBorder(AStatusBar: TdxCustomStatusBar; ACanvas: TcxCanvas;
var R: TRect); override;
class procedure DrawPanelBorder(AStatusBar: TdxCustomStatusBar; ABevel: TdxStatusBarPanelBevel;
ACanvas: TcxCanvas; var R: TRect); override;
class procedure DrawPanelSeparator(AStatusBar: TdxCustomStatusBar; ACanvas: TcxCanvas;
const R: TRect); override;
class procedure DrawSizeGrip(AStatusBar: TdxCustomStatusBar; ACanvas: TcxCanvas;
R: TRect; AOverlapped: Boolean); override;
class function GetPanelBevel(APanel: TdxStatusBarPanel): TdxStatusBarPanelBevel; override;
class function TopBorderSize: Integer; override;
end;
{ TdxRibbonStatusBarViewInfo }
TdxRibbonStatusBarViewInfo = class(TdxStatusBarViewInfo)
private
function GetStatusBar: TdxRibbonStatusBar;
protected
function CanUpdateDockControls: Boolean;
procedure UpdateDockControls(const ABounds: TRect);
public
procedure Calculate(const ABounds: TRect); override;
property StatusBar: TdxRibbonStatusBar read GetStatusBar;
end;
{ TdxRibbonStatusBar }
TdxRibbonStatusBar = class(
TdxCustomStatusBar,
IdxRibbonFormStatusBarDraw)
private
FColor: TColor;
FCreating: Boolean;
FDefaultBarPainter: TdxBarPainter;
FRibbon: TdxCustomRibbon;
procedure CheckAssignRibbon;
procedure CheckRemoveToolbar(ABar: TdxBar);
procedure SetColor(const Value: TColor);
procedure SetRibbon(const Value: TdxCustomRibbon);
procedure UpdateToolbars;
procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
protected
FNeedSizeGripSeparator: Boolean;
FRisedSideStates: array[Boolean] of Boolean;
//IdxRibbonFormStatusBarDraw
function IdxRibbonFormStatusBarDraw.GetActive = FormDrawGetActive;
function IdxRibbonFormStatusBarDraw.GetHeight = FormDrawGetHeight;
function IdxRibbonFormStatusBarDraw.GetIsRaised = FormDrawGetIsRaised;
function FormDrawGetActive(AForm: TCustomForm): Boolean;
function FormDrawGetHeight: Integer;
function FormDrawGetIsRaised(ALeft: Boolean): Boolean;
procedure AdjustTextColor(var AColor: TColor; Active: Boolean); override;
procedure Calculate; override;
procedure CalculateFormSidesAndSizeGrip;
procedure CheckMinHeight;
procedure ColorSchemeChanged(Sender: TObject; const AEventArgs); virtual;
function CreateViewInfo: TdxStatusBarViewInfo; override;
function GetMinHeight: Integer; virtual;
function GetPainterClass: TdxStatusBarPainterClass; override;
function GetPaintStyle: TdxStatusBarPaintStyle; override;
function IsRibbonValid: Boolean;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure PaintStyleChanged; override;
procedure SetParent(AParent: TWinControl); override;
procedure VisibleChanged; override;
procedure UpdatePanels; override;
property DefaultBarPainter: TdxBarPainter read FDefaultBarPainter;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function CanAcceptPanelStyle(Value: TdxStatusBarPanelStyleClass): Boolean; override;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
published
property Images;
property Panels;
property Ribbon: TdxCustomRibbon read FRibbon write SetRibbon;
property SizeGrip;
property LookAndFeel;
property OnHint;
property BorderWidth;
{ TcxControl properties}
property Anchors;
property BiDiMode;
property Color: TColor read FColor write SetColor default clDefault;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property Font;
property Constraints;
property ShowHint;
property ParentBiDiMode;
property ParentFont default False;
property ParentShowHint;
property PopupMenu;
property Visible;
{$IFDEF DELPHI5}
property OnContextPopup;
{$ENDIF}
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDock;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnResize;
property OnStartDock;
property OnStartDrag;
end;
implementation
uses
dxThemeConsts, dxUxTheme, dxOffice11, ActnList, StdActns, cxGeometry, Math,
dxBarStrs, cxDWMApi, dxBarSkinConsts;
resourcestring
cxSToolbarPanelStyle = 'Toolbar Panel';
const
GRIP_AREA_SIZE = 19;
GRIP_SIZE = 12;
{ TdxRibbonStatusBarBarControlPainter }
function TdxRibbonStatusBarBarControlPainter.BarBeginGroupSize: Integer;
begin
Result := 2;
end;
procedure TdxRibbonStatusBarBarControlPainter.BarDrawBeginGroup(
ABarControl: TCustomdxBarControl; DC: HDC; ABeginGroupRect: TRect;
AToolbarBrush: HBRUSH; AHorz: Boolean);
var
AColorScheme: TdxCustomRibbonSkin;
begin
AColorScheme := TdxRibbonStatusBarDockControl(TdxBarControl(ABarControl).DockControl).ColorScheme;
if AColorScheme <> nil then
begin
Dec(ABeginGroupRect.Top, GetToolbarContentOffsets(nil, dsTop, False).Top);
AColorScheme.DrawStatusBarToolbarSeparator(DC, ABeginGroupRect);
end;
end;
procedure TdxRibbonStatusBarBarControlPainter.DrawToolbarContentPart(
ABarControl: TdxBarControl; ACanvas: TcxCanvas);
var
AColorScheme: TdxCustomRibbonSkin;
ADockControl: TdxRibbonStatusBarDockControl;
R, AOffs: TRect;
begin
ADockControl := TdxRibbonStatusBarDockControl(ABarControl.DockControl);
R := ABarControl.ClientRect;
AOffs := GetToolbarContentOffsets(ABarControl.Bar, dsTop, False);
Dec(R.Top, AOffs.Top);
R.Bottom := R.Top + ADockControl.StatusBar.Height;
AColorScheme := ADockControl.ColorScheme;
if AColorScheme <> nil then
AColorScheme.DrawStatusBarPanel(ACanvas.Handle,
cxRectOffset(R, ADockControl.Left, ADockControl.Top), R,
ADockControl.Panel.Bevel <> dxpbRaised)
end;
procedure TdxRibbonStatusBarBarControlPainter.DrawToolbarNonContentPart(
ABarControl: TdxBarControl; DC: HDC);
var
AColorScheme: TdxCustomRibbonSkin;
ADockControl: TdxRibbonStatusBarDockControl;
ASaveIndex: Integer;
R: TRect;
begin
ASaveIndex := SaveDC(DC);
with ABarControl.ClientBounds do
ExcludeClipRect(DC, Left, Top, Right, Bottom);
ADockControl := TdxRibbonStatusBarDockControl(ABarControl.DockControl);
R := cxRectBounds(0, 0, ABarControl.Width, ADockControl.StatusBar.Height);
AColorScheme := ADockControl.ColorScheme;
if AColorScheme <> nil then
AColorScheme.DrawStatusBarPanel(DC,
cxRectOffset(R, ADockControl.Left, ADockControl.Top), R,
ADockControl.Panel.Bevel <> dxpbRaised);
RestoreDC(DC, ASaveIndex);
end;
function TdxRibbonStatusBarBarControlPainter.GetButtonBorderHeight: Integer;
begin
Result := 4;
if IsCompositionEnabled then
Dec(Result, 2);
end;
procedure TdxRibbonStatusBarBarControlPainter.GetDisabledTextColors(
ABarItemControl: TdxBarItemControl; ASelected, AFlat: Boolean; var AColor1,
AColor2: TColor);
var
ADockControl: TdxRibbonStatusBarDockControl;
begin
ADockControl := TdxRibbonStatusBarDockControl(TdxBarControl(ABarItemControl.Parent).DockControl);
if (ADockControl <> nil) and (ADockControl.ColorScheme <> nil) then
begin
AColor1 := ADockControl.ColorScheme.GetPartColor(rspStatusBarText, DXBAR_DISABLED);
AColor2 := AColor1;
end
else
inherited;
end;
function TdxRibbonStatusBarBarControlPainter.GetEnabledTextColor(
ABarItemControl: TdxBarItemControl; ASelected, AFlat: Boolean): TColor;
const
States: array[Boolean] of Integer = (DXBAR_NORMAL, DXBAR_HOT);
var
ADockControl: TdxRibbonStatusBarDockControl;
begin
ADockControl := TdxRibbonStatusBarDockControl(TdxBarControl(ABarItemControl.Parent).DockControl);
if (ADockControl <> nil) and (ADockControl.ColorScheme <> nil) then
Result := ADockControl.ColorScheme.GetPartColor(rspStatusBarText, States[ASelected])
else
Result := inherited GetEnabledTextColor(ABarItemControl, ASelected, AFlat);
end;
function TdxRibbonStatusBarBarControlPainter.GetToolbarContentOffsets(
ABar: TdxBar; ADockingStyle: TdxBarDockingStyle;
AHasSizeGrip: Boolean): TRect;
begin
Result := cxRect(2, 2, 2, 1);
end;
function TdxRibbonStatusBarBarControlPainter.MarkButtonOffset: Integer;
begin
Result := 0;
end;
function TdxRibbonStatusBarBarControlPainter.MarkSizeX(ABarControl: TdxBarControl): Integer;
begin
Result := 0;
end;
function TdxRibbonStatusBarBarControlPainter.GetColorScheme(
ABarControl: TCustomdxBarControl): TdxCustomRibbonSkin;
var
ADockControl: TdxRibbonStatusBarDockControl;
begin
ADockControl := TdxRibbonStatusBarDockControl(TdxBarControl(ABarControl).DockControl);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -