Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

cgm2k7

nspeedButton[d7]

Recommended Posts

Olá pessoal:
Andei procurando muito na net um speedbutton que tivesse a opção ImgList não achei
resolvi criar um.
Adicionei várias outras novidades:
Opção GrayScale - > para o botão fica com a cor cinsa quando desabilitado ou com transparente com a opção Opacity.
Opções GlyphOver e GlyphDown e também com ImgList.

Suporta: Bitmap 32 Bits, mas se estiver instalado o Component TPNGGraphics no seu delphi vai aceitar png também.
Estou postando para quem estiver precisando:

Previa:
Sem_t_tulo.jpg

https://youtu.be/iiKtrm2zN0w


download Install dpk nSpeedButton
http://www.mediafire.com/download/oqm3pea1ouy29af/Button2.rar
http://www.4shared.com/rar/Fz1C6wTbba/Button2.html

se quiser o TPNGGraphics:
http://www.mediafire.com/download/ct11e5avx26m0s2/PngGraphics.rar
http://www.4shared.com/rar/-hTI0WoGce/PngGraphics.html

Se você não Gosta de instar qualquer component em seu delphi pode usar em runtime mesmo:



unit Button2;



interface

          

uses Windows, Messages, Classes, Controls, Forms, Graphics, StdCtrls,

  ExtCtrls, CommCtrl, ImgList;



type

 TnRGB = packed record

    B, G, R: Byte;

  end;

  TnRGBA = packed record

    B, G, R, A: Byte;

  end;

 TnColor = record

    case integer of

      0  : (C : TColor);

      1  : (R, G, B, A : Byte);

      2  : (I : integer);

      3  : (nsBGRA : TnRGBA);

      4  : (RGB : TnRGB; nMASK : Byte);

    end;

 TnColor_ = record

    case integer of

      0  : (C : TColor);

      1  : (B, G, R, A : Byte);

      2  : (I : integer);

      3  : (nBGRA : TnRGBA);

      4  : (BGR : TnRGB; nMASK : Byte);

    end;

  PRGBAArray = ^TRGBAArray;

  TRGBAArray = array[0..100000] of TnColor_;

    

  TButtonLayout = (blImageLeft, blImageRight, blImageTop, blImageBottom);

  TButtonState = (bsUp, bsDisabled, bsDown, bsExclusive);

  TButtonStyle = (bsAutoDetect, bsWin31, bsNew);

  TNumGlyphs = 1..4;



  TEnabledImage_e_Glyphs = (bsGrayScale, bsOpacity);

  TEnabled_IGs = set of TEnabledImage_e_Glyphs;



  TnSpeedButton = class;



  TcSpeedButtonActionLink = class(TControlActionLink)

  protected

    FClient: TnSpeedButton;

    procedure AssignClient(AClient: TObject); override;

    function IsCheckedLinked: Boolean; override;

    function IsGroupIndexLinked: Boolean; override;

    procedure SetGroupIndex(Value: Integer); override;

    procedure SetChecked(Value: Boolean); override;

  end;

 

  TnSpeedButton = class(TGraphicControl)

  private

    FOriginal     : TBitmap;

    FOriginalOver : TBitmap;

    FOriginalDown : TBitmap;

    FIndexs: array[TButtonState] of Integer;

    FTransparentColor: TColor;

    FImageList: TCustomImageList;

    FGlyphImgList : TImageList;

    FInternalImageList: TImageList;

    FImageChangeLink: TChangeLink;

    FImageIndex: TImageIndex;

    FDown: Boolean;

    FDragging: Boolean;

    FAllowAllUp: Boolean;

    FLayout: TButtonLayout;

    FSpacing: Integer;

    FTransparent: Boolean;

    FMargin: Integer;

    FFlat: Boolean;

    FMouseInControl: Boolean;

    FEOpacity: integer;

    FEnabledGrayScale: TEnabled_IGs;

    FGroupIndex: Integer;

    FOnChange: TNotifyEvent;

    FOnMouseLeave, FOnMouseEnter: TNotifyEvent;

    FOverDraw : Boolean;

    FOverIndexOver, FOverIndexNormal, FOverIndexDown: Integer;

    FImgOvSize: Boolean;

    FImgOvNoFlat: Boolean;



    function CreateButtonGlyph2(State: TButtonState): Integer;

    procedure DrawButtonGlyph(Canvas: TCanvas; const GlyphPos: TPoint;

      State: TButtonState; Transparent, SetGrayScaleAndOpacity: Boolean);

    procedure DrawButtonImgList(Canvas: TCanvas; const GlyphPos: TPoint;

      State: TButtonState; Transparent, SetGrayScaleAndOpacity: Boolean);

    procedure DrawButtonText(Canvas: TCanvas; const Caption: string;

      TextBounds: TRect; State: TButtonState; BiDiFlags: Longint);

    procedure CalcButtonLayout(Canvas: TCanvas; const Client: TRect;

      const Offset: TPoint; const Caption: string; Layout: TButtonLayout;

        Margin, Spacing: Integer; var GlyphPos: TPoint; var TextBounds: TRect;

          BiDiFlags: Longint);

    procedure GlyphChanged(Sender: TObject);

    procedure UpdateExclusive;

    procedure SetGlyph(Value: TBitmap);

    procedure SetGlyphOver(const Value: TBitmap);

    procedure SetGlyphDown(const Value: TBitmap);

    procedure SetDown(Value: Boolean);

    procedure SetFlat(Value: Boolean);

    procedure SetAllowAllUp(Value: Boolean);

    procedure SetGroupIndex(Value: Integer);

    procedure SetLayout(Value: TButtonLayout);

    procedure SetSpacing(Value: Integer);

    procedure SetTransparent(Value: Boolean);

    procedure SetMargin(Value: Integer);

    procedure UpdateTracking;

    procedure WMLButtonDblClk(var Message: TWMLButtonDown); message WM_LBUTTONDBLCLK;

    procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;

    procedure CMButtonPressed(var Message: TMessage); message CM_BUTTONPRESSED;

    procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR;

    procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;

    procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;

    procedure CMSysColorChange(var Message: TMessage); message CM_SYSCOLORCHANGE;

    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;

    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

    procedure SetEnabledGrayScale(const Value: TEnabled_IGs);

    procedure SetEnabledOpacity(const Value: integer);

    procedure SetImageIndex(const Value: TImageIndex);

    procedure SetImages(const Value: TCustomImageList);

    procedure ImageListChange(Sender: TObject);

    procedure SetOverDraw(const Value: Boolean);

    procedure SetImgOvSize(const Value: Boolean);

    procedure SetImgOvNoFlat(const Value: Boolean);

  protected

    FState: TButtonState;

    procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override;

    function GetActionLinkClass: TControlActionLinkClass; override;

    function GetPalette: HPALETTE; override;

    procedure Loaded; override;

    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;

      X, Y: Integer); override;

    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;

    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;

      X, Y: Integer); override;

    procedure Paint; override;

    property MouseInControl: Boolean read FMouseInControl;

  public

    constructor Create(AOwner: TComponent); override;

    destructor Destroy; override;

    procedure Click; override;

    procedure AlphaTransBitmap(Canvas: TCanvas; const PsW,

     PsH: Integer; const SrcBmp: TBitmap; Enabled_GScale_Opacity: Boolean);

    function Draw(Canvas: TCanvas; const Client: TRect; const Offset: TPoint;

      const Caption: string; Layout: TButtonLayout; Margin, Spacing: Integer;

       State: TButtonState; Transparent, SetGrayScaleAndOpacity: Boolean; BiDiFlags: Longint): TRect;

    property OnChange: TNotifyEvent read FOnChange write FOnChange;

  published

    property Action;

    property AllowAllUp: Boolean read FAllowAllUp write SetAllowAllUp default False;

    property Anchors;

    property BiDiMode;

    property Constraints;

    property GroupIndex: Integer read FGroupIndex write SetGroupIndex default 0;

    property Down: Boolean read FDown write SetDown default False;

    property Caption;

    property Enabled;

    property Flat: Boolean read FFlat write SetFlat default False;

    property Font;

    property Glyph: TBitmap read FOriginal write SetGlyph;

    property GlyphDown: TBitmap read FOriginalDown write SetGlyphDown;

    property GlyphOver: TBitmap read FOriginalOver write SetGlyphOver;

    property Layout: TButtonLayout read FLayout write SetLayout default blImageLeft;

    property Margin: Integer read FMargin write SetMargin default -1;

    property ParentFont;

    property ParentShowHint;

    property ParentBiDiMode;

    property PopupMenu;

    property ShowHint;

    property Spacing: Integer read FSpacing write SetSpacing default 4;

    property Transparent: Boolean read FTransparent write SetTransparent default True;

    property Visible;

    property OnClick;

    property OnDblClick;

    property OnMouseDown;

    property OnMouseMove;

    property OnMouseUp;

    property OnMouseEnter : TNotifyEvent read FOnMouseEnter write FOnMouseEnter;

    property OnMouseLeave : TNotifyEvent read FOnMouseLeave write FOnMouseLeave;

    property ImgOverDraw : Boolean read FOverDraw write SetOverDraw default false;

    property ImgOvNoFlatRec : Boolean read FImgOvNoFlat write SetImgOvNoFlat default false;

    property ImgOvIdxNormal : Integer read FOverIndexNormal write FOverIndexNormal default 0;

    property ImgOvIdxDown : Integer read FOverIndexDown write FOverIndexDown default 1;

    property ImgOvIdxOver : Integer read FOverIndexOver write FOverIndexOver default 2;

    property ImgOvSize: Boolean read FImgOvSize write SetImgOvSize default false;

    property EnabledGrayScale: TEnabled_IGs read FEnabledGrayScale write SetEnabledGrayScale default [bsGrayScale];

    property EnabledOpcValue : integer read FEOpacity write SetEnabledOpacity default 50; //50% de 100 a 1

    property ImageList: TCustomImageList read FImageList write SetImages;

    property ImageIndex: TImageIndex read FImageIndex write SetImageIndex default -1;

  end;



//procedure Register;



implementation



uses Consts, SysUtils, ActnList, Themes, Math, DateUtils, Types;



{procedure Register;

begin

  RegisterComponents('Standard', [TnSpeedButton]);

end; }



function TnSpeedButton.CreateButtonGlyph2(State: TButtonState): Integer;

var

  TmpImage: TBitmap;

  IWidth, IHeight: Integer;

  IRect, ORect: TRect;

  I: TButtonState;

begin

  Result := FIndexs[State];

  if Result <> -1 then Exit;

  if (FOriginal.Width or FOriginal.Height) = 0 then Exit;

  IWidth  := FOriginal.Width;

  IHeight := FOriginal.Height;

  TmpImage := TBitmap.Create;

  try

    TmpImage.Width   := IWidth;

    TmpImage.Height  := IHeight;

    FGlyphImgList.Width  := TmpImage.Width;

    FGlyphImgList.Height := TmpImage.Height;

    IRect := Rect(0, 0, IWidth, IHeight);

    TmpImage.Canvas.Brush.Color := clBtnFace;

    TmpImage.Palette := CopyPalette(FOriginal.Palette);

    I := State;



    ORect := Rect(Ord(I) * IWidth, 0, (Ord(I) + 1) * IWidth, IHeight);

    case State of

      bsUp, bsDown,

      bsExclusive:

      begin

        TmpImage.Canvas.CopyRect(IRect, FOriginal.Canvas, ORect);

        if FOriginal.TransparentMode = tmFixed then

          FIndexs[State] := FGlyphImgList.AddMasked(TmpImage, FTransparentColor)

        else

          FIndexs[State] := FGlyphImgList.AddMasked(TmpImage, clDefault);



        if FOriginalOver <> nil then begin

        TmpImage.Palette := CopyPalette(FOriginalOver.Palette);

        TmpImage.Canvas.CopyRect(IRect, FOriginalOver.Canvas, ORect);

        if FOriginalOver.TransparentMode = tmFixed then

          FIndexs[State] := FGlyphImgList.AddMasked(TmpImage, FTransparentColor)

        else

          FIndexs[State] := FGlyphImgList.AddMasked(TmpImage, clDefault);

        end;



        if FOriginalDown <> nil then begin

        TmpImage.Palette := CopyPalette(FOriginalDown.Palette);

        TmpImage.Canvas.CopyRect(IRect, FOriginalDown.Canvas, ORect);

        if FOriginalDown.TransparentMode = tmFixed then

          FIndexs[State] := FGlyphImgList.AddMasked(TmpImage, FTransparentColor)

        else

          FIndexs[State] := FGlyphImgList.AddMasked(TmpImage, clDefault);

        end;

      end;

      bsDisabled:

      begin

        BitBlt(TmpImage.Canvas.Handle, 0, 0, IWidth, IHeight, FOriginal.Canvas.Handle, 0, 0, SRCCOPY);

        FIndexs[State] := FGlyphImgList.AddMasked(TmpImage, clDefault);

      end;

    end;

  finally

    TmpImage.Free;

  end;

  Result := FIndexs[State];

  FOriginal.Dormant;

  FOriginalOver.Dormant;

  FOriginalDown.Dormant;

end;



procedure TnSpeedButton.DrawButtonGlyph(Canvas: TCanvas; const GlyphPos: TPoint;

  State: TButtonState; Transparent, SetGrayScaleAndOpacity: Boolean);

var

 R: TRect;

 bmp : TBitmap;

 MakeColor : TColor;



  procedure PreparingBitmap(IndexToInsert: Integer; ImageListToInsert: TCustomImageList);

  begin

    Bmp.Width  := ImageListToInsert.Width;

    Bmp.Height := ImageListToInsert.Height;

    Bmp.PixelFormat := pf32bit;

    if ImageListToInsert.BkColor <> clNone then

      MakeColor := ImageListToInsert.BkColor

    else

      MakeColor := clFuchsia;

    Bmp.Canvas.Brush.Color := MakeColor;

    Bmp.Canvas.FillRect(Rect(0, 0, Bmp.Width, Bmp.Height));

    ImageListToInsert.GetBitmap(IndexToInsert, Bmp);

  end;



begin

  if FOriginal = nil then Exit;

  if (FOriginal.Width = 0) or (FOriginal.Height = 0) and

    ((FGlyphImgList = nil) and ((FOverIndexNormal < 0) or (FOverIndexOver < 0) or (FOverIndexDown < 0)) and

    ((FOverIndexNormal > FGlyphImgList.Count) or (FOverIndexOver > FGlyphImgList.Count) and (FOverIndexDown > FGlyphImgList.Count))) then Exit;



  CreateButtonGlyph2(State);

  bmp := TBitmap.Create;

  if FOverDraw then

  begin

    if (FState = bsDown) or (Down) then

      PreparingBitmap(FOverIndexDown, FGlyphImgList)

    else

    if MouseInControl then

      PreparingBitmap(FOverIndexOver, FGlyphImgList)

    else



     PreparingBitmap(FOverIndexNormal, FGlyphImgList)

  end else



  PreparingBitmap(FOverIndexNormal, FGlyphImgList);

  with GlyphPos do

  begin

    if ThemeServices.ThemesEnabled then

    begin

      R.TopLeft := GlyphPos;

      R.Right := R.Left + bmp.Width;

      R.Bottom := R.Top + bmp.Height;



      AlphaTransBitmap(Canvas, r.Left, r.Top, Bmp, SetGrayScaleAndOpacity);

    end else

     if Transparent or (State = bsExclusive) then

      begin

       // ImageList_DrawEx(FGlyphImgList.Handle, FOverIndexNormal, Canvas.Handle, X, Y, 0, 0,

       //   clNone, clNone, ILD_Transparent);



      AlphaTransBitmap(Canvas, GlyphPos.X, GlyphPos.Y, Bmp, SetGrayScaleAndOpacity);

      end else begin

      //  ImageList_DrawEx(FGlyphImgList.Handle, FOverIndexNormal, Canvas.Handle, X, Y, 0, 0,

      //    ColorToRGB(clBtnFace), clNone, ILD_Normal);



      AlphaTransBitmap(Canvas, GlyphPos.X, GlyphPos.Y, Bmp, SetGrayScaleAndOpacity);

    end;

    FreeAndNil(bmp);

  end;

end;



procedure TnSpeedButton.DrawButtonText(Canvas: TCanvas; const Caption: string;

  TextBounds: TRect; State: TButtonState; BiDiFlags: LongInt);

begin

  with Canvas do

  begin

    Brush.Style := bsClear;

    if State = bsDisabled then

    begin

      OffsetRect(TextBounds, 1, 1);

      Font.Color := clBtnHighlight;

      DrawText(Handle, PChar(Caption), Length(Caption), TextBounds,

        DT_CENTER or DT_VCENTER or BiDiFlags);

      OffsetRect(TextBounds, -1, -1);

      Font.Color := clGrayText;

      DrawText(Handle, PChar(Caption), Length(Caption), TextBounds,

        DT_CENTER or DT_VCENTER or BiDiFlags);

    end else

      DrawText(Handle, PChar(Caption), Length(Caption), TextBounds, DT_CENTER or DT_VCENTER or BiDiFlags);

  end;

end;

    

procedure TnSpeedButton.CalcButtonLayout(Canvas: TCanvas; const Client: TRect;

  const Offset: TPoint; const Caption: string; Layout: TButtonLayout; Margin,

  Spacing: Integer; var GlyphPos: TPoint; var TextBounds: TRect;

  BiDiFlags: LongInt);

var

  TextPos: TPoint;

  ClientSize, GlyphSize, TextSize: TPoint;

  TotalSize: TPoint;

begin

  if (BiDiFlags and DT_RIGHT) = DT_RIGHT then

    if Layout = blImageLeft then Layout := blImageRight

    else

      if Layout = blImageRight then Layout := blImageLeft;

  { calculate the item sizes }

  ClientSize := Point(Client.Right - Client.Left, Client.Bottom - Client.Top);

    

  if FOriginal <> nil then

    GlyphSize := Point(FOriginal.Width, FOriginal.Height) else

    GlyphSize := Point(0, 0);

    

  if Length(Caption) > 0 then

  begin

    TextBounds := Rect(0, 0, Client.Right - Client.Left, 0);

    DrawText(Canvas.Handle, PChar(Caption), Length(Caption), TextBounds,

      DT_CALCRECT or BiDiFlags);

    TextSize := Point(TextBounds.Right - TextBounds.Left, TextBounds.Bottom -

      TextBounds.Top);

  end

  else

  begin

    TextBounds := Rect(0, 0, 0, 0);

    TextSize := Point(0,0);

  end;

    

  { If the layout has the glyph on the right or the left, then both the

    text and the glyph are centered vertically.  If the glyph is on the top

    or the bottom, then both the text and the glyph are centered horizontally.}

  if Layout in [blImageLeft, blImageRight] then

  begin

    GlyphPos.Y := (ClientSize.Y - GlyphSize.Y + 1) div 2;

    TextPos.Y := (ClientSize.Y - TextSize.Y + 1) div 2;

  end

  else

  begin

    GlyphPos.X := (ClientSize.X - GlyphSize.X + 1) div 2;

    TextPos.X := (ClientSize.X - TextSize.X + 1) div 2;

  end;

    

  { if there is no text or no bitmap, then Spacing is irrelevant }

  if (TextSize.X = 0) or (GlyphSize.X = 0) then

    Spacing := 0;

    

  { adjust Margin and Spacing }

  if Margin = -1 then

  begin

    if Spacing = -1 then

    begin

      TotalSize := Point(GlyphSize.X + TextSize.X, GlyphSize.Y + TextSize.Y);

      if Layout in [blImageLeft, blImageRight] then

        Margin := (ClientSize.X - TotalSize.X) div 3

      else

        Margin := (ClientSize.Y - TotalSize.Y) div 3;

      Spacing := Margin;

    end

    else

    begin

      TotalSize := Point(GlyphSize.X + Spacing + TextSize.X, GlyphSize.Y +

        Spacing + TextSize.Y);

      if Layout in [blImageLeft, blImageRight] then

        Margin := (ClientSize.X - TotalSize.X + 1) div 2

      else

        Margin := (ClientSize.Y - TotalSize.Y + 1) div 2;

    end;

  end

  else

  begin

    if Spacing = -1 then

    begin

      TotalSize := Point(ClientSize.X - (Margin + GlyphSize.X), ClientSize.Y -

        (Margin + GlyphSize.Y));

      if Layout in [blImageLeft, blImageRight] then

        Spacing := (TotalSize.X - TextSize.X) div 2

      else

        Spacing := (TotalSize.Y - TextSize.Y) div 2;

    end;

  end;

    

  case Layout of

    blImageLeft:

      begin

        GlyphPos.X := Margin;

        TextPos.X := GlyphPos.X + GlyphSize.X + Spacing;

      end;

    blImageRight:

      begin

        GlyphPos.X := ClientSize.X - Margin - GlyphSize.X;

        TextPos.X := GlyphPos.X - Spacing - TextSize.X;

      end;

    blImageTop:

      begin

        GlyphPos.Y := Margin;

        TextPos.Y := GlyphPos.Y + GlyphSize.Y + Spacing;

      end;

    blImageBottom:

      begin

        GlyphPos.Y := ClientSize.Y - Margin - GlyphSize.Y;

        TextPos.Y := GlyphPos.Y - Spacing - TextSize.Y;

      end;

  end;

    

  { fixup the result variables }

  with GlyphPos do

  begin

    Inc(X, Client.Left + Offset.X);

    Inc(Y, Client.Top + Offset.Y);

  end;



  { Themed text is not shifted, but gets a different color. }

  if ThemeServices.ThemesEnabled then

    OffsetRect(TextBounds, TextPos.X + Client.Left, TextPos.Y + Client.Top)

  else

    OffsetRect(TextBounds, TextPos.X + Client.Left + Offset.X, TextPos.Y + Client.Top + Offset.Y);



