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:
parent
05adebc953
commit
1ba866f87f
@ -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.
|
||||
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user