Olá,

gostei do componente, mas tenho q adicionar uma observação:

estou usando o delphi 5. No 3 ele não aceitou... vou ver porque...
mas no delphi 5, depois q vc solta o botão, ele fica com a imagem rebocada, como se mostrasse as 2 imagens...
portanto, fiz uma melhoria no código, e com sua permissão, segue abaixo o que deve ser feito:

procedure TjvBitmapButton.MouseUp(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
begin
  inherited;
  FPushDown:=false;
  if Latching then
    FDown:= not FDown
  else
    FDown:=false;
  refresh;     //// <<<<<<<<<< ADICIONE ISSO!!!    BY ANDERSON
  Paint;
  if assigned(onmouseup) then
    onmouseup(self,button,shift,x,y);
end;

  ----- Original Message -----
  From: Luiz Escobar
  To: delphi-br@yahoogrupos.com.br
  Sent: Wednesday, May 31, 2006 9:01 PM
  Subject: RES: [delphi-br] Botões redondos... codigo fonte botão de bitmap´s...



  bom sei que vc quer um botão redondo, e isso parece dificil.. bom aqui tem um exemplo de um botão
  feito atravez de um bitmap, qualquer bitmap vira um botão...
  ele cria o efeito de Lighter, quando passa o mouse encima, Darker, quando clica, acertei esta parte, comia um pedaçinho da imagem quando era justa, Disabled, (essa eu implementei, ehehhehe), quando vc disabilita o botão...
  talvez ajude...

  como não sabia o endereço postei o código....
  se alguem gostar e implementar algo novo, posta ai....

  Luiz Escobar



  //==============================================================
  //jvBitmapButton.pas
  // versão 2.1c  modify by Luiz Escobar
  //---------------------------------------------------------------------------------------------------------------
  unit jvBitmapButton;

  interface

  uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

  type
    TjvBitmapButton = class(TGraphicControl)
    private
      FBitmap: TBitmap;
      FLighter: TBitmap;
      FDarker: Tbitmap;
      FDisabled: Tbitmap; // by Luiz Escobar
      FPushDown:boolean;
      FMouseOver:boolean;
      FLatching: boolean;
      FDown: boolean;
      FHotTrack: boolean;
      Fenable: boolean;  // by Luiz Escobar
      procedure SetBitmap(const Value: TBitmap);
      procedure MakeDarker;
      procedure MakeLighter;
      procedure MakeDisabled;  // by Luiz Escobar
      procedure SetLatching(const Value: boolean);
      procedure SetDown(const Value: boolean);
      procedure SetHotTrack(const Value: boolean);
      function  GetEnabled : Boolean; // by Luiz Escobar
      procedure SetEnabled( const Value: boolean); // by Luiz Escobar
      { Private declarations }
    protected
      { Protected declarations }
      procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);override;
      procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);override;
      procedure MouseMove(Shift: TShiftState; X, Y: Integer);override;
      procedure Click;override;
      procedure CMMouseLeave(var Message:TMessage); message CM_MouseLeave;
      procedure Loaded;override;
      procedure Resize;override;
    public
      { Public declarations }
      constructor Create(AOwner:TComponent);override;
      destructor  Destroy;override;
      procedure   Paint; override;
    published
      { Published declarations }
      property Bitmap:TBitmap read FBitmap write SetBitmap;
      property Down:boolean read FDown write SetDown;
      property Latching:boolean read FLatching write SetLatching;
      property HotTrack:boolean read FHotTrack write SetHotTrack;
      property Enable:boolean read GetEnabled write SetEnabled; // by Luiz Escobar
      property onclick;
      property onmousedown;
      property onmouseup;
    end;

  procedure Register;

  implementation

  procedure Register;
  begin
    RegisterComponents('ESC_UTIL', [TjvBitmapButton]);
  end;

  { TjvBitmapButton }

  function TjvBitmapButton.GetEnabled: boolean;  // by Luiz Escobar
  begin
     result := enabled;
  end;

  procedure TjvBitmapButton.SetEnabled( const Value : boolean ); // by Luiz Escobar
  begin
     enabled := value;
     fenable := enabled;
     Paint;
  end ;

  procedure TjvBitmapButton.Click;
  begin
    inherited;
    if FPushDown then
      if assigned(onclick) then
        onclick(self);
  end;

  constructor TjvBitmapButton.Create(AOwner: TComponent);
  begin
    inherited;
    width:=24;
    height:=24;
    FPushDown:=false;
    FMouseOver:=false;
    FLatching:=false;
    FHotTrack:=true;
    FDown:=false;
    FBitmap:=TBitmap.create;
    Fbitmap.width:=24;
    Fbitmap.Height:=24;
    Fbitmap.canvas.brush.color:=clgray;
    FBitmap.canvas.FillRect (rect(1,1,23,23));
    FLighter:=Tbitmap.create;
    FDarker:=Tbitmap.create;
    FDisabled:=Tbitmap.create; // by Luiz Escobar
    Fenable := enabled;  // by Luiz Escobar
  end;

  destructor TjvBitmapButton.Destroy;
  begin
    FBitmap.free;
    FLighter.free;
    FDarker.free;
    FDisabled.free; // by Luiz Escobar
    inherited;
  end;

  procedure TjvBitmapButton.MouseDown(Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
  begin
    inherited;
    if FBitmap.canvas.pixels[x,y]<>Fbitmap.canvas.pixels[0,FBitmap.height-1] then
     FPushDown:=true
     else
     FPushDown:=false;
    Paint;
    if assigned(onmousedown) then
      onmousedown(self,button,shift,x,y);
  end;

  procedure TjvBitmapButton.MouseUp(Button: TMouseButton; Shift: TShiftState;
    X, Y: Integer);
  begin
    inherited;
    FPushDown:=false;
    if Latching then
      FDown:= not FDown
    else
      FDown:=false;
    Paint;
    if assigned(onmouseup) then
      onmouseup(self,button,shift,x,y);
  end;

  procedure TjvBitmapButton.Paint;
  var Acolor:TColor;
  begin
    inherited;
    if assigned(FBitmap) then
    begin
      AColor:=FBitmap.canvas.pixels[0,FBitmap.height-1];
      Fbitmap.transparent:=true;
      Fbitmap.transparentcolor:=Acolor;
      FLighter.transparent:=true;
      Flighter.TransparentColor :=AColor;
      FDarker.transparent:=true;
      FDarker.TransparentColor :=AColor;
      AColor:=FDisabled.canvas.pixels[0,FDisabled.height-1];
      FDisabled.transparent:=true;
      FDisabled.TransparentColor :=AColor;
      if enabled  then begin // by Luiz Escobar
         if FPushdown then  begin
            canvas.draw(1,1,FDarker)
         end else begin
           if Down then
             canvas.Draw(1,1,FDarker)
           else if (FMouseOver and FHotTrack) then
             canvas.draw(0,0,FLighter)
           else canvas.Draw (0,0,FBitmap);
         end;
      end else canvas.Draw(0,0,FDisabled); // by Luiz Escobar
    end;
  end;

  procedure TjvBitmapButton.SetBitmap(const Value: TBitmap);
  begin
    FBitmap.assign(Value);
    FBitmap.transparent:=true;
    FBitmap.TransparentColor :=FBitmap.Canvas.pixels[0,FBitmap.Height-1];
    width:=FBitmap.Width ;
    height:=FBitmap.Height ;
    MakeLighter;
    MakeDarker;
    MakeDisabled;
  end;

  procedure TjvBitmapButton.MakeDisabled; // procedure by Luiz Escobar
  var
    c, x, y: Integer;
    PxlColor: TColor;
    R: TRect;
    Offset, Flags: Integer;
    DrawPressed: Boolean;
    Image: TBitmap;
    Bitmap: TBitmap;
  begin
    FDisabled.Width := FBitmap.Width;
    FDisabled.Height := FBitmap.Height;
    FDisabled.PixelFormat := FBitmap.PixelFormat;
    FDisabled.Assign( FBitmap );
        for x := 0 to FBitmap.Width - 1 do
          for y := 0 to FBitmap.Height - 1 do
          begin
            PxlColor := ColorToRGB(FBitmap.Canvas.Pixels[x, y]);
            c := Round((((PxlColor shr 16) + ((PxlColor shr 8) and $00FF) + (PxlColor and $0000FF)) div 3)) div 2 + 96;
            FDisabled.Canvas.Pixels[x, y] := RGB(c, c, c);
          end;

  end;

  procedure TjvBitmapButton.MakeLighter;
  var p1,p2:Pbytearray;
      x,y:integer;
      rt,gt,bt:byte;
      r,g,b:byte;
      AColor:TColor;
  begin
    FLighter.Width :=FBitmap.Width ;
    FLighter.Height :=FBitmap.height;
    Acolor:=colortorgb(FBitmap.canvas.pixels[0,FBitmap.height-1]);
    rt:=GetRValue(Acolor);
    gt:=GetGValue(AColor);
    bt:=getBValue(AColor);
    FBitmap.PixelFormat  :=pf24bit;
    FLighter.PixelFormat :=pf24bit;
    for y:=0 to Fbitmap.height-1 do
    begin
      p1:=Fbitmap.ScanLine [y];
      p2:=FLighter.ScanLine [y];
      for x:=0 to FBitmap.width-1 do
      begin
        if (p1[x*3]=bt)and (p1[x*3+1]=gt)and (p1[x*3+2]=rt) then
        begin
          p2[x*3]:=p1[x*3];
          p2[x*3+1]:=p1[x*3+1];
          p2[x*3+2]:=p1[x*3+2];
        end
        else
        begin
          p2[x*3]:=$FF-round(0.8*abs($FF-p1[x*3]));
          p2[x*3+1]:=$FF-round(0.8*abs($FF-p1[x*3+1]));
          p2[x*3+2]:=$FF-round(0.8*abs($FF-p1[x*3+2]));
        end;
      end;
    end;
  end;

  procedure TjvBitmapButton.MakeDarker;
  var p1,p2:Pbytearray;
      x,y:integer;
      rt,gt,bt:byte;
      r,g,b:byte;
      AColor:TColor;
  begin
    FDarker.Width :=FBitmap.Width ;
    FDarker.Height :=FBitmap.height;
    Acolor:=colortorgb(FBitmap.canvas.pixels[0,FBitmap.height-1]);
    rt:=GetRValue(Acolor);
    gt:=GetGValue(AColor);
    bt:=getBValue(AColor);
    FBitmap.PixelFormat :=pf24bit;
    FDarker.PixelFormat :=pf24bit;
    for y:=0 to Fbitmap.height-1 do
    begin
      p1:=Fbitmap.ScanLine [y];
      p2:=FDarker.ScanLine [y];
      for x:=0 to FBitmap.width-1 do
      begin
        if (p1[x*3]=bt)and (p1[x*3+1]=gt)and (p1[x*3+2]=rt) then
        begin
          p2[x*3]:=p1[x*3];
          p2[x*3+1]:=p1[x*3+1];
          p2[x*3+2]:=p1[x*3+2];
        end
        else
        begin
          p2[x*3]:=round(0.7*p1[x*3]);
          p2[x*3+1]:=round(0.7*p1[x*3+1]);
          p2[x*3+2]:=round(0.7*p1[x*3+2]);
        end
      end;
    end;
  end;




  procedure TjvBitmapButton.CMMouseLeave(var Message: TMessage);
  begin
    FMouseOver:=false;
    Paint;
  end;

  procedure TjvBitmapButton.Loaded;
  begin
    inherited;
    if not FBitmap.Empty then
    begin
      MakeDarker;
      MakeLighter;
      MakeDisabled;
    end;
  end;

  procedure TjvBitmapButton.SetLatching(const Value: boolean);
  begin
    FLatching := Value;
    if not FLatching then
    begin
      FDown:=false;
      paint;
    end;
  end;

  procedure TjvBitmapButton.SetDown(const Value: boolean);
  begin
    if FLatching then
    begin
      FDown := Value;
      paint;
    end
    else
    begin
      FDown:=false;
      paint;
    end;
  end;

  procedure TjvBitmapButton.Resize;
  begin
    inherited;
    if assigned(Fbitmap) then
    begin
      width:=FBitmap.width+1;
      height:=FBitmap.Height+1;
    end
    else
    begin
      width:=24;
      height:=24;
    end;
  end;


  procedure TjvBitmapButton.SetHotTrack(const Value: boolean);
  begin
    FHotTrack := Value;
  end;

  procedure TjvBitmapButton.MouseMove(Shift: TShiftState; X, Y: Integer);
  var Value:boolean;
  begin
    inherited;
    Value:= FBitmap.canvas.pixels[x,y]<>Fbitmap.canvas.pixels[0,FBitmap.height-1];
    if value<>FMouseOver then
    begin
      FMouseOver:=value;
      Paint;
    end;
    if assigned(onmousemove) then
      onmousemove(self,shift,x,y);
  end;

  end.



  --
  <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>





        Yahoo! Grupos, um serviço oferecido por:
              PUBLICIDADE
               
      


------------------------------------------------------------------------------
  Links do Yahoo! Grupos

    a.. Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/
     
    b.. Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]
     
    c.. O uso que você faz do Yahoo! Grupos está sujeito aos Termos do Serviço do Yahoo!.



  __________ Informação do NOD32 IMON 1.1567 (20060530) __________

  Esta mensagem foi verificada pelo NOD32 sistema antivírus
  http://www.eset.com.br



[As partes desta mensagem que não continham texto foram removidas]



--
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

<*> Para ver as mensagens antigas, acesse:
    http://br.groups.yahoo.com/group/delphi-br/messages

<*> Para falar com o moderador, envie um e-mail para:
    [EMAIL PROTECTED]



Yahoo! Grupos, um serviço oferecido por:
PUBLICIDADE


Links do Yahoo! Grupos

Responder a