end;

    

function TnSpeedButton.Draw(Canvas: TCanvas; const Client: TRect;

  const Offset: TPoint; const Caption: string; Layout: TButtonLayout;

  Margin, Spacing: Integer; State: TButtonState; Transparent, SetGrayScaleAndOpacity: Boolean;

  BiDiFlags: LongInt): TRect;

var

  GlyphPos: TPoint;

begin

  CalcButtonLayout(Canvas, Client, Offset, Caption, Layout, Margin, Spacing, GlyphPos, Result, BiDiFlags);

  if ((FImageList <> nil) and (FImageIndex >= 0) and (FImageIndex < FImageList.Count)) then

    DrawButtonImgList(Canvas, GlyphPos, State, Transparent, SetGrayScaleAndOpacity)

  else  

  DrawButtonGlyph(Canvas, GlyphPos, State, Transparent, SetGrayScaleAndOpacity);

  DrawButtonText(Canvas, Caption, Result, State, BiDiFlags);

end;



{ TcSpeedButtonActionLink }



procedure TcSpeedButtonActionLink.AssignClient(AClient: TObject);

begin

  inherited AssignClient(AClient);

  FClient := AClient as TnSpeedButton;

end;



function TcSpeedButtonActionLink.IsCheckedLinked: Boolean;

begin

  Result := inherited IsCheckedLinked and (FClient.GroupIndex <> 0) and

    FClient.AllowAllUp and (FClient.Down = (Action as TCustomAction).Checked);

end;



function TcSpeedButtonActionLink.IsGroupIndexLinked: Boolean;

begin

  Result := (FClient is TnSpeedButton) and

    (TnSpeedButton(FClient).GroupIndex = (Action as TCustomAction).GroupIndex);

end;



procedure TcSpeedButtonActionLink.SetChecked(Value: Boolean);

begin

  if IsCheckedLinked then TnSpeedButton(FClient).Down := Value;

end;



procedure TcSpeedButtonActionLink.SetGroupIndex(Value: Integer);

begin

  if IsGroupIndexLinked then TnSpeedButton(FClient).GroupIndex := Value;

end;



{ TnSpeedButton }

    

constructor TnSpeedButton.Create(AOwner: TComponent);

var

  I: TButtonState;

begin

FGlyphImgList := TImageList.Create(Self);

FOriginalOver := TBitmap.Create;

FOriginalDown := TBitmap.Create;



  FOriginal := TBitmap.Create;

  FOriginal.OnChange := GlyphChanged;

  FTransparentColor := clOlive;

  for I := Low(I) to High(I) do

    FIndexs[I] := -1;



  inherited Create(AOwner);

  SetBounds(0, 0, 76, 26);

  ControlStyle := [csCaptureMouse, csDoubleClicks];

  ParentFont := True;

  Color := clBtnFace;

  FSpacing := 4;

  FMargin := -1;

  FLayout := blImageLeft;

  FTransparent := True;



  FEnabledGrayScale := [bsGrayScale];

  FEOpacity := 50; //50% de 100 a 1

  FImageChangeLink := TChangeLink.Create;

  FImageChangeLink.OnChange := ImageListChange;

  FImageIndex := -1;

  FOverDraw := false;

  FOverIndexNormal := 0;

  FOverIndexDown   := 1;

  FOverIndexOver   := 2;

  FImgOvSize := false;

end;

    

destructor TnSpeedButton.Destroy;

begin

FGlyphImgList.Clear;

FreeAndNil(FGlyphImgList);

FOriginalOver.Free;

FOriginalDown.Free;

  FOriginal.Free;

  FreeAndNil(FImageChangeLink);

  if Assigned(FInternalImageList) then

    FreeAndNil(FInternalImageList);



  inherited Destroy;

  Invalidate;

end;

    

procedure TnSpeedButton.Paint;

const

  DownStyles: array[Boolean] of Integer = (BDR_RAISEDINNER, BDR_SUNKENOUTER);

  FillStyles: array[Boolean] of Integer = (BF_MIDDLE, 0);

var

  PaintRect: TRect;

  DrawFlags: Integer;

  Offset: TPoint;

  Button: TThemedButton;

  ToolButton: TThemedToolBar;

  Details: TThemedElementDetails;

