Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Graphic Control um 90 grad drehen (https://www.delphipraxis.net/102891-graphic-control-um-90-grad-drehen.html)

PAS_pro 6. Nov 2007 15:51


Graphic Control um 90 grad drehen
 
Ich muß ein Graphic Control (Canvas) um 90 Grad drehen und dieses Canvas wird zur Laufzeit ungefähr 25 mal pro Sekunde neu gezeichnet!!!

Gemeint ist nicht eine Bitmap oder JPG die um 90 Grad gedreht werden soll (dazu gibt es ja jede Menge Lösungen hier im Forum)

Für Hilfe oder Anregungen wäre ich sehr dankbar

Deep-Sea 6. Nov 2007 16:09

Re: Graphic Control um 90 grad drehen
 
Vlt. hilft dir die Win-API Funktion "SetWorldTransform" weiter ...

PAS_pro 6. Nov 2007 16:32

Re: Graphic Control um 90 grad drehen
 
kannst du das konkretisieren
oder
besser noch ein demo source code beifügen

vielen dank im voraus

Deep-Sea 7. Nov 2007 07:18

Re: Graphic Control um 90 grad drehen
 
In der Hilfe von Delphi solltest du darüber etwas finden. Oder im MSDN ...

Google + SetWorldTransform :wink:
http://www.codeproject.com/gdi/setworldtransform().asp

Deep-Sea 7. Nov 2007 08:04

Re: Graphic Control um 90 grad drehen
 
Für die Faulen hab ich mal kurz ein Bsp.
Auf der Form befinden sich nur eine PaintBox und ein SpinEdit (was den Winkel angibt).

Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  XF: TXForm;
  x0, y0: Integer;
  q: Double;
begin
  x0 := PaintBox1.Width div 2;
  y0 := PaintBox1.Height div 2;
  q := SpinEdit1.Value / 180 * 3.1415926;

  XF.eM11 := cos(q);
  XF.eM12 := sin(q);
  XF.eM21 := -sin(q);
  XF.eM22 := cos(q);
  XF.eDx := x0 - cos(q) * x0 + sin(q) * y0;
  XF.eDy := y0 - cos(q) * y0 - sin(q) * x0;

  With PaintBox1.Canvas do
  begin
    SetGraphicsMode(Handle, GM_ADVANCED);
    SetWorldTransform(Handle, XF);

    Rectangle(x0 - 20, y0 - 10, x0 + 20, y0 + 10);
  end;
end;

procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
  PaintBox1.Repaint;
end;
Wie gesagt, nur ein schnell zusammengebasteltes Beispiel. Aber wem's Hilft :P

PAS_pro 8. Nov 2007 13:06

Re: Graphic Control um 90 grad drehen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank Deep-Sea
für den demo source code, aber leider bringt er nicht den gewünschten Effekt.
Es dreht sich nur der Inhalt der Komponente aber nicht die gesamte Komponente. Ich habe ein kleines demo progrämchen beigefügt, wo du es sehr schön sehen kannst.

und hier der quell code im program:

procedure TForm1.MMLevel1Paint(Sender: TObject);
var
XF: TXForm;
x0, y0: Integer;
q: Double;
begin
x0 := MMLevel1.Width div 2;
y0 := MMLevel1.Height div 2;
q := SpinEdit1.Value / 180 * 3.1415926;

XF.eM11 := cos(q);
XF.eM12 := sin(q);
XF.eM21 := -sin(q);
XF.eM22 := cos(q);
XF.eDx := x0 - cos(q) * x0 + sin(q) * y0;
XF.eDy := y0 - cos(q) * y0 - sin(q) * x0;

With MMLevel1.Canvas do
begin
SetGraphicsMode(Handle, GM_ADVANCED);
SetWorldTransform(Handle, XF);
// Rectangle(x0 - 20, y0 - 10, x0 + 20, y0 + 10);
// habe ich nicht aufgerufen (bringt natürlich auch nichts)
end;

end;
procedure TForm1.SpinEdit1Change(Sender: TObject);
begin
MMLevel1.Repaint;
PaintBox1.Repaint;
end;

Deep-Sea 8. Nov 2007 13:13

Re: Graphic Control um 90 grad drehen
 
Zitat:

Zitat von PAS_pro
Vielen Dank Deep-Sea
für den demo source code, aber leider bringt er nicht den gewünschten Effekt.
Es dreht sich nur der Inhalt der Komponente aber nicht die gesamte Komponente.

Bei einem TGraphicControl sollte dies doch keinen großen unterschied machen, oder was genau hast du vor?
(PS: Wenn schon eine Exe, dann bitte ohne RTL :wink:)

PAS_pro 8. Nov 2007 13:25

Re: Graphic Control um 90 grad drehen
 
ich will das sich die ganze komponente dreht, genauso wie die PaintBox1.
was mache ich den falsch

Deep-Sea 8. Nov 2007 13:27

Re: Graphic Control um 90 grad drehen
 
Zitat:

Zitat von PAS_pro
ich will das sich die ganze komponente dreht, genauso wie die PaintBox1.
was mache ich den falsch

Ya was passiert denn?
Häng das Projekt noch mal ohne RTL an (oder als Source) ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz