프로그래밍 노트

[델파이] 동그란 버튼 만들기(원형 버튼 만들기) 본문

델파이

[델파이] 동그란 버튼 만들기(원형 버튼 만들기)

떡잎 2010. 1. 15. 20:22


원본소스 링크 : Torry's Delphi Pages


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

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;
  inherited;
end;

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


end.




그냥 가져다가 쓰니까 돌아가는 것만 확인
이 소스에 문제가 있는지 없는지는 각자 판단해서 사용해야될 것같음
 

Comments