Avatar billede morten_s Nybegynder
27. januar 2004 - 19:34 Der er 3 kommentarer og
1 løsning

Image fra ImageList på denne smarte runde knap

Fandt lige nedenstående kode til en rund knap, men hvad den mangler er et Image som på en speedbutton.

Image ligger i en ImageList på Form1, 100 point til den som sætter image på knappen ;-))

unit RVButton;

interface

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

const
  iOffset = 3;

type
  TRVButton = class(TGraphicControl)
  private
    FCaption    : String;
    FButtonColor: TColor;
    FLButtonDown: boolean;
    FBtnPoints  : array[1..2] of TPoint;
    FKRgn      : HRgn;
    procedure SetCaption(Value: String);
    procedure SetButtonColor(Value: TColor);
    procedure FreeRegion;
  protected
    procedure Paint; override;
    procedure DrawCircle;
    procedure MoveButton;
    procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
    procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property ButtonColor: TColor read FButtonColor write SetButtonColor;
    property Caption: String read FCaption write SetCaption;
    property Enabled;
    property Font;
    property ParentFont;
    property ParentShowHint;
    property ShowHint;
    property Visible;
    property OnClick;
  end;

procedure Register;

implementation

uses MAIN;

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

{ TRVButton }

constructor TRVButton.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := [csClickEvents,csCaptureMouse];
  Width := 50;
  Height := 50;
  FButtonColor := clBtnFace;
  FKRgn := 0;
  FLButtonDown := False;
end;

destructor TRVButton.Destroy;
begin
  if FKRgn <> 0 then FreeRegion;
  inherited Destroy;
end;

procedure TRVButton.DrawCircle;
begin
  FBtnPoints[1] := Point(iOffset,iOffset);
  FBtnPoints[2] := Point(Width - iOffset,Height - iOffset);
  FKRgn := CreateEllipticRgn(FBtnPoints[1].x,FBtnPoints[1].y,FBtnPoints[2].x,FBtnPoints[2].y);
  Canvas.Brush.Color := FButtonColor;
  FillRgn(Canvas.Handle,FKRgn,Canvas.Brush.Handle);
  MoveButton;
end;

procedure TRVButton.FreeRegion;
begin
  if FKRgn <> 0 then DeleteObject(FKRgn);
  FKRgn := 0;
end;

procedure TRVButton.MoveButton;
var
  Color1: TColor;
  Color2: TColor;
begin
  with Canvas do
    begin
    if not FLButtonDown then
      begin
      Color1 := clBtnHighlight;
      Color2 := clBtnShadow;
      end
    else
      begin
      Color1 := clBtnShadow;
      Color2 := clBtnHighLight;
      end;

      Pen.Width := 1;

      if FLButtonDown then Pen.Color := clBlack
      else                Pen.Color := Color2;

      Ellipse(FBtnPoints[1].x - 2,FBtnPoints[1].y - 2,FBtnPoints[2].x + 2,FBtnPoints[2].y + 2);

      if not FLButtonDown then Pen.Width := 2
      else                    Pen.Width := 1;

      Pen.Color := Color1;

      Arc(FBtnPoints[1].x,FBtnPoints[1].y,FBtnPoints[2].x,FBtnPoints[2].y,
          FBtnPoints[2].x,FBtnPoints[1].y,FBtnPoints[1].x,FBtnPoints[2].y);

      Pen.Color := Color2;

      Arc(FBtnPoints[1].x,FBtnPoints[1].y,FBtnPoints[2].x,FBtnPoints[2].y,
          FBtnPoints[1].x,FBtnPoints[2].y,FBtnPoints[2].x,FBtnPoints[1].y);
      end;

SetCaption('');

end;

procedure TRVButton.Paint;
begin
  inherited Paint;
  FreeRegion;
  DrawCircle;
end;

procedure TRVButton.SetButtonColor(Value: TColor);
begin
  if Value <> FButtonColor then
    begin
    FButtonColor := Value;
    Invalidate;
    end;
end;

procedure TRVButton.SetCaption(Value: String);
var
  X: Integer;
  Y: Integer;
begin
  if ((Value <> FCaption) and (Value <> '')) then
    begin
    FCaption := Value;
    end;

  with Canvas.Font do
    begin
    Name := Font.Name;
    Size := Font.Size;
    Style := Font.Style;
    if Self.Enabled then Color := Font.Color
    else                Color := clDkGray;
    end;

  X := (Width div 2) - (Canvas.TextWidth(FCaption) div 2);
  Y := (Height div 2) - (Canvas.TextHeight(FCaption) div 2);
  Canvas.TextOut(X,Y,FCaption);
//  Invalidate;
end;

procedure TRVButton.WMLButtonDown(var Message: TWMLButtonDown);
begin
  if not PtInRegion(FKRgn,Message.xPos,Message.yPos) then exit;
  FLButtonDown := True;
  MoveButton;
  Visible:= False;
      Visible:= True;
  inherited;
end;

procedure TRVButton.WMLButtonUp(var Message: TWMLButtonUp);
begin
  if not FLButtonDown then exit;
  FLButtonDown := False;
  MoveButton;
  Visible:= False;
  Visible:= True;
  inherited;
end;


end.
Avatar billede morten_s Nybegynder
27. januar 2004 - 19:35 #1
Image skal selvfølgelig kunne streches op og ned med knappens størrelse (hvis det er muligt)

Jeg har ikke brug for Caption på knappen så det skal der ikke tages hensyn til
Avatar billede hrc Mester
07. februar 2004 - 16:02 #2
Hej Morten - skal knappen fungere som en TToolButton eller er det mere en TSpeedButton du efterlyser? En TToolButton mener jeg ikke kan stretches idet størrelsen er bestemt af TImageList's height og width.
Avatar billede morten_s Nybegynder
07. februar 2004 - 16:11 #3
Hej hrc
Da der ikke indløb nogle svar har jeg kodet det selv ;-))
Avatar billede hrc Mester
07. februar 2004 - 16:32 #4
Godt, så gider jeg ikke lege videre med komponenten. Det var ikke så svært alligevel, vel? Du må hellere poste et svar så du kan få trukket dine points tilbage igen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester