Witam,
w jaki sposób obrócić zegar o 180* wg. poniższego kodu? Zegar musi również chodzić prawidłowo względem obróconej pozycji.
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TClockOptions = packed record
HourWidth: Integer;
HourColor: TColor;
HourStyle: TPenStyle;
MinuteWidth: Integer;
MinuteColor: TColor;
MinuteStyle: TPenStyle;
SecondWidth: Integer;
SecondColor: TColor;
SecondStyle: TPenStyle;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure DrawAnalogClock(T: TDateTime; Canvas: TCanvas; R, Left, Top: Integer; Options: TClockOptions);
var
h, m, s, x, y: Integer;
begin
h := StrToInt(FormatDateTime('h', T));
m := StrToInt(FormatDateTime('n', T));
s := StrToInt(FormatDateTime('s', T));
Canvas.MoveTo(Left + R, Top + R);
x := Round(cos(PI * (30 * h + (m / 2) - 90) / 180) * (R - (R / 100 * 30)) + Left + R);
y := Round(sin(PI * (30 * h + (m / 2) - 90) / 180) * (R - (R / 100 * 30)) + Top + R);
Canvas.Pen.Width := Options.HourWidth;
Canvas.Pen.Color := Options.HourColor;
Canvas.Pen.Style := Options.HourStyle;
Canvas.LineTo(x, y);
Canvas.MoveTo(Left + R, Top + R);
x := Round(cos(PI * (6 * m - 90) / 180) * (R - (R / 100 * 10)) + Left + R);
y := Round(sin(PI * (6 * m - 90) / 180) * (R - (R / 100 * 10)) + Top + R);
Canvas.Pen.Width := Options.MinuteWidth;
Canvas.Pen.Color := Options.MinuteColor;
Canvas.Pen.Style := Options.MinuteStyle;
Canvas.LineTo(x, y);
Canvas.MoveTo(Left + R, Top + R);
x := Round(cos(PI * (6 * s - 90) / 180) * (R - (R / 100 * 10)) + Left + R);
y := Round(sin(PI * (6 * s - 90) / 180) * (R - (R / 100 * 10)) + Top + R);
Canvas.Pen.Width := Options.SecondWidth;
Canvas.Pen.Color := Options.SecondColor;
Canvas.Pen.Style := Options.SecondStyle;
Canvas.LineTo(x, y);
end;
procedure DrawClockShield(Canvas: TCanvas; R, Left, Top, Width: Integer; Color: TColor);
var
x1, y1, x2, y2, i: Integer;
begin
Canvas.Pen.Width := Width;
Canvas.Pen.Color := Color;
i := 0;
while i < 360 do
begin
x1 := Round(cos(PI * i / 180) * R + Left + R);
y1 := Round(sin(PI * i / 180) * R + Top + R);
x2 := Round(cos(PI * i / 180) * (R - (R / 100 * 7)) + Left + R);
y2 := Round(sin(PI * i / 180) * (R - (R / 100 * 7)) + Top + R);
Canvas.MoveTo(x1, y1);
Canvas.LineTo(x2, y2);
i := i + 30;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
Options: TClockOptions; // Deklarujemy zmienną z opcjami zegara
begin
Repaint; // Czyścimy canvas formy
Options.HourWidth := 2;
Options.HourColor := clBlack;
Options.HourStyle := psSolid;
Options.SecondWidth := 1;
Options.SecondColor := clRed;
Options.SecondStyle := psSolid;
Options.MinuteWidth := 2;
Options.MinuteColor := clBlack;
Options.MinuteStyle := psSolid;
DrawClockShield(Canvas, 100, 20, 20, 4, clBlack);
// Rysujemy tarczę zegarową na płótnie formy kolorem czarnym i grubości 4 pikseli. Promień 100 pikseli, pozycja x i y 20 pikseli.
DrawAnalogClock(Time, Canvas, 100, 20, 20, Options);
// Rysujemy zegar z aktualnym czasem na płótnie formy. Promień 100 pikseli, pozycja x i y 20 pikseli.
Caption := FormatDateTime('h:nn:ss', Time); // Wyświetlenie czasu w tytule formy
end;
end.
I drugie pytanie, jak zrobić, aby nad każdą godziną była cyfra z godziną? Canvas.TextOut... Dopiero się uczę rysować na canvasie, więc proszę o pomoc.
Czy jest jeszcze jakiś prostszy sposób na rysowanie zegara analogowego?