From 1ba866f87f9768c1c7f1dfa864bb28932682042e Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Mon, 20 Feb 2012 12:40:28 +0000 Subject: [PATCH] lazclock: Implements the initial clock control git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2303 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- applications/lazclock/clock_control.pas | 79 ++++++++++++++++++++++++- applications/lazclock/mainform.lfm | 24 +++++--- applications/lazclock/mainform.pas | 25 ++++++-- 3 files changed, 115 insertions(+), 13 deletions(-) diff --git a/applications/lazclock/clock_control.pas b/applications/lazclock/clock_control.pas index dd949aa5e..379b5797a 100644 --- a/applications/lazclock/clock_control.pas +++ b/applications/lazclock/clock_control.pas @@ -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. diff --git a/applications/lazclock/mainform.lfm b/applications/lazclock/mainform.lfm index 47b81f65e..f4f36b72a 100644 --- a/applications/lazclock/mainform.lfm +++ b/applications/lazclock/mainform.lfm @@ -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 diff --git a/applications/lazclock/mainform.pas b/applications/lazclock/mainform.pas index ac455bd7f..0d336fb4b 100644 --- a/applications/lazclock/mainform.pas +++ b/applications/lazclock/mainform.pas @@ -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.