begin

  if ImgOvSize and (Glyph.Width > 0) and (Glyph.Height > 0) then

      SetBounds(Left, Top, Glyph.Width, Glyph.Height);



  if not Enabled then

  begin

    FState := bsDisabled;

    FDragging := False;

  end else

  if FState = bsDisabled then

    if FDown and (GroupIndex <> 0) then

      FState := bsExclusive

    else

      FState := bsUp;

  Canvas.Font := Self.Font;



  if ThemeServices.ThemesEnabled then

  begin

    PerformEraseBackground(Self, Canvas.Handle);



    if not Enabled then

      Button := tbPushButtonDisabled

    else

      if FState in [bsDown, bsExclusive] then

        Button := tbPushButtonPressed

      else

        if MouseInControl then

          Button := tbPushButtonHot

        else

          Button := tbPushButtonNormal;



    ToolButton := ttbToolbarDontCare;

    if FFlat then

    begin

      case Button of

        tbPushButtonDisabled : Toolbutton := ttbButtonDisabled;

        tbPushButtonPressed  : Toolbutton := ttbButtonPressed;

        tbPushButtonHot      : Toolbutton := ttbButtonHot;

        tbPushButtonNormal   : Toolbutton := ttbButtonNormal;

      end;

    end;



    PaintRect := ClientRect;

    if ToolButton = ttbToolbarDontCare then

    begin

      if not FImgOvNoFlat then

      begin

        Details := ThemeServices.GetElementDetails(Button);

        ThemeServices.DrawElement(Canvas.Handle, Details, PaintRect);

        PaintRect := ThemeServices.ContentRect(Canvas.Handle, Details, PaintRect);

      end;

    end

    else

    begin

      if not FImgOvNoFlat then

      begin

        Details := ThemeServices.GetElementDetails(ToolButton);

        ThemeServices.DrawElement(Canvas.Handle, Details, PaintRect);

        PaintRect := ThemeServices.ContentRect(Canvas.Handle, Details, PaintRect);

      end;

    end;



    if Button = tbPushButtonPressed then

    begin

      // A pressed speed button has a white text. This applies however only to flat buttons.

      if ToolButton <> ttbToolbarDontCare then

        Canvas.Font.Color := clHighlightText;

      Offset := Point(0, 1);

    end

    else

      Offset := Point(0, 0);



    if ((FImageList <> nil) and (FImageIndex >= 0) and (FImageIndex < FImageList.Count)) then

    begin

     Draw(Canvas, PaintRect, Offset, Caption, FLayout, FMargin, FSpacing, FState, Transparent, Enabled, DrawTextBiDiModeFlags(0));

    end else



    Draw(Canvas, PaintRect, Offset, Caption, FLayout, FMargin, FSpacing, FState, Transparent, Enabled, DrawTextBiDiModeFlags(0));

  end else //sen theme

  begin

    PaintRect := Rect(0, 0, Width, Height);



    if not FFlat then

    begin

     if not FImgOvNoFlat then

     begin

      DrawFlags := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;

      if FState in [bsDown, bsExclusive] then

        DrawFlags := DrawFlags or DFCS_PUSHED;

      DrawFrameControl(Canvas.Handle, PaintRect, DFC_BUTTON, DrawFlags);

     end;

    end else //com FFlat

    begin

      if (FState in [bsDown, bsExclusive]) or (FMouseInControl and (FState <> bsDisabled)) or (csDesigning in ComponentState) then

        if not FImgOvNoFlat then

        DrawEdge(Canvas.Handle, PaintRect, DownStyles[FState in [bsDown, bsExclusive]], FillStyles[Transparent] or BF_RECT)

     else

      if not Transparent then

      begin

        Canvas.Brush.Color := Color;

        Canvas.FillRect(PaintRect);

      end;

      InflateRect(PaintRect, -1, -1);

    end;

    if FState in [bsDown, bsExclusive] then

    begin

      if (FState = bsExclusive) and (not FFlat or not FMouseInControl) then

      begin

        if not FOverDraw then

        begin

         Canvas.Brush.Bitmap := AllocPatternBitmap(clBtnFace, clBtnHighlight);

         Canvas.FillRect(PaintRect);

        end;

      end;

      Offset.X := 1;

      Offset.Y := 1;

    end

    else

    begin

      Offset.X := 0;

      Offset.Y := 0;

    end;

    if ((FImageList <> nil) and (FImageIndex >= 0) and (FImageIndex < FImageList.Count)) then

    begin

     if (FImageIndex > -1) and (FImageIndex < FImageList.Count) then

     begin

       Glyph.Width  := FImageList.Width; Glyph.Height := FImageList.Height;

     end;

     Draw(Canvas, PaintRect, Offset, Caption, FLayout, FMargin, FSpacing, FState, Transparent, Enabled, DrawTextBiDiModeFlags(0));

    end else



    Draw(Canvas, PaintRect, Offset, Caption, FLayout, FMargin, FSpacing, FState, Transparent, Enabled, DrawTextBiDiModeFlags(0));

  end;

end;

    

procedure TnSpeedButton.UpdateTracking;

var

  P: TPoint;

begin

  if FFlat then

  begin

    if Enabled then

    begin

      GetCursorPos(P);

      FMouseInControl := not (FindDragTarget(P, True) = Self);

      if FMouseInControl then

        Perform(CM_MOUSELEAVE, 0, 0)

      else

        Perform(CM_MOUSEENTER, 0, 0);

    end;

  end;

end;

    

procedure TnSpeedButton.Loaded;

var

  State: TButtonState;

begin

  inherited Loaded;

  if Enabled then

    State := bsUp

  else

    State := bsDisabled;

    

  CreateButtonGlyph2(State);

end;

    

procedure TnSpeedButton.MouseDown(Button: TMouseButton; Shift: TShiftState;

  X, Y: Integer);

begin

  inherited MouseDown(Button, Shift, X, Y);

  if (Button = mbLeft) and Enabled then

  begin

    if not FDown then

    begin

      FState := bsDown;

      Invalidate;

    end;

    FDragging := True;

  end;

end;

    

procedure TnSpeedButton.MouseMove(Shift: TShiftState; X, Y: Integer);

var

  NewState: TButtonState;

begin

  inherited MouseMove(Shift, X, Y);

  if FDragging then

  begin

    if not FDown then NewState := bsUp

    else NewState := bsExclusive;

    if (X >= 0) and (X < ClientWidth) and (Y >= 0) and (Y <= ClientHeight) then

      if FDown then NewState := bsExclusive else NewState := bsDown;

    if NewState <> FState then

    begin

      FState := NewState;

      Invalidate;

    end;

  end

  else if not FMouseInControl then

    UpdateTracking;

end;

    

procedure TnSpeedButton.MouseUp(Button: TMouseButton; Shift: TShiftState;

  X, Y: Integer);

var

  DoClick: Boolean;

begin

  inherited MouseUp(Button, Shift, X, Y);

  if FDragging then

  begin

    FDragging := False;

    DoClick := (X >= 0) and (X < ClientWidth) and (Y >= 0) and (Y <= ClientHeight);

    if FGroupIndex = 0 then

    begin

      { Redraw face in-case mouse is captured }

      FState := bsUp;

      FMouseInControl := False;

      if DoClick and not (FState in [bsExclusive, bsDown]) then

        Invalidate;

    end

    else

      if DoClick then

      begin

        SetDown(not FDown);

        if FDown then Repaint;

      end

      else

      begin

        if FDown then FState := bsExclusive;

        Repaint;

      end;

    if DoClick then Click;

    UpdateTracking;

  end;

end;

    

procedure TnSpeedButton.Click;

begin

  inherited Click;

end;

    

function TnSpeedButton.GetPalette: HPALETTE;

begin

  Result := Glyph.Palette;

end;



function TnSpeedButton.GetActionLinkClass: TControlActionLinkClass;

begin

  Result := TcSpeedButtonActionLink;

end;



procedure TnSpeedButton.SetGlyph(Value: TBitmap);

begin

  Invalidate;

  FOriginal.Assign(Value);

  if (Value <> nil) and (Value.Height > 0) then

    FTransparentColor := Value.TransparentColor;

end;



procedure TnSpeedButton.SetGlyphOver(const Value: TBitmap);

begin

  Invalidate;

  FOriginalOver.Assign(Value);

  if (Value <> nil) and (Value.Height > 0) then

    FTransparentColor := Value.TransparentColor;

end;



procedure TnSpeedButton.SetGlyphDown(const Value: TBitmap);

