تستخدم هذه المقالة أمثلة لوصف حل دلفي لتحقيق تأثيرات خاصة لتدوير الصورة والنص. عناصر التحكم المستخدمة في هذا البرنامج هي بشكل أساسي التحكم في اللوحة، والتحكم في الصورة، والتحكم في التحرير، والتحكم في التسمية، والتحكم في الزر. مفتاح هذا البرنامج هو استخدام دالة دلفي bmp_rotate() لتحقيق وظيفة تدوير الصور. واستدعاء وظائف Windows API ذات الصلة بذكاء لتحقيق تأثيرات تدوير النص.
رمز المثال الكامل هو كما يلي:
وحدة Unit1;واجهاتاستخداماتWindows، رسائل، SysUtils، فئات، رسومات، عناصر تحكم، نماذج، مربعات حوار، الرياضيات، 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{ إعلانات خاصة }إجراء الإقرارات العامة bmp_rotate(src,dst:Tbitmap;angle:extend);Procedure DrawRotatedText(TheCanvas : TCanvas; TheAngle : Integer;TheText : String);end;varForm1: TForm1;implementation{$R *.DFM} الإجراء TForm1.bmp_rotate(src,dst:Tbitmap;angle:extend);//تدوير الصورة varc1x,c1y,c2x,c2y:integer;p1x,p1y,p2x,p2y:integer;radius,n:integer;alpha:extend;c0 ,c1,c2,c3:tcolor;beginangle := (زاوية / 180) * pi; // تحويل المحتوى في مربع النص إلى الزاوية 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 يتم تخفيض القيمة بمقدار 1، n:=n-1for p2x := 0 to n do beginfor p2y := 0 to 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 قم beginFont.Name:='Arial';Font.Size:=18; Brush.Style:= bsClear;tf:= TFont.Create;trytf.Assign(Font);GetObject(tf.Handle, Sizeof(lf), @lf); // قم بتعيين مؤشر المثيل الحالي لكائن خط tf lf.lfEscapement:=TheAngle*10;lf.lfOrientation := TheAngle * 10; // اجعل خط الإحداثي المحوري والخط الأفقي عند الإدخال يشكلان زاوية محددة tf.Handle := CreateFontIndirect(lf); // إنشاء كائن خاص بالخط Font.Assign(tf); // استخدم هذا الكائن للبرنامج أخيرًاtf.Free; // حرر نهاية الكائن;TextOut(Image3.left, Image3.top+20, TheText); رسم النص إلى المنطقة المحددةend;end;procedure TForm1.RotatedTextClick(Sender: TObject);VarTheAngle : Integer;beginTheAngle := StrToInt(Edit2.Text); // تحويل النص في مربع النص إلى زاوية DrawRotatedText(Image3.Canvas, TheAngle, 'Delphi Graphics Studio'); // استدعاء إجراء وظيفة النص المدورة 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.