通过Automation MS Word搞不定,不可能那么逼真,虽然有点像, 还是自己派生一个TGraphicControl控件,覆盖Paint, 这可是要懂图形技术啊。我搞不定。
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TForm1 = class(TForm) Image1: TImage; Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private procedure GetImage(sStr:string); procedure GetLogFont(iAnc:integer;fCanvas:tCanvas); procedure DrawFive(x,y,r:integer;fCanvas:tCanvas); function GetPoint(nI:integer;nJ:integer;var NAnc:integer):Tpoint; { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject); begin if self.Edit1.text='' then exit else GetImage(edit1.Text); end;procedure Tform1.Getimage(sStr:String); var nX,nY,nZ:integer; nPoint:Tpoint; begin nY:=length(widestring(sstr)); if ny>18 then ny:=18; image1.Canvas.Pen.Width:=3; image1.Canvas.Ellipse(50,20,170,140);//110,80 drawfive(110,80,20,image1.Canvas ); for nx:=1 to ny do begin npoint:=GetPoint(nx,ny,nz); image1.Canvas.Font.Size:=10; //image1.Canvas.Font.Style:=[fsBold]; getlogfont(nz,image1.Canvas); image1.Canvas.TextOut(npoint.x,npoint.y,copy(widestring(sStr),nx,1)); end; end;procedure Tform1.GetLogFont(iAnc:integer;fCanvas:tCanvas); var FlogFont:LogFont; begin FillChar(FLogFont,Sizeof(TLogFont),0); With FlogFont do begin lfHeight:=fCanvas.font.Height; lfWidth:=0; lfEscapement:=iAnc; //想旋转多少度,修改这里的参数就可以了啊 lforientation:=lfEscapement; lfWeight:=Fw_Normal; lfItalic:=0; lfUnderline:=0; lfStrikeOut:=0; lfCharSet:=GB2312_CHARSET; StrPCopy(lfFaceName,'宋体'); lfQuality:=PROOF_QUALITY; lfOutPrecision:=OUT_TT_ONLY_PRECIS; lfClipPrecision:=CLIP_DEFAULT_PRECIS; lfPitchAndFamily:=Variable_Pitch; end; fCanvas.Font.Handle:=CreateFontIndirect(FLogFont); end; function Tform1.GetPoint(ni:integer;nj:integer;var Nanc:integer):Tpoint; var pPoint:Tpoint; RAn:Extended; tempI:integer; begin {18个字:360 9个字:180 0个字:0 } tempI:=100*(16-nJ+2*nI); if tempI<2700 then tempI:=2700-tempI else tempi:=6300-tempI; Nanc:=tempi-900; ran:=pi*(tempi/1800); pPoint.x:=110+round(55*cos(ran)); pPoint.Y:=80-round(55*sin(ran)); result:=pPoint;end; procedure Tform1.DrawFive(x,y,r:integer;fCanvas:tCanvas); var oldColor:Tcolor; nX:integer; nR:integer; tempRgn:hrgn; pPoint:Array[0..9] of Tpoint; begin for nx:=0 to 9 do begin if (nx mod 2=0) then nR:=r else nR:=round(r*sin(pi/10)/sin(pi*126/180)); pPoint[nx].X:=x+round(nR*cos(pi*(nx/5+0.5))); pPoint[nx].y:=y-round(nR*sin(pi*(nx/5+0.5))); end; oldcolor:=fcanvas.Brush.Color; fcanvas.Brush.Color:=clblack; temprgn:=CreatePolygonRgn(ppoint[0],10,ALTERNATE); FillRgn(fcanvas.Handle,temprgn,fcanvas.Brush.Handle);
还是自己派生一个TGraphicControl控件,覆盖Paint,
这可是要懂图形技术啊。我搞不定。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;type
TForm1 = class(TForm)
Image1: TImage;
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
procedure GetImage(sStr:string);
procedure GetLogFont(iAnc:integer;fCanvas:tCanvas);
procedure DrawFive(x,y,r:integer;fCanvas:tCanvas);
function GetPoint(nI:integer;nJ:integer;var NAnc:integer):Tpoint; { Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
if self.Edit1.text='' then
exit
else
GetImage(edit1.Text);
end;procedure Tform1.Getimage(sStr:String);
var
nX,nY,nZ:integer;
nPoint:Tpoint;
begin
nY:=length(widestring(sstr));
if ny>18 then ny:=18; image1.Canvas.Pen.Width:=3;
image1.Canvas.Ellipse(50,20,170,140);//110,80
drawfive(110,80,20,image1.Canvas );
for nx:=1 to ny do begin
npoint:=GetPoint(nx,ny,nz);
image1.Canvas.Font.Size:=10;
//image1.Canvas.Font.Style:=[fsBold];
getlogfont(nz,image1.Canvas);
image1.Canvas.TextOut(npoint.x,npoint.y,copy(widestring(sStr),nx,1)); end;
end;procedure Tform1.GetLogFont(iAnc:integer;fCanvas:tCanvas);
var
FlogFont:LogFont;
begin
FillChar(FLogFont,Sizeof(TLogFont),0);
With FlogFont do
begin
lfHeight:=fCanvas.font.Height;
lfWidth:=0;
lfEscapement:=iAnc; //想旋转多少度,修改这里的参数就可以了啊
lforientation:=lfEscapement;
lfWeight:=Fw_Normal;
lfItalic:=0;
lfUnderline:=0;
lfStrikeOut:=0;
lfCharSet:=GB2312_CHARSET;
StrPCopy(lfFaceName,'宋体');
lfQuality:=PROOF_QUALITY;
lfOutPrecision:=OUT_TT_ONLY_PRECIS;
lfClipPrecision:=CLIP_DEFAULT_PRECIS;
lfPitchAndFamily:=Variable_Pitch;
end;
fCanvas.Font.Handle:=CreateFontIndirect(FLogFont);
end;
function Tform1.GetPoint(ni:integer;nj:integer;var Nanc:integer):Tpoint;
var
pPoint:Tpoint;
RAn:Extended;
tempI:integer;
begin
{18个字:360
9个字:180
0个字:0
}
tempI:=100*(16-nJ+2*nI);
if tempI<2700 then
tempI:=2700-tempI
else
tempi:=6300-tempI; Nanc:=tempi-900; ran:=pi*(tempi/1800);
pPoint.x:=110+round(55*cos(ran));
pPoint.Y:=80-round(55*sin(ran));
result:=pPoint;end;
procedure Tform1.DrawFive(x,y,r:integer;fCanvas:tCanvas);
var
oldColor:Tcolor;
nX:integer;
nR:integer;
tempRgn:hrgn;
pPoint:Array[0..9] of Tpoint;
begin
for nx:=0 to 9 do begin
if (nx mod 2=0) then nR:=r else nR:=round(r*sin(pi/10)/sin(pi*126/180));
pPoint[nx].X:=x+round(nR*cos(pi*(nx/5+0.5)));
pPoint[nx].y:=y-round(nR*sin(pi*(nx/5+0.5)));
end;
oldcolor:=fcanvas.Brush.Color;
fcanvas.Brush.Color:=clblack; temprgn:=CreatePolygonRgn(ppoint[0],10,ALTERNATE);
FillRgn(fcanvas.Handle,temprgn,fcanvas.Brush.Handle);
fcanvas.Brush.Color:=oldcolor;
end;
end.
这个函数是起个什么作用啊?
如果方便,请帮我儿子投一票
http://www.nutricia.com.cn/view.asp?id=736
谢谢。