📄 dxribbonstatusbar.pas
字号:
end;
class function TdxRibbonStatusBarPainter.GripAreaSize: TSize;
begin
Result.cx := GRIP_AREA_SIZE;
Result.cy := GRIP_AREA_SIZE;
end;
class function TdxRibbonStatusBarPainter.SeparatorSize: Integer;
begin
Result := 3;
end;
class procedure TdxRibbonStatusBarPainter.DrawBorder(AStatusBar: TdxCustomStatusBar;
ACanvas: TcxCanvas; var R: TRect);
begin
if TdxRibbonStatusBar(AStatusBar).IsRibbonValid then
TdxRibbonStatusBar(AStatusBar).Ribbon.ColorScheme.DrawStatusBar(ACanvas.Handle, R)
else
begin
ACanvas.FrameRect(R, clBtnShadow);
InflateRect(R, -1, -1);
FillRectByColor(ACanvas.Handle, R, clBtnFace);
end;
end;
class procedure TdxRibbonStatusBarPainter.DrawPanelBorder(AStatusBar: TdxCustomStatusBar;
ABevel: TdxStatusBarPanelBevel; ACanvas: TcxCanvas; var R: TRect);
begin
if TdxRibbonStatusBar(AStatusBar).IsRibbonValid then
TdxRibbonStatusBar(AStatusBar).Ribbon.ColorScheme.DrawStatusBarPanel(
ACanvas.Handle, R, R, ABevel <> dxpbRaised)
else
inherited;
end;
class procedure TdxRibbonStatusBarPainter.DrawPanelSeparator(AStatusBar: TdxCustomStatusBar;
ACanvas: TcxCanvas; const R: TRect);
begin
if TdxRibbonStatusBar(AStatusBar).IsRibbonValid then
TdxRibbonStatusBar(AStatusBar).Ribbon.ColorScheme.DrawStatusBarPanelSeparator(ACanvas.Handle, R)
else
FillRectByColor(ACanvas.Handle, R, clBtnShadow);
end;
class procedure TdxRibbonStatusBarPainter.DrawSizeGrip(AStatusBar: TdxCustomStatusBar;
ACanvas: TcxCanvas; R: TRect; AOverlapped: Boolean);
var
ARect, AGripRect: TRect;
ARibbonStatusBar: TdxRibbonStatusBar;
begin
ARibbonStatusBar := TdxRibbonStatusBar(AStatusBar);
if ARibbonStatusBar.IsRibbonValid then
begin
ARect := Rect(R.Right - GripAreaSize.cx, R.Top, R.Right, R.Bottom);
ARibbonStatusBar.Ribbon.ColorScheme.DrawStatusBarGripBackground(ACanvas.Handle, ARect);
AGripRect := cxRectInflate(ARect, 0, 0, 1, -3);
if AOverlapped then Inc(AGripRect.Right, 1);
ARibbonStatusBar.Ribbon.ColorScheme.DrawStatusBarSizeGrip(ACanvas.Handle, AGripRect);
if not ARibbonStatusBar.FNeedSizeGripSeparator then
Dec(ARect.Left, -3);
ACanvas.ExcludeClipRect(ARect);
end
else
begin
InflateRect(R, -1, -1);
ARect := Rect(R.Right - GripAreaSize.cx, R.Bottom - GripAreaSize.cy, R.Right, R.Bottom);
AGripRect := ARect;
if AOverlapped then Inc(AGripRect.Right, 1);
ACanvas.Brush.Color := clBtnFace;
ACanvas.FillRect(AGripRect);
BarDrawSizeGrip(ACanvas.Handle, ARect);
ACanvas.ExcludeClipRect(AGripRect);
end;
end;
class function TdxRibbonStatusBarPainter.GetPanelBevel(
APanel: TdxStatusBarPanel): TdxStatusBarPanelBevel;
begin
if APanel <> nil then
Result := APanel.Bevel
else
Result := dxpbNone;
end;
class function TdxRibbonStatusBarPainter.TopBorderSize: Integer;
begin
Result := 0;
end;
{ TdxRibbonStatusBarViewInfo }
procedure TdxRibbonStatusBarViewInfo.Calculate(const ABounds: TRect);
begin
inherited Calculate(ABounds);
UpdateDockControls(ABounds);
end;
function TdxRibbonStatusBarViewInfo.CanUpdateDockControls: Boolean;
var
F: TCustomForm;
begin
F := TCustomForm(StatusBar.Owner);
Result := (F <> nil) and not ((F.WindowState = wsMaximized) and (fsCreating in F.FormState));
end;
procedure TdxRibbonStatusBarViewInfo.UpdateDockControls(const ABounds: TRect);
var
ARect, R: TRect;
I, J, ACount: Integer;
begin
if not CanUpdateDockControls then Exit;
ACount := PanelCount;
J := 0;
ARect := ABounds;
for I := 0 to ACount - 1 do
begin
// Panel
ARect.Right := ARect.Left + Widths[J];
if Panels[I].PanelStyle is TdxStatusBarToolbarPanelStyle then
with TdxStatusBarToolbarPanelStyle(Panels[I].PanelStyle) do
begin
R := ARect;
if StatusBar.IsRibbonValid then
R.Bottom := R.Top + DockControl.Height
else
InflateRect(R, 0, -1);
if StatusBar.SizeGripAllocated then
R.Right := Max(2, Min(R.Right, ABounds.Right - GRIP_AREA_SIZE));
DockControl.BoundsRect := R;
end;
Inc(J);
// Separator
if I < (ACount - 1) then
begin
ARect.Left := ARect.Right;
ARect.Right := ARect.Left + Widths[J];
Inc(J);
end;
ARect.Left := ARect.Right;
end;
end;
function TdxRibbonStatusBarViewInfo.GetStatusBar: TdxRibbonStatusBar;
begin
Result := TdxRibbonStatusBar(inherited StatusBar);
end;
{ TdxRibbonStatusBar }
constructor TdxRibbonStatusBar.Create(AOwner: TComponent);
begin
FCreating := True;
RibbonCheckCreateComponent(AOwner, ClassType);
FCreating := False;
inherited Create(AOwner);
FDefaultBarPainter := TdxDefaultRibbonStatusBarBarControlPainter.Create(0);
Font.Color := clDefault;
Color := clDefault;
Height := 23;
CheckAssignRibbon;
end;
destructor TdxRibbonStatusBar.Destroy;
begin
if FCreating then Exit;
if IsRibbonValid then
Ribbon.ColorSchemeHandlers.Remove(ColorSchemeChanged);
FreeAndNil(FDefaultBarPainter);
inherited Destroy;
end;
function TdxRibbonStatusBar.CanAcceptPanelStyle(Value: TdxStatusBarPanelStyleClass): Boolean;
begin
Result := True;
end;
procedure TdxRibbonStatusBar.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
inherited SetBounds(ALeft, ATop, AWidth, Max(AHeight, GetMinHeight));
Recalculate;
end;
function TdxRibbonStatusBar.FormDrawGetActive(AForm: TCustomForm): Boolean;
begin
Result := Visible and (Owner = AForm);
end;
function TdxRibbonStatusBar.FormDrawGetHeight: Integer;
begin
Result := Height;
end;
function TdxRibbonStatusBar.FormDrawGetIsRaised(ALeft: Boolean): Boolean;
begin
Result := FRisedSideStates[ALeft];
end;
procedure TdxRibbonStatusBar.AdjustTextColor(var AColor: TColor; Active: Boolean);
begin
if IsRibbonValid then
AColor := Ribbon.ColorScheme.GetPartColor(rspStatusBarText, Ord(not Active))
else
AColor := Font.Color;
end;
procedure TdxRibbonStatusBar.Calculate;
begin
inherited Calculate;
CalculateFormSidesAndSizeGrip;
end;
procedure TdxRibbonStatusBar.CalculateFormSidesAndSizeGrip;
var
I: Integer;
begin
FNeedSizeGripSeparator := Panels.Count = 0;
FRisedSideStates[True] := False;
for I := 0 to Panels.Count - 1 do
with Panels[I] do
if Visible then
begin
FRisedSideStates[True] := Bevel = dxpbRaised;
Break;
end;
FRisedSideStates[False] := SizeGripAllocated;
for I := Panels.Count - 1 downto 0 do
with Panels[I] do
if Visible then
begin
FNeedSizeGripSeparator := Bevel <> dxpbRaised;
Break;
end;
end;
procedure TdxRibbonStatusBar.CheckMinHeight;
begin
SetBounds(Left, Top, Width, Height);
end;
procedure TdxRibbonStatusBar.ColorSchemeChanged(Sender: TObject; const AEventArgs);
begin
PaintStyleChanged;
end;
function TdxRibbonStatusBar.CreateViewInfo: TdxStatusBarViewInfo;
begin
Result := TdxRibbonStatusBarViewInfo.Create(Self);
end;
function TdxRibbonStatusBar.GetMinHeight: Integer;
var
I, H: Integer;
ABarControl: TdxRibbonStatusBarBarControl;
begin
Result := 0;
if HandleAllocated and (([csDestroying, csLoading] * ComponentState) = []) then
begin
for I := 0 to Panels.Count - 1 do
if Panels[I].PanelStyle is TdxStatusBarToolbarPanelStyle then
begin
ABarControl := TdxStatusBarToolbarPanelStyle(Panels[I].PanelStyle).DockControl.BarControl;
if (ABarControl <> nil) and ABarControl.IsValid then
begin
with ABarControl.Painter.GetToolbarContentOffsets(ABarControl.Bar, dsNone, False) do
H := Top + Bottom;
Inc(H, ABarControl.GetSize(Panels[I].Width).cy);
Result := Max(Result, H);
end;
end;
end;
end;
function TdxRibbonStatusBar.GetPainterClass: TdxStatusBarPainterClass;
begin
Result := TdxRibbonStatusBarPainter
end;
function TdxRibbonStatusBar.GetPaintStyle: TdxStatusBarPaintStyle;
begin
Result := stpsOffice11;
end;
function TdxRibbonStatusBar.IsRibbonValid: Boolean;
begin
Result := (Ribbon <> nil) and not Ribbon.IsDestroying;
end;
procedure TdxRibbonStatusBar.Notification(AComponent: TComponent;
Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if Operation = opRemove then
begin
if AComponent = Ribbon then
Ribbon := nil
else
if AComponent is TdxBar then
CheckRemoveToolbar(TdxBar(AComponent));
end;
end;
procedure TdxRibbonStatusBar.PaintStyleChanged;
begin
if IsRibbonValid and (Color = clDefault) then
inherited Color := Ribbon.ColorScheme.GetPartColor(rfspRibbonForm);
inherited PaintStyleChanged;
end;
procedure TdxRibbonStatusBar.SetParent(AParent: TWinControl);
begin
if Assigned(AParent) then
begin
AParent := GetParentForm(AParent{$IFDEF DELPHI9}, not (csDesigning in ComponentState){$ENDIF});
if Assigned(AParent) and not (AParent is TCustomForm) then
raise Exception.CreateFmt(cxGetResourceString(@dxSBAR_RIBBONBADPARENT), [ClassName]);
end;
inherited SetParent(AParent);
Top := 32000;
end;
procedure TdxRibbonStatusBar.VisibleChanged;
var
AForm: TCustomForm;
begin
inherited VisibleChanged;
if IsRibbonValid then
begin
AForm := TCustomForm(Owner);
if (AForm <> nil) and AForm.HandleAllocated and AForm.Visible then
SetWindowPos(AForm.Handle, 0, 0, 0, AForm.Width, AForm.Height, SWP_NOZORDER or SWP_NOACTIVATE or
SWP_NOMOVE or SWP_FRAMECHANGED);
end;
end;
procedure TdxRibbonStatusBar.UpdatePanels;
begin
Recalculate;
UpdateToolbars;
Invalidate;
end;
procedure TdxRibbonStatusBar.CheckAssignRibbon;
var
AForm: TCustomForm;
I: Integer;
begin
if not IsDesigning then Exit;
AForm := TCustomForm(Owner);
if AForm <> nil then
begin
for I := 0 to AForm.ComponentCount - 1 do
if AForm.Components[I] is TdxCustomRibbon then
begin
Ribbon := TdxCustomRibbon(AForm.Components[I]);
Break;
end;
end;
end;
procedure TdxRibbonStatusBar.CheckRemoveToolbar(ABar: TdxBar);
var
I: Integer;
APanelStyle: TdxStatusBarToolbarPanelStyle;
begin
//if csDestroying in ComponentState then Exit;
for I := 0 to Panels.Count - 1 do
if Panels[I].PanelStyle is TdxStatusBarToolbarPanelStyle then
begin
APanelStyle := TdxStatusBarToolbarPanelStyle(Panels[I].PanelStyle);
if APanelStyle.Toolbar = ABar then
APanelStyle.Toolbar := nil;
end;
end;
procedure TdxRibbonStatusBar.SetColor(const Value: TColor);
begin
if FColor <> Value then
begin
FColor := Value;
if Value <> clDefault then
inherited Color := Value;
PaintStyleChanged;
end;
end;
procedure TdxRibbonStatusBar.SetRibbon(const Value: TdxCustomRibbon);
var
AIntf: IdxRibbonFormNonClientDraw;
begin
if FRibbon <> Value then
begin
if (FRibbon <> nil) and not FRibbon.IsDestroying then
begin
FRibbon.RemoveFreeNotification(Self);
FRibbon.ColorSchemeHandlers.Remove(ColorSchemeChanged);
if Supports(TObject(FRibbon), IdxRibbonFormNonClientDraw, AIntf) then
AIntf.Remove(Self);
end;
FRibbon := Value;
if FRibbon <> nil then
begin
FRibbon.FreeNotification(Self);
FRibbon.ColorSchemeHandlers.Add(ColorSchemeChanged);
if Supports(TObject(FRibbon), IdxRibbonFormNonClientDraw, AIntf) then
AIntf.Add(Self);
end;
CheckMinHeight;
PaintStyleChanged;
end;
end;
procedure TdxRibbonStatusBar.UpdateToolbars;
var
I: Integer;
begin
if HandleAllocated and (([csDestroying] * ComponentState) = []) then
begin
for I := 0 to Panels.Count - 1 do
if Panels[I].PanelStyle is TdxStatusBarToolbarPanelStyle then
TdxStatusBarToolbarPanelStyle(Panels[I].PanelStyle).UpdateByRibbon(Ribbon);
end;
end;
procedure TdxRibbonStatusBar.WMWindowPosChanged(var Message: TWMWindowPosChanged);
begin
inherited;
if (Message.WindowPos <> nil) and (Message.WindowPos.flags and SWP_NOSIZE <> 0) then
UpdateToolbars;
end;
initialization
RegisterClasses([TdxRibbonStatusBar, TdxStatusBarContainerControl]);
GetRegisteredStatusBarPanelStyles.Register(TdxStatusBarToolbarPanelStyle, cxSToolbarPanelStyle);
BarDesignController.RegisterBarControlDesignHelper(
TdxRibbonStatusBarBarControl, TdxRibbonStatusBarBarControlDesignHelper);
finalization
BarDesignController.UnregisterBarControlDesignHelper(
TdxRibbonStatusBarBarControl, TdxRibbonStatusBarBarControlDesignHelper);
GetRegisteredStatusBarPanelStyles.Unregister(TdxStatusBarToolbarPanelStyle);
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -