Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
Delphi 2010 Professional
|
Re: Objekte drehen
19. Sep 2006, 19: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
|
|
Zitat
|