Entwickler-Ecke

Multimedia / Grafik - Canvas-Linien mehrfarbig?


Mattes - Do 12.06.03 20:33
Titel: Canvas-Linien mehrfarbig?
Hallo,

ist es möglich, Canvas-Linien, die z.Zt.als Uhrzeiger einer analogen Uhr eingesetzt werden, mehrfarbig zu machen?

So soll z.B.ein schwarzumrandeter, weißer Zeiger statt nur einer pixeligen weißen Linie dargestellt werden.

Oder kann man einen Uhrzeiger als Grafik einbinden, die sich mit der Uhrzeit dreht?

Fragen über Fragen - Danke schon mal!


ErnestoChe - Do 12.06.03 21:21

Hi,

klar geht das. Zeichne doch einfach ein schmales Rechteck mit schwarzem Rand und weisser Füllung:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
with Canvas do
begin
  Pen.Color := clBlack;
  Brush.Color := clWhite;
  Rectangle(x, y, x1, y1);
end;


MFG

- Ernesto -


Mattes - Fr 13.06.03 09:26

Hm, funktioniert leider nicht so, wie ich dachte.

So sehen meine Zeiger die zeitabhängig "wandern" aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
with Image4 do begin
    Canvas.Pen.Color := clWhite;
    Canvas.Pen.Width := 4;
    Canvas.Ellipse(00, Width - 0, Height - 0);
    Canvas.Pen.Color := clSilver;
    i := strtoint(FormatDateTime('h',now)) *5;
    Canvas.MoveTo(Width div 2, Height div 2);
    x := trunc(cos(pi/180 * (i * 6 - 90)) * (Width div 3 - 15) + Width div 2);
    y := trunc(sin(pi/180 * (i * 6 - 90)) * (Height div 3 - 15) + Height div 2);
    Canvas.LineTo(X,Y);
  end;


Befinden tun sie sich in einer Ellipse:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
    with Image4 do begin
    Canvas.Ellipse(0,0,Width,height);
    for i := 0 to 59 do begin
      x := trunc(cos(pi/180 * (i * 6 - 90)) * (Width div 2) + Width div 2);
      y := trunc(sin(pi/180 * (i * 6 - 90)) * (Height div 2) + Height div 2);
      Canvas.MoveTo(Width div 2, Height div 2);
      Canvas.LineTo(X,Y);
    end;


Was mache ich falsch, denn entweder wird die Ellipse bunt oder es passiert gar nix neues, wenn ich deinen Code einarbeite? :?:


Moderiert von user profile icontommie-lie: Code- durch Delphi-Tags ersetzt


Andreas Pfau - Mi 18.06.03 19:39

Hallo,

man kann doch kein Rect als Zeiger nehmen *argh*!!! Der Zeiger soll sich doch drehen, dass kann ein Rect nicht.

Ich würde es so machen: Stelle Canvas.Pen.Width auf 3, Color auf schwarz, zeichne den Zeiger. Dann Canvas.Pen.Width auf 2, Farbe weiß, nochmal zeichnen. Fertig, weißer Zeiger mit schwarzem Rand. Sogar leicht abgerundete Enden.


Mattes - Do 19.06.03 15:28

Hm, das funktioniert so irgendwie nicht. Hättest Du mal nen Quelltext, vielleicht mache ich ja was falsch?
:shock:


Andreas Pfau - Do 19.06.03 15:51

Hallo,

klar, gerne:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure DrawBorderedLine(X1, Y1, X2, Y2: Integer; Canvas: TCanvas);
begin
 Canvas.Pen.Width := 5;
 Canvas.Pen.Color := clBlack;
 Canvas.MoveTo(X1, Y1);
 Canvas.LineTo(X2, Y2);

 Canvas.Pen.Width := 2;
 Canvas.Pen.Color := clWhite;
 Canvas.MoveTo(X1, Y1);
 Canvas.LineTo(X2, Y2);
end;

Und zeichnen z.b. mit:

Delphi-Quelltext
1:
 DrawBorderedLine(555025, PaintBox1.Canvas);                    


Die Koordinaten musst du natürlich mit Sin() und Cos() aus der Uhrzeit berechnen, logisch.

Die Werte von "Canvas.Pen.Width" kannst auch verändern, aber der 2. Wert MUSS kleiner sein als der erste.

Moderiert von user profile icontommie-lie: Code- durch Delphi-Tags ersetzt