Cet article utilise des exemples pour décrire la solution de Delphi permettant de réaliser des effets spéciaux de rotation d'images et de texte. Les contrôles utilisés dans ce programme sont principalement le contrôle Panel, le contrôle Image, le contrôle Edit, le contrôle Label et le contrôle Button. La clé de ce programme est d'utiliser la fonction bmp_rotate() de Delphi pour réaliser la fonction de rotation des images. Et appelez intelligemment les fonctions API Windows pertinentes pour obtenir des effets de rotation de texte.
L'exemple de code complet est le suivant :
unité Unit1;interfaceutiliseWindows, Messages, SysUtils, Classes, Graphiques, Contrôles, Formulaires, Boîtes de dialogue,math,StdCtrls, ExtCtrls;typeTForm1 = class(TForm)Edit1: TEdit;Image1: TImage;bmprotate: TButton;Label1: TLabel;Panel1: TPanel ;Image2 : TImage;Panel2: TPanel;Image3: TImage;Edit2: TEdit;RotatedText: TButton;Label2: TLabel;procédure bmprotateClick(Expéditeur: TObject);procédure RotatedTextClick(Expéditeur: TObject);procédure FormCreate(Expéditeur: TObject);private{ Déclarations privées }public{ Déclarations publiques }procédure bmp_rotate(src,dst:Tbitmap;angle:extended);Procédure DrawRotatedText(TheCanvas : TCanvas; TheAngle : Integer;TheText : String);end;varForm1: TForm1;implémentation{$R *.DFM}procédure TForm1.bmp_rotate(src,dst:Tbitmap;angle:extended);//Rotation de l'image varc1x,c1y,c2x,c2y:integer;p1x,p1y,p2x,p2y:integer;radius,n:integer;alpha:extended;c0 ,c1,c2,c3:tcolor;beginangle := (angle / 180) * pi; //Convertir le contenu de la zone de texte en angle c1x := src.Width div 2;c1y := src.Height div 2;c2x := dst.Width div 2;c2y := dst.Height div 2;if c2x < c2y thenn := c2yelsen := c2x;dec (n,1); //make n La valeur est réduite de 1, n:=n-1for p2x := 0 à n do startfor p2y := 0 à n do startif p2x = 0 thenalpha:= pi/2elsealpha := arctan2(p2y,p2x);radius := round(sqrt ((p2x*p2x)+(p2y*p2y)));//Définir le rayon pendant la rotation p1x := round(radius * cos(angle+alpha)); //Définit l'abscisse du centre du cercle pendant la rotation p1y := round(radius * sin(angle+alpha)); //Définit l'ordonnée du centre du cercle pendant la rotation c0 := src.Canvas.pixels [c1x+p1x,c1y+p1y];//Remplacez le pixel c1 aux coordonnées pertinentes de l'image := src.Canvas.pixels[c1x-p1x,c1y-p1y];c2 := src.Canvas.pixels[c1x+p1y,c1y-p1x];c3 := src.Canvas.pixels[c1x-p1y,c1y+p1x];dst.Canvas.pixels[c2x+p2x,c2y+p2y]:=c0; //Remplacer les pixels à différentes positions dst.Canvas.pixels[c2x-p2x,c2y-p2y]:=c1;dst.Canvas.pixels[c2x+p2y,c2y-p2x]:=c2;dst.Canvas.pixels[ c2x -p2y,c2y+p2x]:=c3;end;application.processmessages //Répondre à d'autres demandes de messageend;end;procedure TForm1.bmprotateClick(Sender: TObject);VarRAngle : Extended;beginRAngle := StrToFloat(Edit1.Text); //Définir l'angle de rotation bmp_rotate(Image1.Picture.bitmap,Image2 .Picture.bitmap, RAangle);//Exécutez la fonction de rotation et faites pivoter le graphiqueend;Procédure TForm1.DrawRotatedText(TheCanvas : TCanvas; TheAngle : Integer;TheText : String);varlf : TLogFont;tf : TFont;beginImage3.Canvas.refresh;avec TheCanvas faire beginFont.Name:='Arial';Font.Size:=18; Brush.Style:= bsClear;tf:= TFont.Create;trytf.Assign(Font);GetObject(tf.Handle, Sizeof(lf), @lf); //Attribuer le handle d'instance actuel à l'objet tf Font lf.lfEscapement:=TheAngle*10;lf.lfOrientation := TheAngle * 10; //Faire en sorte que la ligne d'abscisse et la ligne horizontale à l'entrée forment un angle spécifié tf.Handle := CreateFontIndirect(lf); //Créer un objet spécifique à la police Font.Assign(tf); //Utiliser cet objet pour le programme finaltf.Free; //Libérer l'objet end;TextOut(Image3.left, Image3.top+20, TheText); Dessine du texte dans la zone spécifiéeend;end;procedure TForm1.RotatedTextClick(Sender: TObject);VarTheAngle : Integer;beginTheAngle := StrToInt(Edit2.Text); //Convertir le texte dans la zone de texte en angle DrawRotatedText(Image3.Canvas, TheAngle, 'Delphi Graphics Studio'); //Appelle la fonction de texte pivoté end; ) ;vartf : TFont;theText:string;begintheText:='Delphi Graphics Studio' //Définir le texte avec Image3.Canvas dobeginFont.Name := 'Arial'; //Définit la police Font.Size := 18; //Définit la taille de la police Brush.Style := bsClear; //Définit le style de pinceau tf:= TFont.Create; // Crée un objet spécifique à la police TextOut(Image3.left, Image3.top+20, TheText) //Dessine le texte dans la zone spécifiéeend;end;end);