begin

  Invalidate;

  FOriginalDown.Assign(Value);

  if (Value <> nil) and (Value.Height > 0) then

    FTransparentColor := Value.TransparentColor;

end;



procedure TnSpeedButton.GlyphChanged(Sender: TObject);

begin

  if (Sender = FOriginal) or (Sender = FOriginalDown) or (Sender = FOriginalOver) then

  begin

    FTransparentColor := FOriginal.TransparentColor or FOriginalDown.TransparentColor or FOriginalOver.TransparentColor;

    Invalidate;

    if Assigned(FOnChange) then FOnChange(Self);

  end;

  Invalidate;

end;

    

procedure TnSpeedButton.UpdateExclusive;

var

  Msg: TMessage;

begin

  if (FGroupIndex <> 0) and (Parent <> nil) then

  begin

    Msg.Msg := CM_BUTTONPRESSED;

    Msg.WParam := FGroupIndex;

    Msg.LParam := Longint(Self);

    Msg.Result := 0;

    Parent.Broadcast(Msg);

  end;

end;

    

procedure TnSpeedButton.SetDown(Value: Boolean);

begin

  if FGroupIndex = 0 then Value := False;

  if Value <> FDown then

  begin

    if FDown and (not FAllowAllUp) then Exit;

    FDown := Value;

    if Value then

    begin

      if FState = bsUp then Invalidate;

      FState := bsExclusive

    end

    else

    begin

      FState := bsUp;

      Repaint;

    end;

    if Value then UpdateExclusive;

  end;

end;

    

procedure TnSpeedButton.SetFlat(Value: Boolean);

begin

  if Value <> FFlat then

  begin

    FFlat := Value;

    Invalidate;

  end;

end;

    

procedure TnSpeedButton.SetGroupIndex(Value: Integer);

begin

  if FGroupIndex <> Value then

  begin

    FGroupIndex := Value;

    UpdateExclusive;

  end;

end;

    

procedure TnSpeedButton.SetLayout(Value: TButtonLayout);

begin

  if FLayout <> Value then

  begin

    FLayout := Value;

    Invalidate;

  end;

end;

    

procedure TnSpeedButton.SetMargin(Value: Integer);

begin

  if (Value <> FMargin) and (Value >= -1) then

  begin

    FMargin := Value;

    Invalidate;

  end;

end;

    

procedure TnSpeedButton.SetSpacing(Value: Integer);

begin

  if Value <> FSpacing then

  begin

    FSpacing := Value;

    Invalidate;

  end;

end;



procedure TnSpeedButton.SetTransparent(Value: Boolean);

begin

  if Value <> FTransparent then

  begin

    FTransparent := Value;

    if Value then

      ControlStyle := ControlStyle - [csOpaque] else

      ControlStyle := ControlStyle + [csOpaque];

    Invalidate;

  end;

end;



procedure TnSpeedButton.SetAllowAllUp(Value: Boolean);

begin

  if FAllowAllUp <> Value then

  begin

    FAllowAllUp := Value;

    UpdateExclusive;

  end;

end;

    

procedure TnSpeedButton.WMLButtonDblClk(var Message: TWMLButtonDown);

begin

  inherited;

  if FDown then DblClick;

end;

    

procedure TnSpeedButton.CMEnabledChanged(var Message: TMessage);

const

  NewState: array[Boolean] of TButtonState = (bsDisabled, bsUp);

begin

  CreateButtonGlyph2(NewState[Enabled]);

  UpdateTracking;

  Repaint;

end;

    

procedure TnSpeedButton.CMButtonPressed(var Message: TMessage);

var

  Sender: TnSpeedButton;

begin

  if Message.WParam = FGroupIndex then

  begin

    Sender := TnSpeedButton(Message.LParam);

    if Sender <> Self then

    begin

      if Sender.Down and FDown then

      begin

        FDown := False;

        FState := bsUp;

        if (Action is TCustomAction) then

          TCustomAction(Action).Checked := False;

        Invalidate;

      end;

      FAllowAllUp := Sender.AllowAllUp;

    end;

  end;

end;

    

procedure TnSpeedButton.CMDialogChar(var Message: TCMDialogChar);

begin

  with Message do

    if IsAccel(CharCode, Caption) and Enabled and Visible and

      (Parent <> nil) and Parent.Showing then

    begin

      Click;

      Result := 1;

    end else

      inherited;

end;

    

procedure TnSpeedButton.CMFontChanged(var Message: TMessage);

begin

  Invalidate;

end;

    

procedure TnSpeedButton.CMTextChanged(var Message: TMessage);

begin

  Invalidate;

end;

    

procedure TnSpeedButton.CMSysColorChange(var Message: TMessage);

begin

  Invalidate;

end;



procedure TnSpeedButton.CMMouseEnter(var Message: TMessage);

var

  NeedRepaint, OnOffThemeServices: Boolean;

begin

  inherited;

  if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);

  { Don't draw a border if DragMode <> dmAutomatic since this button is meant to

    be used as a dock client. }

  if FOverDraw then

    OnOffThemeServices := FOverDraw

  else

    OnOffThemeServices := ThemeServices.ThemesEnabled;



  NeedRepaint := FFlat and not FMouseInControl and Enabled and (DragMode <> dmAutomatic) and (GetCapture = 0);



  { Windows XP introduced hot states also for non-flat buttons. }

  if (NeedRepaint or OnOffThemeServices) and not (csDesigning in ComponentState) then

  begin

    FMouseInControl := True;

    if Enabled then

      Repaint;

  end;           

end;



procedure TnSpeedButton.CMMouseLeave(var Message: TMessage);

var

  NeedRepaint, OnOffThemeServices: Boolean;

begin

  inherited;

  if Assigned(FOnMouseLeave) then FOnMouseLeave(Self);



  if FOverDraw then

    OnOffThemeServices := FOverDraw

  else

    OnOffThemeServices := ThemeServices.ThemesEnabled;



  NeedRepaint := FFlat and FMouseInControl and Enabled and not FDragging;

  { Windows XP introduced hot states also for non-flat buttons. }

  if NeedRepaint or OnOffThemeServices then

  begin

    //if FOverDraw then

    FMouseInControl := False;

    if Enabled then

      Repaint;

  end;

end;



procedure TnSpeedButton.ActionChange(Sender: TObject; CheckDefaults: Boolean);



  procedure CopyImage(ImageList: TCustomImageList; Index: Integer);

  begin

    with Glyph do

    begin

      Width := ImageList.Width;

      Height := ImageList.Height;

      Canvas.Brush.Color := clFuchsia;//! for lack of a better color

      Canvas.FillRect(Rect(0,0, Width, Height));

      ImageList.Draw(Canvas, 0, 0, Index);

    end;

  end;



begin

  inherited ActionChange(Sender, CheckDefaults);

  if Sender is TCustomAction then

    with TCustomAction(Sender) do

    begin

      if CheckDefaults or (Self.GroupIndex = 0) then

        Self.GroupIndex := GroupIndex;

      { Copy image from action's imagelist }

      if (Glyph.Empty) and (ActionList <> nil) and (ActionList.Images <> nil) and

        (ImageIndex >= 0) and (ImageIndex < ActionList.Images.Count) then

        CopyImage(ActionList.Images, ImageIndex);

    end;

end;



procedure TnSpeedButton.AlphaTransBitmap(Canvas: TCanvas; const PsW, PsH: Integer;

  const SrcBmp: TBitmap; Enabled_GScale_Opacity: Boolean);

var

 TmpDstBmp: TBitmap;

 w,h : Integer;

 aR1 : TRect;



//===Opacidade bitmap  e  tom cinza Bitmap============================

 function nGrayScaleOpacity(Bmp: TBitmap): TBitmap;

 var

   ScanL, SA : PRGBAArray;

   x, Y, w, h : integer;

 begin

  if (FEnabledGrayScale = [bsGrayScale]) or (FEnabledGrayScale = [bsGrayScale, bsOpacity]) then

  begin

   h := Bmp.Height - 1;

   w := Bmp.Width - 1;

   for Y := 0 to h do begin

     SA := Bmp.scanline[Y];

     for x := 0 to w do begin

       SA[x].R := (SA[x].R + SA[x].G + SA[x].B) div 3;

       SA[x].G := SA[x].R;

       SA[x].B := SA[x].R;

     end;

   end;

  end;

 if (FEnabledGrayScale = [bsOpacity]) or (FEnabledGrayScale = [bsOpacity, bsGrayScale]) then

 begin

   for Y := 0 to Bmp.Height - 1 do

   begin

     ScanL := Bmp.ScanLine[Y];

     for X := 0 to Bmp.Width - 1 do

     ScanL[X].A := (ScanL[X].A * FEOpacity) div 100;

   end;

 end;

 Result := Bmp;

 end;

//====================================================================

 //Criar Bitmap Virtual 32 Btis

 function CreateBmpV32(const Width, Height : integer) : TBitmap;

 begin

  Result := TBitmap.Create;

  Result.PixelFormat := pf32bit;

  Result.HandleType := bmDIB;

  Result.Width  := Width;

  Result.Height := Height;

 end;

  // converte canal alpha!

 procedure ConvertAlphaChannelBmp32b(R1, R2 : TRect; const BmpDst, BmpSrc : TBitmap);

 var

   S1 : PRGBAArray;

   S2 : PRGBAArray;

   X, Y, h, w, sX1, sX2: Integer;

   Col_ : TnColor_;

 begin

   if BmpSrc = nil then Exit;



   BmpSrc.PixelFormat := pf32Bit;



   h := Min((R1.Bottom - R1.Top),(R2.Bottom - R2.Top));

   h := Min(h, BmpDst.Height - R1.Top);

   h := Min(h, BmpSrc.Height - R2.Top) - 1;

   if h < 0 then Exit;

   w := Min((R1.Right - R1.Left), (R2.Right - R2.Left));

   w := Min(w, BmpDst.Width - R1.Left);

   w := Min(w, BmpSrc.Width - R2.Left);

   if w < 0 then Exit;



   w := Min(w, BmpDst.Width - R1.Left);

   w := Min(w, BmpSrc.Width - R2.Left) - 1;



   for Y := 0 to h do

   begin

     S1 := BmpDst.ScanLine[R1.Top + Y];

     S2 := BmpSrc.ScanLine[R2.Top + Y];

     sX1 := R1.Left;

     sX2 := R2.Left;

     for X := 0 to w do

     begin

       Col_ := S2[sX2];

       if Col_.C <> clFuchsia then

       begin

         S1[sX1].R := (((S2[sX2].R - S1[sX1].R) * S2[sX2].A + S1[sX1].R shl 8) shr 8) and MaxByte;

         S1[sX1].G := (((S2[sX2].G - S1[sX1].G) * S2[sX2].A + S1[sX1].G shl 8) shr 8) and MaxByte;

         S1[sX1].B := (((S2[sX2].B - S1[sX1].B) * S2[sX2].A + S1[sX1].B shl 8) shr 8) and MaxByte;

       end;

       inc(sX1);

       inc(sX2);

     end;

   end;

 end;



 //Inicio da Funcção no Bitmap

begin

 aR1:= Rect(0, 0, SrcBmp.Width, SrcBmp.Height);

 w := aR1.Right  - aR1.Left;

 h := aR1.Bottom -  aR1.Top;

 TmpDstBmp := CreateBmpV32(w, h);



 if not Enabled_GScale_Opacity then

   nGrayScaleOpacity(SrcBmp);



  if not ((w = SrcBmp.Width) or (h = SrcBmp.Height)) then Exit;

  try

    SrcBmp.PixelFormat := pf32bit;

    SrcBmp.Width  := w;

    SrcBmp.Height := h;

    BitBlt(TmpDstBmp.Canvas.Handle, 0, 0, w, h, Canvas.Handle, PsW, PsH, SRCCOPY);

    ConvertAlphaChannelBmp32b(Classes.Rect(0, 0, w, h), Classes.Rect(0, 0, w, h), TmpDstBmp, SrcBmp);

    BitBlt(Canvas.Handle, PsW, PsH, TmpDstBmp.Width, TmpDstBmp.Height, TmpDstBmp.Canvas.Handle, 0, 0, SRCCOPY);

  finally

   FreeAndNil(TmpDstBmp);

  end;

end;



procedure TnSpeedButton.SetEnabledGrayScale(const Value: TEnabled_IGs);

begin

  if not Enabled then begin

    if EnabledGrayScale <> Value then

      FEnabledGrayScale := Value;

    Invalidate;

  end;

end;



procedure TnSpeedButton.SetEnabledOpacity(const Value: integer);

begin

  if not Enabled then

  begin

    if FEOpacity <> Value then

    begin

      if Value < 0 then

        FEOpacity := 0

      else

        if Value > 100 then

          FEOpacity := 100

        else

        FEOpacity := Value;

    Invalidate;

    end;

  end;

end;



procedure TnSpeedButton.SetImageIndex(const Value: TImageIndex);

begin

 if (FImageIndex <> Value) then

 begin

  FImageIndex := Value;



  if FImageIndex = -1 then

  begin

      FOriginal.Assign(nil);

      Glyph.Assign(nil);

  end;

 Invalidate;

 end;

end;



procedure TnSpeedButton.SetImages(const Value: TCustomImageList);

begin

 if ImageList <> Value then

 begin

    if ImageList <> nil then ImageList.UnRegisterChanges(FImageChangeLink);

    FImageList := Value;

    if FImageList <> nil then

    begin

      ImageList.RegisterChanges(FImageChangeLink);

      ImageList.FreeNotification(Self);

    end;

 end;

end;



procedure TnSpeedButton.ImageListChange(Sender: TObject);

begin

  Invalidate;

end;



procedure TnSpeedButton.DrawButtonImgList(Canvas: TCanvas; const GlyphPos: TPoint;

  State: TButtonState; Transparent, SetGrayScaleAndOpacity: Boolean);

var

 Bmp : TBitmap;

 MakeColor : TColor;



  procedure PreparingBitmap(IndexToInsert: Integer; ImageListToInsert: TCustomImageList);

  begin

    Bmp.Width  := ImageListToInsert.Width;

    Bmp.Height := ImageListToInsert.Height;

    Bmp.PixelFormat := pf32bit;

    if ImageListToInsert.BkColor <> clNone then

      MakeColor := ImageListToInsert.BkColor

    else

      MakeColor := clFuchsia;

    Bmp.Canvas.Brush.Color := MakeColor;

    Bmp.Canvas.FillRect(Rect(0, 0, Bmp.Width, Bmp.Height));

    ImageListToInsert.GetBitmap(IndexToInsert, Bmp);

  end;    

begin

  bmp := TBitmap.Create;

  if FOverDraw then

  begin

    if (FState = bsDown) or (Down) then

      PreparingBitmap(ImgOvIdxDown, FImageList)

    else

    if MouseInControl then

      PreparingBitmap(ImgOvIdxOver, FImageList)

    else



     PreparingBitmap(ImgOvIdxNormal, FImageList)

  end else



   PreparingBitmap(FImageIndex, FImageList);

  try

   AlphaTransBitmap(Canvas, GlyphPos.X, GlyphPos.Y, Bmp, SetGrayScaleAndOpacity);

  finally

   FreeAndNil(Bmp);

  end;

end;



procedure TnSpeedButton.SetOverDraw(const Value: Boolean);

begin

 if FOverDraw <> Value then

 begin

   FOverDraw := Value;

   if not FFlat then

     FFlat := true;

   Flat := FFlat;  

   Invalidate;

 end;

end;



procedure TnSpeedButton.SetImgOvSize(const Value: Boolean);

begin

  if FImgOvSize <> Value then

  begin

    FImgOvSize := Value;

     if ImgOvSize and (Glyph.Width > 0) and (Glyph.Height > 0) then

       SetBounds(Left, Top, Glyph.Width, Glyph.Height);

    Invalidate;

  end;

end;



procedure TnSpeedButton.SetImgOvNoFlat(const Value: Boolean);

begin

  if FImgOvNoFlat <> Value then

  begin

    FImgOvNoFlat := Value;

    Invalidate;

  end;

end;



initialization

  {$IFDEF Pnggraphics}

   // TPicture.RegisterFileFormat('png','Portable network graphics (TPNGGraphic)', TPNGGraphic);

  {$ENDIF}



finalization

  {$IFDEF Pnggraphics}

     //TPicture.UnregisterGraphicClass(TPNGGraphic);

  {$ENDIF}



end.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Ilano
      Olá pessoal,
       
      Desenvolvi uma aplicação de gerenciamento de banco de dados, onde posso visualizar relacionamentos, localizar campos na base de dados, criar consultas, visualizando os dados num cxGrid e num cxDBPivotGrid1, etc. Agora estou tentando implementar um gauge usando o componente AdvSmoothGauge da TMS, mas como posso utilizá-lo aplicando as consultas desenvolvidas neste gerenciador?
       
      Grato,
       
      Ilano
    • Por fabio_medeiros
      Olá Galera do iMasters, queria contar com a ajuda de vocês para resolver um pequeno probleminha, sou iniciante no Delphi e queria saber como colocar opção para trocar a senha do formulário principal, ou seja, ao dar um duplo clique no executável ele pedir a senha e quando estiver logado, ter uma opção no menu "Arquivo" para trocar de senha. não é preciso ter a necessidade de digitar a senha novamente pois como já foi logado, não precisa. Só será preciso a senha, como mostra a imagem abaixo:
       
       

       
       
      Obrigado à todos !
    • Por FabricioSoul2014
      Boa tarde, estou com uma dificuldade na parte de puxar duas informações para outro form, estou utilizando delphi 7, banco paradox onde tenho dois Form um deles chamada Funcionário e nele consta varias informações porém a mais relevante são duas, o nome do dentista e o CRO pois isso será vinculado no outro Form  chamado Exame que terá que puxar o nome e junto o Cro, consegui fazer que acontecesse isso, no entanto quando adiciono mais que um dentista também me aparece diversos Cro pois no Form de Exame coloquei combo box onde posso escolher o dentista e nisso deveria puxar o Cro só que só selecionando que dá certo, ou seja posso escolher o Cro de quem eu quiser, alguém teria alguma dica?
       
      2 dúvida 
      Outra questão seria quando o usuário não preenche as informações como poderia colocar uma caixa de dialogo informando onde ou qual informação faltou preencher, por exemplo nome, sexo em vez daquelas mensagem do delphi de erro.
       
      3 Dúvida
      Pelo dbgrid teria como mostrar uma  mensagem e sinalizando em vermelho ou qualquer outra cor em destaque quando a data do agendamento estivesse próximo? 
       
      4 Dúvida
      Tenho um certo problema em relação a quantidade de dígitos ou caracteres no edit  pois coloco no meu banco que só pode ir até 11 no cpf por exemplo porém posso colocar 9 e não tem problema, não estou falando em validação somente em quantidade mesmo, pois a maioria das minhas variáveis estão no tipo alpha.
      5 Dúvida
      A ultima questão seria no login pois já tenho um criado no entanto se eu logar na primeira ok, agora se eu for logar na segunda vez e se eu não digitar nada ele entra normal. 
    • Por Ilano
      Olá pessoal,
      Uso Delphi 7, e tenho um AdvPageControl que contém várias abas e em cada aba um ADVMemo. Como são 20 abas, são 20 ADVMemos. O que eu quero fazer? Tenho uma grid e nela várias tabelas. Quero que ao clicar 2X num registro, o nome da tabela seja jogado para um ADVMemo situado na aba ativa do AdvPageControl. Para isso estou fazendo o seguinte trabalho de doido:

      Como eu poderia melhorar esse código para fazer o que preciso de forma bem mais profissional?
      Grato,
      Ilano.
    • Por desenvolvedor Everest
      Bom dia à todos!

      Trabalho com uma aplicação, que faz uma consulta ao sistema Sintegra.
      Em uma das telas da aplicação, há um componente TWebBrowser, que acessa o WebService do sistema Sintegra. Após o usuário consultar algum CNPJ/IE, é utilizado o mesmo componente TWebBrowser para coletar os dados da página referentes ao CNPJ/IE consultado e utilizar tais dados na aplicação.

      Aí vem o problema...

      Na maioria dos estados, após a consulta do CNPJ/IE, o TWebBrowser é redirecionado para uma nova página com as informações referentes. Até aí tudo bem, mas...

      Alguns estados, esse direcionamento é feito para uma nova janela de navegação, ou seja, é aberto uma nova página em um navegador da internet (Chrome, IE, Mozilla, etc.) fora da minha aplicação... Com isso, eu não consigo baixar os dados da página para utilizar na aplicação...

      Alguma idéia, sugestão, solução?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.