Delphi 自制Office风格按键

复制代码
unit MyOfficeButton;

interface

uses
  SysUtils, Classes, Controls,Ribbon,RibbonActnCtrls,RibbonStyleActnCtrls,forms,Windows,Math,
    Dialogs,Graphics,ActnMan,ActnMenus,Messages;
type
  TMyOfficeButton = class(TOffice2007Button)
  private
    FCaptionHeight: Integer;
     FDefaultColorMap: TCustomActionBarColorMap;
      FColorMap: TCustomActionBarColorMap;
    FActionManager: TCustomActionManager;
    FActive: Boolean;
    procedure SetColorMap(const Value: TCustomActionBarColorMap);
    function GetColorMap: TCustomActionBarColorMap;
    function SetupDefaultColorMap: TCustomActionBarColorMap;
    procedure SetActionManager(const Value: TCustomActionManager);
    procedure SetActive(const Value: Boolean);


    { Private declarations }
        type
      TSystemMenuButton = (smbNone, smbMinimize, smbRestore, smbHelp, smbClose);
  protected
    { Protected declarations }
      FSystemMenuButton : TSystemMenuButton;
    procedure DrawBackground; override;
    procedure DrawCaption; virtual;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); reintroduce;
    property ColorMap: TCustomActionBarColorMap read GetColorMap write SetColorMap;
     property ActionManager: TCustomActionManager read FActionManager write SetActionManager;
    property Active: Boolean read FActive write SetActive default true;
  published
    { Published declarations }
    procedure DoClick;
    property OnClick ;
    property font;
    property Caption;
            // Font used to draw the Ribbon Caption

  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TMyOfficeButton]);
end;

{ TMyOfficeButton }

constructor TMyOfficeButton.Create(AOwner: TComponent);
begin
 inherited

  Create(AOwner);
   Active:=true;
  SetDesignVisible(False);

end;

procedure TMyOfficeButton.DoClick;
begin
  inherited;
end;

procedure TMyOfficeButton.DrawBackground;
begin
  inherited;
 if MouseInControl then
  begin
    if IsLeftMouseButtonPressed(Self) then
     //RibbonStyle.DrawElement(sfButtonPressed, Canvas, ClientRect, -1)
    else
      //RibbonStyle.DrawElement(sfButtonHover, Canvas, ClientRect,-1);
  end
  else
  RibbonStyle.DrawElement(sfButtonPressed, Canvas, ClientRect, -1);

  DrawCaption;
end;



procedure TMyOfficeButton.DrawCaption;
const
  TextFlags: Cardinal = DT_LEFT or DT_VCENTER or DT_SINGLELINE or DT_NOPREFIX;
  CaptionFmt: array [Boolean] of string = ('%s', ' - %s');

  procedure CalcWidth(var CaptionWidth: Integer); overload;   //计算字符串宽度
  var
    LCalcRect: TRect;
  begin
    LCalcRect := Rect(0,0,0,0);
    Canvas.Font := Screen.CaptionFont;
    DrawText(Canvas.Handle,Caption,
      -1, LCalcRect, TextFlags or DT_CALCRECT);
    CaptionWidth := LCalcRect.Right;
  end;

  procedure FixRect(var Rect: TRect; TextWidth: Integer);  //重新定义定符串显示的坐标
  begin

      //Adjust Rect to find Center
      if ((ClientWidth + TextWidth) div 2 < Rect.Right) and
         ((ClientWidth - TextWidth) div 2 > Rect.Left) then
      begin
        Rect.Left := (ClientWidth - TextWidth) div 2;
      end
     // else if TextWidth <= RectWidth(Rect) then
     //   Inc(Rect.Left, (RectWidth(Rect)-TextWidth) div 2);
  end;
var
 LRect:TRect;
 LCaptionWidth:integer;
begin
     LRect := Rect(0,0, ClientWidth, ClientHeight);
     CalcWidth(LCaptionWidth) ;
      FixRect(LRect,LCaptionWidth) ;
     Canvas.Brush.Style:=bsClear;
     Canvas.Font := Screen.CaptionFont;
    // if Active then
       canvas.Font.Color :=TCustomRibbonColorMap(ColorMap).DocumentFontColor;
     //   else
      //  canvas.Font.Color :=ColorMap.DisabledFontColor;//
     DrawText(canvas.Handle,Caption,-1, LRect, DT_LEFT or TextFlags or DT_END_ELLIPSIS);
end;



procedure TMyOfficeButton.SetActionManager(const Value: TCustomActionManager);
var
  I: Integer;
begin
  if FActionManager <> Value then
  begin
    FActionManager := Value;
    if Value <> nil then
      FActionManager.FreeNotification(Value);
  end;
end;

procedure TMyOfficeButton.SetActive(const Value: Boolean);
begin
  if FActive <> Value then
  begin
    FActive := Value;
    Invalidate ;
  end;
end;

procedure TMyOfficeButton.SetColorMap(const Value: TCustomActionBarColorMap);
var
  I: Integer;
  J: Integer;
  LPage: TCustomRibbonPage;
begin
  FreeAndNil(FDefaultColorMap);
  FColorMap := Value;
  if Value <> nil then
    Value.FreeNotification(Self)
  else
    FColorMap := FDefaultColorMap;
end;

function TMyOfficeButton.GetColorMap: TCustomActionBarColorMap;
begin
  if FColorMap = nil then
  begin
    // Setup default
    SetupDefaultColorMap;
    FColorMap := FDefaultColorMap;
  end;
  Result := FColorMap;
end;

function TMyOfficeButton.SetupDefaultColorMap: TCustomActionBarColorMap;
var
  LColorMapClass: TCustomColorMapClass;
begin
  FreeAndNil(FDefaultColorMap);
  if ActionManager = nil then
    LColorMapClass := TRibbonLunaColorMap
  else
    LColorMapClass := (ActionManager.Style as TActionBarStyleEx).GetColorMapClass(nil);
  if LColorMapClass = nil then
    LColorMapClass := TRibbonLunaColorMap;
  FDefaultColorMap := LColorMapClass.Create(Self);
  FDefaultColorMap.Name := 'DefaultColorMap'; // do not localise
  FDefaultColorMap.SetSubComponent(True);
  Result := FDefaultColorMap;
end;


end.
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值