Ist sowas mit Canvas möglich?
-
- Beiträge: 576
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 2.2.6
- CPU-Target: 32+64bit
- Wohnort: Dresden
Ist sowas mit Canvas möglich?
Hallo
ich möchte gern so etwas machen wie in den Bildern zu sehen ist. Außerdem sollen 2 Zeiger, einer für IST und einer für SOLL, eingezeichnet werden und sich bewegen.
Ist das überhaupt möglich?
LG Maik
ich möchte gern so etwas machen wie in den Bildern zu sehen ist. Außerdem sollen 2 Zeiger, einer für IST und einer für SOLL, eingezeichnet werden und sich bewegen.
Ist das überhaupt möglich?
LG Maik
LG Maik
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Re: Ist sowas mit Canvas möglich?
Klar ist das möglich. Du kannst auf den Canvas malen was du willst.
Du kannst auch gleich das Bild als Hintergrund nehmen und dann nur noch den Zeiger drauf malen.
Du kannst auch gleich das Bild als Hintergrund nehmen und dann nur noch den Zeiger drauf malen.
-
- Beiträge: 576
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 2.2.6
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: Ist sowas mit Canvas möglich?
Ok danke, und wie? Gibt es ein Canvas Tutorial oder so? Scripte für ne Uhr wurden hier im Forum schon behandelt. Als Grundlage zum spielen würde ich mir so ein Script nehmen.
Kann mir jemand da noch ein paar Tipps geben wie ich das mit den Zahlen usw. machen kann?
Kann mir jemand da noch ein paar Tipps geben wie ich das mit den Zahlen usw. machen kann?
LG Maik
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Re: Ist sowas mit Canvas möglich?
z.B. das:
http://wiki.freepascal.org/Drawing_with_canvas/de
http://www.hh.schule.de/hhs/delphi/Graf ... elphi1.pdf
Bei der Textausgabe (mit Canvas.TextOut(x,y, text)) ist zu beachten, dass am Ort (x,y) die linke obere Ecke des Textes liegt. Du musst alse die Position jeder Zahl separat korrigieren. Dazu brauchst du sicher etwas geometirsches Verständnis, sowie das Wissen, dass Canvas.TextWidth(text) die Breite und Canvas.TextHeight(text) die Höhe eines Textes ermitteln (in Pixeln),
http://wiki.freepascal.org/Drawing_with_canvas/de
http://www.hh.schule.de/hhs/delphi/Graf ... elphi1.pdf
Bei der Textausgabe (mit Canvas.TextOut(x,y, text)) ist zu beachten, dass am Ort (x,y) die linke obere Ecke des Textes liegt. Du musst alse die Position jeder Zahl separat korrigieren. Dazu brauchst du sicher etwas geometirsches Verständnis, sowie das Wissen, dass Canvas.TextWidth(text) die Breite und Canvas.TextHeight(text) die Höhe eines Textes ermitteln (in Pixeln),
-
- Beiträge: 576
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 2.2.6
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: Ist sowas mit Canvas möglich?
Danke für die Links und die Hinweise.
So habe jetzt mal ein Uhren Script angepasst. Leider bekomme ich das mit dem Rechtecken nicht so hin wie im Beispielbild oben.
Wie bekomme ich den schwarzen Rahmen um die Roten Kreise weg? Wie kann ich die kanten glätten?
So habe jetzt mal ein Uhren Script angepasst. Leider bekomme ich das mit dem Rechtecken nicht so hin wie im Beispielbild oben.
Wie bekomme ich den schwarzen Rahmen um die Roten Kreise weg? Wie kann ich die kanten glätten?
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Timer1: TTimer;
procedure DrawHands;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
xcenter:integer = 80;
ycenter:integer = 80;
lastxs,lastys,lastxm,lastym,lastxh,lastyh:integer;
clockbg: tbitmap;
scond, minute, hour: integer;
implementation
{$R *.lfm}
{ TForm1 }
procedure Tform1.DrawHands();
var
HH,MM,SS,MS: Word;
xhour, yhour, xminute, yminute, xsecond, ysecond, second, minute, hour: Integer;
cSecond, cMinute, cHour: TColor;
begin
// hand colors
cSecond:=clGreen;
cMinute:=clBlue;
cHour:=clRed;
// get the time
DecodeTime(Time,HH,MM,SS,MS);
second:=SS;
minute:=MM;
hour:=HH;
// calculation of (x, y) points where the hands will point to
xsecond := round(cos(second * pi / 30 - pi / 2) * 80 + xcenter);
ysecond := round(sin(second * pi / 30 - pi / 2) * 80 + ycenter);
xminute := round(cos(minute * pi / 30 - pi / 2) * 60 + xcenter);
yminute := round(sin(minute * pi / 30 - pi / 2) * 60 + ycenter);
xhour := round(cos((hour * 30 + minute / 2) * pi / 180 - pi / 2) * 40 + xcenter);
yhour := round(sin((hour * 30 + minute / 2) * pi / 180 - pi / 2) * 40 + ycenter);
with Canvas do begin
// drawing the hands
pen.Color:=cSecond;
Line(xcenter, ycenter, xsecond, ysecond);
pen.Color:=cMinute;
Line(xcenter, ycenter - 1, xminute, yminute);
Line(xcenter - 1, ycenter, xminute, yminute);
pen.Color:=cHour;
Line(xcenter, ycenter - 1, xhour, yhour);
Line(xcenter - 1, ycenter, xhour, yhour);
end;
// some info we can use later...
lastxs := xsecond;
lastys := ysecond;
lastxm := xminute;
lastym := yminute;
lastxh := xhour;
lastyh := yhour;
end;
procedure TForm1.FormCreate(Sender: TObject);
var a,b,c: integer;
begin
clockbg:=tbitmap.Create;
clockbg.SetSize(160,160);
with clockbg.Canvas do begin
// background clearing
Brush.Color:=RGBToColor(0,90,82);
FillRect(0,0,160,160);
// clock area
Brush.Color:=clWhite;
Ellipsec(xcenter, ycenter, 160, 160);
// draw numbers...
Font.Color:=clBlack;
Font.Size:=8;
Brush.Style:=bsClear;
b:=1;
c:=30;
while b <= 11 do
begin
TextOut(round(cos((b*30)*pi/180-pi/2)*68+xcenter-10),
round(sin((b*30)*pi/180-pi/2)*68+ycenter-7), IntToStr(c));
b:=b+1;
c:=c+30;
end;
TextOut(round(cos((12*30)*pi/180-pi/2)*68+xcenter-10),
round(sin((12*30)*pi/180-pi/2)*68+ycenter-7), '0');
// draw the red circle
Brush.Style:=bsSolid;
Brush.Color:=clRed;
a:=1;
while a <= 12 do
begin
EllipseC(
round(cos((a*30)*pi/180-pi/2)*50+xcenter),
round(sin((a*30)*pi/180-pi/2)*50+ycenter),
4,4);
a:=a+1;
end;
// draw the black dots
Brush.Style:=bsSolid;
Brush.Color:=clBlack;
a:=1;
while a <= 36 do
begin
Rectangle(
round(cos((a*10)*pi/180-pi/2)*48+xcenter),
round(sin((a*10)*pi/180-pi/2)*48+ycenter),
round(cos((a*10)*pi/180-pi/2)*52+xcenter),
round(sin((a*10)*pi/180-pi/2)*52+ycenter)
);
a:=a+1;
end;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if clockbg <> nil then
FreeAndNil(clockbg);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if clockbg <> nil then begin
Canvas.Draw(0,0,clockbg);
//DrawHands;
end;
end;
end.
LG Maik
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
-
- Beiträge: 168
- Registriert: Sa 8. Okt 2016, 08:38
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Polska
Re: Ist sowas mit Canvas möglich?
@sstvmaster
Danke für das Posten des Codes!
Ich habe mal für ein Programm eine Analoge Uhr machen wollen, aber die ganze Mathematik dahinter ist mir zu hoch.
Deswegen habe ich mit einer Funktion (die habe ich aus dem Internet) mehrere Grafiken für verschiedenen Einheiten genommen und sie entsprechend gedreht.
Jetzt kann ich mir eine bessere Funktion bauen.
Danke für das Posten des Codes!
Ich habe mal für ein Programm eine Analoge Uhr machen wollen, aber die ganze Mathematik dahinter ist mir zu hoch.
Deswegen habe ich mit einer Funktion (die habe ich aus dem Internet) mehrere Grafiken für verschiedenen Einheiten genommen und sie entsprechend gedreht.
Jetzt kann ich mir eine bessere Funktion bauen.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
-
- Beiträge: 6194
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Ist sowas mit Canvas möglich?
Wie bekomme ich den schwarzen Rahmen um die Roten Kreise weg?
Code: Alles auswählen
Canvas.Pen.Color := clRed;
Canvas.Brush.Color := clRed;
Canvas.Ellipse(100, 100, 200, 200);
Brush isr die Füllfarbe und Pen ist die Farbe des Randes.
Ich täte für die Uhr eine eigene Komponenten machen, welche von einem Panel abgeleitet ist.
So etwa, wie ich es im Anhang gemacht habe.
Das ist nach meiner Meinung viel eleganter und flexibler.
- Dateianhänge
-
- Roulett.zip
- (65.57 KiB) 115-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 576
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 2.2.6
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: Ist sowas mit Canvas möglich?
Danke euch, aber eigentlich will ich keine Uhr, sondern so etwas wie in den beiden Bildern zu sehen ist. Ich habe da Uhren Script nur als Beispiel genommen um einen Anfang für mein Script zu haben.
LG Maik
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
-
- Beiträge: 168
- Registriert: Sa 8. Okt 2016, 08:38
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Polska
Re: Ist sowas mit Canvas möglich?
Das weiß ich auch.
Aber du willst ja einen analogen Zeiger, wenn du so was wie auf den Bildern machen willst, dann ist das Prinzip das selbe.
Aber du willst ja einen analogen Zeiger, wenn du so was wie auf den Bildern machen willst, dann ist das Prinzip das selbe.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!
-
- Beiträge: 6194
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Ist sowas mit Canvas möglich?
um einen Anfang für mein Script zu haben.
Meinst du wirklich Script, oder einfach einen Quellcode ?
sondern so etwas wie in den beiden Bildern zu sehen ist.
Hast du meine Anhang mal angeguckt ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: Ist sowas mit Canvas möglich?
Sieht ja schon mal ganz gut aus! Was noch nicht richtig ist, dass du das OnPaint-Event des Formulars nicht verwendest, um die Uhr auszugeben. Diese wird zwar jeweils vom Timer in einem bestimmten Intervall jeweils neu gezeichnet. Wenn du dazwischen aber ein anderes Fenster über die Uhr und wieder wegschiebst, verschwindet die Uhr bis zum nächsten Timer-Event. Grundregel muss immer sein: Zeichnen nur im OnPaint-Event, und im OnTimer-Event würde ich nicht direkt Zeichen-Operationen aufrufen, sondern das OnPaint-Event generieren, indem ich Invalidate aufrufe (oder Refresh, oder Repaint).
Der schwarze Rand um die roten Punkte ist die Farbe den Pen, der von dir nicht verändert wurde, also noch auf schwarz steht. Setze entweder Pen.Color auf dieselbe Farbe wie Brush.Color, oder setze Pen.Style auf psClear (kein Rand).
Was meinst du mit den "Rechtecken"?
Bei der Erstellung des Uhrenhintergrunds in FormCreate gefallen mir die "magischen" Zahlen 160, 68, 10, 7 nicht. Dass 160 der Durchmesser des Ziffernblattes ist, geht wahrscheinlich an allen möglichen Stellen in die Rechnung ein - du hast extrem viel Arbeit, wenn du mal die Uhr größer ausgeben willst! Nimm stattdessen eine Variable (Radius) und setze sie zu beginn auf 80. 68 ist wahrscheinlich (ich muss es ahnen...) die Breite einer Beschriftung - dieser Wert stimmt jetzt schon nicht für alle Stunden, aber definitiv nicht, wenn du aus irgendeinem Grund später die Schrift größer machst. Du kannst aber mit w := Canvas.TextWidth(IntToStr(c)) die Breite jeder einzelnen Beschriftung berechnen (w ist ein Integer, c der Stundenwert). Genauso findest du mit h := Canvas.TextHeight(IntToStr(c)) die Höhe jeder Zahl (wobei diese immer gleich ist, es reicht also h := Canvas.TextHeight('0') zu nehmen).
Wie ich geschrieben habe, musst du für jede Stunde die genaue Position des Textbeginns (linke obere Ecke) einzeln berechnen. Dazu nimmst du am einfachsten eine große case-Anweisung, in der du dir jede Stunde einzeln vornimmst. Zunächst legst du den Radius des Kreises fest, an dem der Stunden-Text "anliegt", RText := Radius + 10 (um 10 Pixel größer als der Ziffernblatt-Radius, oder so - den Ziffernblatt-Radius sehe ich durch die Position der roten und schwarzen Punkte definiert; idealerweise deklarierst du die 10 noch als Konstante (z.B. const TEXT_ABSTAND = 10; RText := Radius + TEXT_ABSTAND) zu Beginn deines Codes, damit wird's sehr übersichtlich und lesbar).
Zuerst die einfachen Fälle:
Die Stunde ganz oben (0 bzw. 12) ist horizontal zentriert und um 1 Texthöhe nach oben geschoben. Wenn x und y die Position des Textankers in der linken oberen Text-Ecke bezeichnen, gilt hier: x := xcenter - w div 2; y := ycenter - RText - h
Die Stunde ganz unten (6) ist ebenfalls horizontal zentriert, aber der vertikale Textanker ist schon richtig: x := xcenter - w div 2; y := yCenter + RText
Die Stunde ganz rechts (3) ist vertikal zentriert und linksbündig, d.h. der Text beginnt direkt an der richtigen Stelle: x := xcenter + RText; y := ycenter - h div 2
Die Stunde ganz links (9) ist ebenfalls vertikal zentriert, aber rechtsbündig, d.h der Textanker liegt um 1 Textbreite weiter links: x := xcenter - RText - w; y := ycenter - h div 2
Die Stunden dazwischen sind schwierig, ich würde mal ausprobieren, wie es aussieht, wenn die Ecken des Texts am Anfangspunkt liegen. Die Rechnung überlasse ich dir, dass du sin und cos verwenden musst, hast du ja schon erkannt.
Insgesamt (ich nehme für x und y einen TPoint-Record damit kriege ich die beiden x und y Anweisungen in 1 Zeile:
Code: Alles auswählen
procedure TForm1.FormPaint(Sender: TObject);
begin
if clockbg <> nil then
Canvas.Draw(0, 0, clockbg);
end;
procedure TForm1.TimerTimer(Sender: TObject);
begin
Invalidate;
end;
Der schwarze Rand um die roten Punkte ist die Farbe den Pen, der von dir nicht verändert wurde, also noch auf schwarz steht. Setze entweder Pen.Color auf dieselbe Farbe wie Brush.Color, oder setze Pen.Style auf psClear (kein Rand).
Was meinst du mit den "Rechtecken"?
Bei der Erstellung des Uhrenhintergrunds in FormCreate gefallen mir die "magischen" Zahlen 160, 68, 10, 7 nicht. Dass 160 der Durchmesser des Ziffernblattes ist, geht wahrscheinlich an allen möglichen Stellen in die Rechnung ein - du hast extrem viel Arbeit, wenn du mal die Uhr größer ausgeben willst! Nimm stattdessen eine Variable (Radius) und setze sie zu beginn auf 80. 68 ist wahrscheinlich (ich muss es ahnen...) die Breite einer Beschriftung - dieser Wert stimmt jetzt schon nicht für alle Stunden, aber definitiv nicht, wenn du aus irgendeinem Grund später die Schrift größer machst. Du kannst aber mit w := Canvas.TextWidth(IntToStr(c)) die Breite jeder einzelnen Beschriftung berechnen (w ist ein Integer, c der Stundenwert). Genauso findest du mit h := Canvas.TextHeight(IntToStr(c)) die Höhe jeder Zahl (wobei diese immer gleich ist, es reicht also h := Canvas.TextHeight('0') zu nehmen).
Wie ich geschrieben habe, musst du für jede Stunde die genaue Position des Textbeginns (linke obere Ecke) einzeln berechnen. Dazu nimmst du am einfachsten eine große case-Anweisung, in der du dir jede Stunde einzeln vornimmst. Zunächst legst du den Radius des Kreises fest, an dem der Stunden-Text "anliegt", RText := Radius + 10 (um 10 Pixel größer als der Ziffernblatt-Radius, oder so - den Ziffernblatt-Radius sehe ich durch die Position der roten und schwarzen Punkte definiert; idealerweise deklarierst du die 10 noch als Konstante (z.B. const TEXT_ABSTAND = 10; RText := Radius + TEXT_ABSTAND) zu Beginn deines Codes, damit wird's sehr übersichtlich und lesbar).
Zuerst die einfachen Fälle:
Die Stunde ganz oben (0 bzw. 12) ist horizontal zentriert und um 1 Texthöhe nach oben geschoben. Wenn x und y die Position des Textankers in der linken oberen Text-Ecke bezeichnen, gilt hier: x := xcenter - w div 2; y := ycenter - RText - h
Die Stunde ganz unten (6) ist ebenfalls horizontal zentriert, aber der vertikale Textanker ist schon richtig: x := xcenter - w div 2; y := yCenter + RText
Die Stunde ganz rechts (3) ist vertikal zentriert und linksbündig, d.h. der Text beginnt direkt an der richtigen Stelle: x := xcenter + RText; y := ycenter - h div 2
Die Stunde ganz links (9) ist ebenfalls vertikal zentriert, aber rechtsbündig, d.h der Textanker liegt um 1 Textbreite weiter links: x := xcenter - RText - w; y := ycenter - h div 2
Die Stunden dazwischen sind schwierig, ich würde mal ausprobieren, wie es aussieht, wenn die Ecken des Texts am Anfangspunkt liegen. Die Rechnung überlasse ich dir, dass du sin und cos verwenden musst, hast du ja schon erkannt.
Insgesamt (ich nehme für x und y einen TPoint-Record damit kriege ich die beiden x und y Anweisungen in 1 Zeile:
Code: Alles auswählen
var
P: TPoint;
w: Integer;
h: Integer;
...
w := Canvas.TextWidth(IntToStr(c));
h := Canvas.TextHeight('0'); // ist für alle Werte gleich
case c of
0: P := Point(xcenter - w div 2, ycenter - RText - h);
1: // ... von dir zu lösen...
2: // ... von dir zu lösen...
3: P := Point(xcenter + RText, ycenter - h div 2);
// ... etc bis 11
end;
Canvas.TextOut(P.X, P.Y, IntToStr(c));
-
- Beiträge: 576
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 2.2.6
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: Ist sowas mit Canvas möglich?
Dankeschön, habe mal noch weiter gemacht. Elevation hab ich noch nicht gemacht.
nochmal ich möchte keine UHR programmieren. Das soll für eine Satellitensteuerung sein.
360° für Azimuth 90° für Elevation.
nochmal ich möchte keine UHR programmieren. Das soll für eine Satellitensteuerung sein.
360° für Azimuth 90° für Elevation.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Image1: TImage;
procedure DrawHands;
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
xcenter:integer = 80;
ycenter:integer = 80;
clockbg: tbitmap;
implementation
{$R *.lfm}
{ TForm1 }
procedure Tform1.DrawHands();
var
AZist, AZsoll, xAZist, yAZist, xAZsoll, yAZsoll: Integer;
begin
// get the time
AZist:=45;
AZsoll:=225;
// calculation of (x, y) points where the hands will point to
xAZist := round(cos(AZist*pi/180-pi/2)*40+xcenter);
yAZist := round(sin(AZist*pi/180-pi/2)*40+ycenter);
xAZsoll := round(cos(AZsoll*pi/180-pi/2)*40+xcenter);
yAZsoll := round(sin(AZsoll*pi/180-pi/2)*40+ycenter);
with Image1.Canvas do begin
// AZ ist
pen.Color:=clLime;
pen.Width:=2;
Line(xcenter, ycenter, xAZist, yAZist);
//AZ soll
pen.Color:=clBlack;
pen.width:=2;
Line(xcenter, ycenter, xAZsoll, yAZsoll);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var a,b,c,d: integer;
begin
clockbg:=tbitmap.Create;
clockbg.SetSize(160,160);
with clockbg.Canvas do begin
// background clearing
// Brush.Color:=RGBToColor(0,90,82);
FillRect(0,0,160,160);
// clock area
Brush.Color:=clWhite;
// Ellipsec(xcenter, ycenter, 160, 160);
// draw numbers...
Font.Color:=clBlack;
Font.Size:=8;
Brush.Style:=bsClear;
b:=1;
c:=30;
while b <= 11 do
begin
TextOut(round(cos((b*30)*pi/180-pi/2)*68+xcenter-10),
round(sin((b*30)*pi/180-pi/2)*68+ycenter-7), IntToStr(c));
b:=b+1;
c:=c+30;
end;
TextOut(round(cos((12*30)*pi/180-pi/2)*68+xcenter-10),
round(sin((12*30)*pi/180-pi/2)*68+ycenter-7), '0');
// draw the red circle
Pen.Color:=clRed;
Brush.Style:=bsSolid;
Brush.Color:=clRed;
a:=1;
while a <= 12 do
begin
EllipseC(
round(cos((a*30)*pi/180-pi/2)*50+xcenter),
round(sin((a*30)*pi/180-pi/2)*50+ycenter),
4,4);
a:=a+1;
end;
// draw the black dots
Pen.Color:=clBlack;
Brush.Style:=bsSolid;
Brush.Color:=clBlack;
a:=1;
d:=1;
while a <= 36 do
begin
if (a=d*3) then
begin
Pen.Color:=clRed;
d:=d+1;
end
else Pen.Color:=clBlack;
Rectangle(
round(cos((a*10)*pi/180-pi/2)*50+xcenter+1),
round(sin((a*10)*pi/180-pi/2)*50+ycenter-1),
round(cos((a*10)*pi/180-pi/2)*50+xcenter-1),
round(sin((a*10)*pi/180-pi/2)*50+ycenter+1)
);
a:=a+1;
end;
end;
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
if clockbg <> nil then
FreeAndNil(clockbg);
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
if clockbg <> nil then begin
Image1.Canvas.Draw(0,0,clockbg);
DrawHands;
end;
end;
end.
LG Maik
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
-
- Beiträge: 576
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 2.2.6
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: Ist sowas mit Canvas möglich?
Kann ich auch was in Form.Create steht eigentlich auch in eine procedure stecken? Habe es schon probiert aber das Bild wird nicht gezeichnet!
LG Maik
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)
Re: Ist sowas mit Canvas möglich?
sstvmaster hat geschrieben:Kann ich auch was in Form.Create steht eigentlich auch in eine procedure stecken? Habe es schon probiert aber das Bild wird nicht gezeichnet!
Natürlich. Aber du musst die Prozedur natürlich auch aufrufen.
sstvmaster hat geschrieben:nochmal ich möchte keine UHR programmieren. Das soll für eine Satellitensteuerung sein.
360° für Azimuth 90° für Elevation.
Kein Grund herumzuschreien. Ist doch egal, ob die Labels mit 0-11 beschriftet sind, oder mit 0-330.
-
- Beiträge: 168
- Registriert: Sa 8. Okt 2016, 08:38
- OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
- CPU-Target: xxBit
- Wohnort: Polska
Re: Ist sowas mit Canvas möglich?
Die Frage würde mich auch mal interessieren.
Habe es ausprobiert und wenn ich einen Knopf mit folgendem Code erstelle 'Form1.Canvas.Draw(0,0,clockbg);' wird der Inhalt von 'clockbg'gezeichnen.
ROFL
Das Ziel ist egal. Die Funktion kann man für beides verwenden.
Habe es ausprobiert und wenn ich einen Knopf mit folgendem Code erstelle 'Form1.Canvas.Draw(0,0,clockbg);' wird der Inhalt von 'clockbg'gezeichnen.
sstvmaster hat geschrieben:nochmal ich möchte keine UHR programmieren. Das soll für eine Satellitensteuerung sein.
360° für Azimuth 90° für Elevation.
ROFL
Das Ziel ist egal. Die Funktion kann man für beides verwenden.
Jeder der sagt, ich könnte programmieren, der hat noch weniger Ahnung vom programmieren als ich!!!