Delphi 이미지 텍스트 회전 효과 구현 인 스 턴 스 코드

본 고 는 Delphi 가 이미지 텍스트 회전 효 과 를 실현 하 는 해결 방법 을 사례 로 설명 하 였 으 며,이 프로그램 에서 사용 하 는 컨트롤 은 주로 Panel 컨트롤,Image 컨트롤,Edit 컨트롤,Label 컨트롤 과 Button 컨트롤 이다.이 프로그램의 관건 은 Delphi 의 bmp 를 이용 하 는 것 입 니 다.rotate()함수 로 그림 을 회전 시 키 는 기능 을 실현 합 니 다.관련 윈도 API 함 수 를 교묘 하 게 호출 하여 텍스트 에 대한 회전 효 과 를 실현 한다.
전체 인 스 턴 스 코드 는 다음 과 같 습 니 다.

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,math,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Image1: TImage;
bmprotate: TButton;
Label1: TLabel;
Panel1: TPanel;
Image2: TImage;
Panel2: TPanel;
Image3: TImage;
Edit2: TEdit;
RotatedText: TButton;
Label2: TLabel;
procedure bmprotateClick(Sender: TObject);
procedure RotatedTextClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure bmp_rotate(src,dst:Tbitmap;angle:extended);
Procedure DrawRotatedText(TheCanvas : TCanvas; TheAngle : Integer;
TheText : String);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.bmp_rotate(src,dst:Tbitmap;angle:extended);//    
var
c1x,c1y,c2x,c2y:integer;
p1x,p1y,p2x,p2y:integer;
radius,n:integer;
alpha:extended;
c0,c1,c2,c3:tcolor;
begin
angle := (angle / 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 then
n := c2y
else
n := c2x;
dec (n,1); // n    1,n:=n-1
for p2x := 0 to n do begin
for p2y := 0 to n do begin
if p2x = 0 then
alpha:= pi/2
else
alpha := 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);
Var
RAngle : Extended;
begin
RAngle := StrToFloat(Edit1.Text); //       
bmp_rotate(Image1.Picture.bitmap,Image2.Picture.bitmap, RAngle);//      ,    
end;
Procedure TForm1.DrawRotatedText(TheCanvas : TCanvas; TheAngle : Integer;
TheText : String);
var
lf : TLogFont;
tf : TFont;
begin
Image3.Canvas.refresh;
with TheCanvas do begin
Font.Name:='Arial';
Font.Size:=18;
Brush.Style:= bsClear;
tf:= TFont.Create;
try
tf.Assign(Font);
GetObject(tf.Handle, Sizeof(lf), @lf); //         tf   Font   
lf.lfEscapement:=TheAngle*10;
lf.lfOrientation := TheAngle * 10; //                    
tf.Handle := CreateFontIndirect(lf); //    Font     
Font.Assign(tf); //           
finally
tf.Free; //    
end;
TextOut(Image3.left, Image3.top+20 , TheText); //         
end;
end;
procedure TForm1.RotatedTextClick(Sender: TObject);
Var
TheAngle : Integer;
begin
TheAngle := StrToInt(Edit2.Text); //            
DrawRotatedText(Image3.Canvas, TheAngle, 'Delphi     '); //        
end;
procedure TForm1.FormCreate(Sender: TObject);
var
tf : TFont;
theText:string;
begin
theText:='Delphi     '; //    
with Image3.Canvas do
begin
Font.Name := 'Arial'; //    
Font.Size := 18; //      
Brush.Style := bsClear; //      
tf:= TFont.Create; //    Font     
TextOut(Image3.left, Image3.top+20 , TheText); //         
end;
end;
end.

좋은 웹페이지 즐겨찾기