Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Text oder. Grafik neigen (https://www.delphipraxis.net/82986-text-oder-grafik-neigen.html)

BrainCracked 23. Dez 2006 19:04


Text oder. Grafik neigen
 
Hallo,
wie im Titel berreits erwähnt möchte ich Einen Text oder eine Grafik neigen, sodass es dann so aussieht, als ob der Text liegen würde. So wie hier z.B.. Das soll nicht so umfangreich wie im Besoiel sin, sondern es reicht ein stink normaler Text.

MfG
BrainCracked

mkinzler 23. Dez 2006 19:09

Re: Text oder. Grafik neigen
 
Schau mal in der JVCL, ob es dort ne passende Komponente gibt.

xaromz 23. Dez 2006 19:17

Re: Text oder. Grafik neigen
 
Hallo,

mit MSDN-Library durchsuchenSetWorldTransform kannst Du eine Matrixtransformation anwenden. Damit sind solche Effekte kein Problem.

Gruß
xaromz

BrainCracked 23. Dez 2006 19:25

Re: Text oder. Grafik neigen
 
Ah...dankeschön.
Mir ist aber gerade aufgefallen, dass ich das ganze doch mit einer Grafik und nicht einem Text machen müsste...gibt es da auch ne Möglichkeit?

MfG

ste_ett 23. Dez 2006 19:34

Re: Text oder. Grafik neigen
 
Zitat:

Zitat von xaromz

wird auf ein DC angewendet, also geht es auch mit einer Grafik. :)

BrainCracked 23. Dez 2006 19:49

Re: Text oder. Grafik neigen
 
Also ich habe jetzt folgenden Code hier im Forum gefunden, weiß aber leider nicht richtig, wie ich den handhaben soll...

Delphi-Quellcode:
// uses Math (SinCos)

// zeichnet eine verdrehte Grafik auf einem Canvas
// aAngle ist der Drehwinkel im Uhrzeigersinn in Grad
// aOffsetX, aOffsetY gibt den Offset für das Zeichnen an

procedure DrawRotatedGraphic (aCanvas: TCanvas; aGraphic: TGraphic;
                              aAngle: Double; aOffsetX, aOffsetY: Integer);
var
  svMode: Integer;
  Mat, svMat: tagXFORM;
  si, co: Extended;
begin
  // aktuellen Zustand retten
  svMode := SetGraphicsMode(aCanvas.Handle, GM_ADVANCED);
  if (svMode = GM_ADVANCED) then
    GetWorldTransform(aCanvas.Handle, svMat);
  // Verschiebung in den Usprung
  FillChar (Mat, SizeOf(Mat), 0);
  Mat.em11 := 1.0;
  Mat.em22 := 1.0;
  Mat.eDx := -(aOffsetX + aGraphic.Width / 2);
  Mat.eDy := -(aOffsetY + aGraphic.Height / 2);
  SetWorldTransform(aCanvas.Handle, Mat);
  // Verdrehung
  SinCos (aAngle * Pi / 180, si, co);
  FillChar (Mat, SizeOf(Mat), 0);
  Mat.em11 := co;
  Mat.em12 := si;
  Mat.em21 := -si;
  Mat.em22 := co;
  ModifyWorldTransform(aCanvas.Handle, Mat, MWT_RIGHTMULTIPLY);
  // Zurückschieben
  FillChar (Mat, SizeOf(Mat), 0);
  Mat.em11 := 1.0;
  Mat.em22 := 1.0;
  Mat.eDx := (aOffsetX + aGraphic.Width / 2);
  Mat.eDy := (aOffsetY + aGraphic.Height / 2);
  ModifyWorldTransform(aCanvas.Handle, Mat, MWT_RIGHTMULTIPLY);
  // Bitmap zeichnen
  aCanvas.Draw(aOffsetX, aOffsetY, aGraphic);
  // alten Zustand wiederherstellen
  if (svMode = GM_ADVANCED) then
    SetWorldTransform(aCanvas.Handle, svMat)
  else
    SetGraphicsMode(aCanvas.Handle, svMode);
end;

Hawkeye219 23. Dez 2006 22:11

Re: Text oder. Grafik neigen
 
Hallo BrainCracked,

hier eine kleine Ergänzung:

Delphi-Quellcode:
// zeichnet eine gescherte Grafik auf einem Canvas
// sx, sy ist der Betrag der Scherung in x- und y-Richtung
// aOffsetX, aOffsetY gibt den Offset für das Zeichnen an

procedure DrawShearedGraphic (aCanvas: TCanvas; aGraphic: TGraphic;
                              sx, sy: Double; aOffsetX, aOffsetY: Integer);
var
  svMode: Integer;
  Mat, svMat: tagXFORM;
begin
  // aktuellen Zustand retten
  svMode := SetGraphicsMode(aCanvas.Handle, GM_ADVANCED);
  if (svMode = GM_ADVANCED) then
    GetWorldTransform(aCanvas.Handle, svMat);
  // Scherung
  FillChar (Mat, SizeOf(Mat), 0);
  Mat.em11 := 1;
  Mat.em12 := sy;
  Mat.em21 := sx;
  Mat.em22 := 1;
  Mat.eDx := aOffsetX;
  Mat.eDy := aOffsetY;
  SetWorldTransform(aCanvas.Handle, Mat);
  // Grafik zeichnen
  aCanvas.Draw(0, 0, aGraphic);
  // alten Zustand wiederherstellen
  if (svMode = GM_ADVANCED) then
    SetWorldTransform(aCanvas.Handle, svMat)
  else
    SetGraphicsMode(aCanvas.Handle, svMode);
end;
Der Aufruf der beiden Routinen könnte so aussehen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  bmp : TBitmap;
begin
  bmp := TBitmap.Create;
  try
    bmp.LoadFromFile ('C:\WINDOWS\winnt.bmp');
    DrawRotatedGraphic (Canvas, bmp, 15, 100, 100);
    DrawShearedGraphic (Canvas, bmp, -0.3, 0.0, 500, 100);
  finally
    bmp.Free;
  end;
end;
Die Grundlagen findest du bei Microsoft: MSDN-Library durchsuchenCoordinate Spaces and Transformations

Gruß Hawkeye

BrainCracked 25. Dez 2006 14:47

Re: Text oder. Grafik neigen
 
Ah..danke
Aber ich habe mir jetzt mal so einige gedanken gemacht und festgestellt, dass es doch besser wäre, wenn ich einen einfachen Text neigen würde. Wie stelle ich dies am besten an?

MfG

Namenloser 26. Dez 2006 14:57

Re: Text oder. Grafik neigen
 
Also was denn nun?

Für einfachen Text habe ich mal bei dsdt.info eine untion namens TextOutAngle oder so ähnlich gesehen.

Ansonsten würde ich einfach den text auf das bitmap zeichnen (canvas.textout) und dann das bitmap rotieren.


Die Function TextOutAngle gibts hier

xaromz 26. Dez 2006 15:46

Re: Text oder. Grafik neigen
 
Hallo,

@NamenLozer: Er will den Text neigen, nicht drehen.

@Topic: Mein Ratschlag bleibt: Transformiere den DC mit MSDN-Library durchsuchenSetWorldTransform, zeichne den Text und setze die Transformation wieder zurück. Wie das prinzipiell funktioniert, kannst Du in den Beispielen oben nachlesen.

Gruß
xaromz


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 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