lazclock: Implements the initial clock control

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2303 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
sekelsenmat 2012-02-20 12:40:28 +00:00
parent 05adebc953
commit 1ba866f87f
3 changed files with 115 additions and 13 deletions

View File

@ -5,9 +5,86 @@ unit clock_control;
interface
uses
Classes, SysUtils;
Classes, SysUtils, Controls, Graphics, LCLType, DateUtils;
type
{ TLazClockControl }
TLazClockControl = class(TCustomControl)
public
BackgroundImage: TPortableNetworkGraphic;
constructor Create(AOwner: TComponent); override;
procedure EraseBackground(DC: HDC); override;
procedure Paint; override;
end;
implementation
constructor TLazClockControl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
BackgroundImage := TPortableNetworkGraphic.Create;
BackgroundImage.LoadFromFile('skins\wallclock1.PNG');
end;
procedure TLazClockControl.EraseBackground(DC: HDC);
begin
// Uncomment this to enable default background erasing
//inherited EraseBackground(DC);
end;
procedure TLazClockControl.Paint;
var
lCurTime: TDateTime;
lHours, lMinutes, lSeconds, lMilliseconds: word;
lPointerAngleMajor, lPointerAngleMinor: Double;
Lmajor, Lminor: Integer; // Size of the pointer, bigger and smaller parts, counting from the clock center
ClockCenter, MajorPos, MinorPos: TPoint;
begin
Canvas.Draw(0, 0, BackgroundImage);
lCurTime := Now();
SysUtils.DecodeTime(lCurTime, lHours, lMinutes, lSeconds, lMilliseconds);
ClockCenter := Point(Width div 2, Height div 2);
// Seconds indicator
lPointerAngleMajor := - 2 * Pi * (lSeconds / 60);
Lmajor := 150;
Lminor := 50;
MinorPos.X := Round(ClockCenter.X + Lminor * Sin(lPointerAngleMajor));
MinorPos.Y := Round(ClockCenter.Y + Lminor * Cos(lPointerAngleMajor));
MajorPos.X := Round(ClockCenter.X - Lmajor * Sin(lPointerAngleMajor));
MajorPos.Y := Round(ClockCenter.Y - Lmajor * Cos(lPointerAngleMajor));
Canvas.Pen.Color := clRed;
Canvas.Pen.Width := 3;
Canvas.Line(MinorPos, MajorPos);
// Minutes indicator
lPointerAngleMajor := - 2 * Pi * (lMinutes / 60);
Lmajor := 120;
Lminor := 30;
MinorPos.X := Round(ClockCenter.X + Lminor * Sin(lPointerAngleMajor));
MinorPos.Y := Round(ClockCenter.Y + Lminor * Cos(lPointerAngleMajor));
MajorPos.X := Round(ClockCenter.X - Lmajor * Sin(lPointerAngleMajor));
MajorPos.Y := Round(ClockCenter.Y - Lmajor * Cos(lPointerAngleMajor));
Canvas.Pen.Color := clBlack;
Canvas.Pen.Width := 5;
Canvas.Line(MinorPos, MajorPos);
// Hours indicator
if lHours > 12 then lHours := lHours - 12;
lPointerAngleMajor := - 2 * Pi * (lHours / 12);
Lmajor := 80;
Lminor := 20;
MinorPos.X := Round(ClockCenter.X + Lminor * Sin(lPointerAngleMajor));
MinorPos.Y := Round(ClockCenter.Y + Lminor * Cos(lPointerAngleMajor));
MajorPos.X := Round(ClockCenter.X - Lmajor * Sin(lPointerAngleMajor));
MajorPos.Y := Round(ClockCenter.Y - Lmajor * Cos(lPointerAngleMajor));
Canvas.Pen.Color := clBlack;
Canvas.Pen.Width := 7;
Canvas.Line(MinorPos, MajorPos);
end;
end.

View File

@ -6,13 +6,14 @@ object Form1: TForm1
Caption = 'LazClock'
ClientHeight = 444
ClientWidth = 400
OnCreate = FormCreate
LCLVersion = '0.9.31'
object Notebook: TNotebook
Left = 0
Height = 400
Top = 44
Width = 400
PageIndex = 1
PageIndex = 0
Align = alBottom
TabOrder = 0
TabStop = True
@ -24,7 +25,7 @@ object Form1: TForm1
Height = 25
Top = 68
Width = 75
Caption = 'btnStart'
Caption = 'Start'
OnClick = btnStartClick
TabOrder = 0
end
@ -33,7 +34,7 @@ object Form1: TForm1
Height = 25
Top = 100
Width = 75
Caption = 'btnStop'
Caption = 'Stop'
OnClick = btnStopClick
TabOrder = 1
end
@ -42,7 +43,7 @@ object Form1: TForm1
Height = 25
Top = 132
Width = 75
Caption = 'btnReset'
Caption = 'Reset'
OnClick = btnResetClick
TabOrder = 2
end
@ -59,16 +60,25 @@ object Form1: TForm1
end
end
object btnCronometer: TButton
Left = 10
Tag = 1
Left = 88
Height = 25
Top = 11
Width = 75
Caption = 'Cronometer'
OnClick = btnCronometerClick
OnClick = HandleChangePage
TabOrder = 1
end
object btnClock: TButton
Left = 8
Height = 25
Top = 11
Width = 75
Caption = 'Clock'
OnClick = HandleChangePage
TabOrder = 2
end
object timerClock: TTimer
Enabled = False
OnTimer = timerClockTimer
left = 312
top = 110

View File

@ -6,7 +6,8 @@ interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, DateUtils;
ExtCtrls, DateUtils,
clock_control;
type
@ -17,20 +18,23 @@ type
btnStart: TButton;
btnStop: TButton;
btnReset: TButton;
btnClock: TButton;
labelCronometer: TLabel;
Notebook: TNotebook;
Page1: TPage;
pageCronometer: TPage;
timerCronometer: TTimer;
timerClock: TTimer;
procedure btnCronometerClick(Sender: TObject);
procedure HandleChangePage(Sender: TObject);
procedure btnResetClick(Sender: TObject);
procedure btnStartClick(Sender: TObject);
procedure btnStopClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure timerClockTimer(Sender: TObject);
procedure timerCronometerTimer(Sender: TObject);
private
{ private declarations }
LazClockControl: TLazClockControl;
public
{ public declarations }
CronometerStarted: Boolean;
@ -48,7 +52,7 @@ implementation
procedure TForm1.timerClockTimer(Sender: TObject);
begin
LazClockControl.Invalidate;
end;
procedure TForm1.timerCronometerTimer(Sender: TObject);
@ -64,9 +68,9 @@ begin
labelCronometer.Caption := SysUtils.TimeToStr(CronometerTime, lFormatSettings);
end;
procedure TForm1.btnCronometerClick(Sender: TObject);
procedure TForm1.HandleChangePage(Sender: TObject);
begin
Notebook.PageIndex := 1;
Notebook.PageIndex := (Sender as TButton).Tag;
end;
procedure TForm1.btnResetClick(Sender: TObject);
@ -87,5 +91,16 @@ begin
timerCronometer.Enabled := False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
LazClockControl := TLazClockControl.Create(Self);
LazClockControl.Height := 400;
LazClockControl.Width := 400;
LazClockControl.Top := 0;
LazClockControl.Left := 0;
LazClockControl.Parent := Notebook.Page[0];
LazClockControl.DoubleBuffered := True;
end;
end.