Thema: Delphi Objekte drehen

Einzelnen Beitrag anzeigen

Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Objekte drehen

  Alt 19. Sep 2006, 18:54
Hallo Mischn,

falls du am Anfang auf GDI+ und DelphiX verzichten möchtest, kannst du auch mit dem "alten" GDI eine Bitmap drehen:

Delphi-Quellcode:
// uses Math (SinCos)

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

procedure DrawRotatedBitmap (aCanvas: TCanvas; aBitmap: TBitmap;
                             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 + aBitmap.Width / 2);
  Mat.eDy := -(aOffsetY + aBitmap.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 + aBitmap.Width / 2);
  Mat.eDy := (aOffsetY + aBitmap.Height / 2);
  ModifyWorldTransform(aCanvas.Handle, Mat, MWT_RIGHTMULTIPLY);
  // Bitmap zeichnen
  aCanvas.Draw(aOffsetX, aOffsetY, aBitmap);
  // alten Zustand wiederherstellen
  if (svMode = GM_ADVANCED) then
    SetWorldTransform(aCanvas.Handle, svMat)
  else
    SetGraphicsMode(aCanvas.Handle, svMode);
end;
Gruß Hawkeye
  Mit Zitat antworten Zitat