⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dxribbonstatusbar.pas

📁 胜天进销存源码,国产优秀的进销存
💻 PAS
📖 第 1 页 / 共 3 页
字号:
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 + -