В этой статье используются примеры для описания решения Delphi для реализации специальных эффектов вращения изображений и текста. В этой программе используются в основном элементы управления «Панель», «Изображение», «Редактирование», «Метка» и «Кнопка». Ключом к этой программе является использование функции bmp_rotate() в Delphi для реализации функции вращения изображений. И умело вызывайте соответствующие функции Windows API для достижения эффектов поворота текста.
Полный пример кода выглядит следующим образом:
unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,math,StdCtrls, ExtCtrls;typeTForm1 = class(TForm)Edit1: TEdit;Image1: TImage;bmprotate: TButton;Label1: TLabel;Panel1: TPanel ;Изображение2: TImage;Panel2: TPanel;Image3: TImage;Edit2: TEdit;RotatedText: TButton;Label2: TLabel;процедура bmprotateClick(Sender: TObject);процедура RotatedTextClick(Sender: TObject);процедура FormCreate(Sender: TObject);private{ Частные объявления }public{публичные заявления }процедура bmp_rotate(src,dst:Tbitmap;angle:extended);Процедура DrawRotatedText(TheCanvas: TCanvas; TheAngle: Integer;TheText: String);end;varForm1: TForm1;реализация{$R *.DFM}процедура TForm1.bmp_rotate(src,dst:Tbitmap;angle:extended);//Вращение изображения varc1x,c1y,c2x,c2y:integer;p1x,p1y,p2x,p2y:integer;radius,n:integer;alpha:extended;c0 ,c1,c2,c3:tcolor;beginangle := (угол / 180) * пи; //Преобразуем содержимое текстового поля в угол 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); //сделать n; Значение уменьшается на 1, n:=n-1for p2x := от 0 до n do Beginfor p2y := от 0 до n do Beginif p2x = 0 thenalpha:= pi/2elsealpha := arctan2(p2y,p2x);radius := round(sqrt ((p2x*p2x)+(p2y*p2y)));//Установим радиус при вращении p1x := round(radius * cos(angle+alpha)); //Установим абсциссу центра круга при вращении p1y := round(radius * sin(angle+alpha)); //Установим ординату центра круга при вращении; c0 := src.Canvas.pixels [c1x+p1x,c1y+p1y];//Заменяем пиксель c1 на соответствующие координаты изображения:= 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; //Заменяем пиксели в разных позициях 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 //Ответить на другие запросы сообщенийend;end;procedure TForm1.bmprotateClick(Sender: TObject);VarRAngle : Extended;beginRAngle := StrToFloat(Edit1.Text); //Установить угол поворота bmp_rotate(Image1.Picture.bitmap,Image2). .Picture.bitmap, RAngle);//Запускаем функцию вращения и поворачиваем изображение;Процедура TForm1.DrawRotatedText(TheCanvas: TCanvas; TheAngle: Integer;TheText: String);varlf: TLogFont;tf: TFont;beginImage3.Canvas.refresh;с TheCanvas do BeginFont.Name:='Arial';Font.Size:=18; Brush.Style:= bsClear;tf:= TFont.Create;trytf.Assign(Font);GetObject(tf.Handle, Sizeof(lf), @lf); //Назначаем текущий дескриптор экземпляра объекту tf Font lf.lfEscapement:=TheAngle*10;lf.lfOrientation := TheAngle * 10; //Сделаем линию абсциссы и горизонтальную линию на входе формирующими заданный угол tf.Handle := CreateFontIndirect(lf); //Создаем объект, специфичный для шрифта Font.Assign(tf); //Используем этот объект в программеfinallytf.Free //Освобождаем объект end;TextOut(Image3.left, Image3.top+20, TheText); // Нарисовать текст в указанной областиend;end;процедура TForm1.RotatedTextClick(Sender: TObject);VarTheAngle : Integer;beginTheAngle := StrToInt(Edit2.Text); //Преобразуем текст в текстовом поле в угол DrawRotatedText(Image3.Canvas, TheAngle, 'Delphi Graphics Studio'); //Вызов функции повернутого текста end; процедура TForm1.FormCreate(Sender: TObject); ) ;vartf : TFont;theText:string;begintheText:='Delphi Graphics Studio' //Установить текст с помощью Image3.Canvas dobeginFont.Name := 'Arial'; //Установим шрифт Font.Size := 18; //Установим размер шрифта Brush.Style := bsClear; //Установим стиль кисти tf:= TFont.Create; // Создаем объект, специфичный для шрифта TextOut(Image3.left, Image3.top+20, TheText //Рисуем текст в указанной областиend;end;end);