![]() |
GDI+ RotateTransform - Problem im eigenen Objekt
Hallo community,
Ich arbeite z.Zt. mit Delphi XE2 an einem Objekt, das ich mit IGDI+ zeichne. Nun möchte ich mein Objekt auch Drehen können. Das also z.B. eine Linie die zuvor gerade , 200Pixel Lang und 20 Pixel hoch, war auch in einem Winkel von xxx°Grad noch 200Pixel lang und 20 Pixel hoch ist. Momentan habe ich in meiner Zeichenroutine folgenden Ansatz, der mir mein Objekt zwar dreht, aber ich meine Größe nicht anpasse, bzw. Anpassen kann, bzw. nicht das Wissen besitze, oder am Schlauch stehe.
Delphi-Quellcode:
Das "Objekt" wird korrekt in dem Winkel gezeichnet, nur müsste ich ja mein Objekt iwie anpassen?
procedure TILKnopf.IntDraw( AGraphics : IGPGraphics; AXCoeff : Single; AYCoeff : Single; AWidth : Single; AHeight : Single; AOutWidth : Single; AOutHeight : Single; AFromLayer : Boolean; AContoursOnly : Boolean );
var // AGraphics : IGPGraphics; AFont : IGPFont; ALeftTopCorner : TGPPointF; ARect : TGPRectF; ARect1 : TGPRectF; APath : IGPGraphicsPath; ABrush : TGPBrush; APen : TGPPen; AText :String; Farbe1 : TGPColor; Farbe2 : TGPColor; ABarHeightH, ABarHeightW : Single; FXTranslate, FYTranslate : Single; FRotation : Integer; ATransform : IGPMatrix; begin inherited; // AGraphics := TGPGraphics.Create( Canvas ); AGraphics.SmoothingMode := SmoothingModeAntiAlias; AGraphics.TextRenderingHint := TextRenderingHintAntiAlias; APen := TGPPen.Create(aclGray); // self.SetBounds(Left,Top, Width, Width); FRotation := 45; AGraphics.TranslateTransform( 0,0); ////// AGraphics.TranslateTransform( FXTranslate, FYTranslate); AGraphics.RotateTransform(FRotation); if FValue then begin AText := FZustandsTextEin; Farbe1 := aclLime; Farbe2 := aclLime; end else begin AText := FZustandsTextAus; Farbe1 := aclTomato; Farbe2 := aclRed; end; ALeftTopCorner := MakePointF( 10, 10 ); AFont := TGPFont.Create( 'Microsoft Sans Serif', FFontSize, [ fsBold ] ); ARect := AGraphics.GetStringBoundingBoxF( AText, AFont, ALeftTopCorner ); ARect1 := GPInflateRectF( ARect, 5, 5 ); AGraphics.DrawRoundRectangleF( TGPPen.Create( TGPLinearGradientBrush.Create( GPInflateRectF( ARect1, 2, 2 ), aclGray, aclDimgray, LinearGradientModeVertical ), 4 ), TGPPathGradientBrush.Create( TGPGraphicsPath.Create().AddRoundRectangleF( ARect1, MakeSizeF( 10 ) ) ).SetInterpolationColorArrays( [ aclGray, aclLightgray, aclGray ], [ 0, 0.05, 1 ] ) .SetCenterPointF( MakePointF( 250, 50 )) .SetFocusScales( 0.1, 0.8 ), ARect1, MakeSizeF( 10) ); // Draw a text with semitransparent shadow. AGraphics.DrawStringF( AText, AFont, MakePointF( 13, 13 ), TGPSolidBrush.Create( MakeARGBColor( 50, aclBlack )) ) .DrawStringF( AText, AFont, ALeftTopCorner, TGPLinearGradientBrush.Create( ARect, Farbe1, Farbe2, LinearGradientModeForwardDiagonal )); end; //--------------------------------------------------------------------------- das es dann entsprechende Breite und Höhe besitzt. Woher weiß ich das , wie mach ich das? Danke Alex |
AW: GDI+ RotateTransform - Problem im eigenen Objekt
CROSSPOST
![]() Ich verstehe Deine Anforderungen nicht ganz, stört es Dich dass alles um die linke obere Ecke gedreht wird? Du kannst eine Matrix mit Zoom,Rotation und Offset füttern und diese für die Transformation verwenden. Wenn ich den Code so überfliege muss ich feststellen dass ich Interfaces doch für eine böse Sache halte, zumindest verführen sie zu einem für mich kaum lesbaren Stil. |
AW: GDI+ RotateTransform - Problem im eigenen Objekt
Liste der Anhänge anzeigen (Anzahl: 3)
Das mit der linken oberen Ecke ist nicht mein Problem, bzw. das geb ich ja mit (0,0) fest an.
Dies müsste ja berechnet werden?! Mein Problem in Bildern ausgedrückt ist vielleicht etwas verständlicher. das Bild Ursprung.png zeigt mein Objekt nachdem Create.Anhang 37093 das Bild Gedreht.png zeigt mein Objekt mit der gesendeten Quellcode (45° Drehung) Anhang 37094 das Bild Wunschdenken.png zeigt das Objekt wie ich es mit 45° Drehung der dargestellt hätte Anhang 37095 Mein Problem ist das das Bild an sich gedreht gezeichnet wird, jedoch mein Objekt nicht groß genug ist?! |
AW: GDI+ RotateTransform - Problem im eigenen Objekt
von 0 - 90° kannst Du hiermit arbeiten
Delphi-Quellcode:
implementation
uses math; {$R *.dfm} Function GetNewH(w,h,angle:Integer):Integer; begin Result := Round(Sin(DegToRad(angle))*w) + Round(Cos(DegToRad(angle))*h); end; Function GetNewW(w,h,angle:Integer):Integer; begin Result := Round(Cos(DegToRad(angle))*w) + Round(Sin(DegToRad(angle))*h); end; Function GetRoffs(w,h,angle:Integer):Integer; begin Result := Round(sin(DegToRad(angle))*h); end; procedure TForm5.Button1Click(Sender: TObject); var wkl,h,w,newh,neww,roffs:Integer; begin h := 20; w := 200; wkl := 45; neww := GetNewW(w,h,wkl); // neue benötigte Breite newh := GetNewH(w,h,wkl); // neue benötigte Höhe roffs := GetRoffs(w,h,wkl); // nötiger Offset von rechts end; |
AW: GDI+ RotateTransform - Problem im eigenen Objekt
Vielen Dank Bummi.
Hab jetzt den gewünschten Effekt das sich mein Objekt + 90 und - 90 sichtbar Drehen lässt. Wie dreist ist es jetzt wenn ich frage wie ich Drehungen über 90° Berechne/Verarbeite ? :? |
AW: GDI+ RotateTransform - Problem im eigenen Objekt
ich denke mit folgendem kommst Du dahin wo Du willst.
Ich verwende das ganze als Api ohne Interfaces, daher das Free. (Ja DeddyH ohne try finally)
Delphi-Quellcode:
Function PointsFromRect(r: TGPRectF): TPointFDynArray;
begin SetLength(Result, 4); Result[0].X := r.X; Result[0].Y := r.Y; Result[1].X := r.X + r.Width; Result[1].Y := r.Y; Result[2].X := r.X + r.Width; Result[2].Y := r.Y + r.Height; Result[3].X := r.X; Result[3].Y := r.Y + r.Height; end; Procedure Adaptmatrix(Matrix: TGPMatrix; Zoom: Double; Angle: Double; Centerpoint: TGPPointF); var Winkel: Double; Function Grad2Rad(w: Double): Double;// ich wollte Math gerade nicht bemühen begin Result := w / 360 * PI * 2; end; begin Winkel := Grad2Rad(Angle); Matrix.SetElements(Zoom * cos(Winkel), Zoom * Sin(Winkel), Zoom * (-Sin(Winkel)), Zoom * cos(Winkel), Centerpoint.X, Centerpoint.Y) end; procedure TForm2.Button1Click(Sender: TObject); var M:TGPMatrix; r : TGPRectF; pArray:TPointFDynArray; I: Integer; w:Integer; begin r.X := 0; r.Y := 0; r.Width := 200; r.Height := 20; M:=TGPMatrix.Create; for w := 0 to 36 do begin Adaptmatrix(m,1,w * 10,MakePoint(0.0,0)); pArray:=PointsFromRect(r); m.TransformPoints(PGPPointF(pArray),4); Memo1.Lines.Add(Format('Winkel: %d',[w*10])); Memo1.Lines.Add(StringOfChar('_',20)); for I := 0 to High(pArray) do begin Memo1.Lines.Add(Format('X: %0.0f Y: %0.0f',[pArray[i].X,pArray[i].Y])) end; Memo1.Lines.Add(''); end; M.Free; end; |
AW: GDI+ RotateTransform - Problem im eigenen Objekt
Tausend Dank Bummi!
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz