如何显示ttf字体的轮廓?
话题704678的标题是: 如何显示ttf字体的轮廓? (200分)
分类:Windows API shxm (2001-11-03 20:49:00)
我想显示某一汉字的ttf字体(如楷体)的笔画轮廓,苦于不知有关字体的详细说明,更无法编程实现.有哪位高手能指点?最好能有读取并显示字体笔画的程序源码.
卷起千堆雪tyn (2001-11-03 20:56:00)
你的问题就是空心字体的意思~~~
另外你说的读取、显示就是存为位图文件进行操作.
procedure TForm1.Button1Click(Sender: TObject);
var
bmp:tbitmap;
begin
bmp:=tbitmap.Create;
with bmp do
begin
Width:=image1.Width;
Height:=image1.Height;
Canvas.Font.Name:='楷体';
Canvas.Font.Size:=30;
setbkmode(bmp.canvas.handle,0);
TransparentColor:=clWhite;
Canvas.Font.Color:=clred;
canvas.TextOut(9,10,'卷起千堆雪');
canvas.TextOut(10,9,'卷起千堆雪');
canvas.TextOut(10,11,'卷起千堆雪');
canvas.TextOut(11,10,'卷起千堆雪');
canvas.Font.Color:=clwhite;
canvas.TextOut(10,10,'卷起千堆雪');
image1.Canvas.Draw(0,0,bmp);
image1.Transparent:=true;
free;
end;
end;
shxm (2001-11-06 10:49:00)
感谢您的帮助,但我想要显示的是一个字每一笔画的空心轮廓,而不是整个字的轮廓,尽管显示笔画轮廓可能看起来有点乱。您(或者有谁)[
]能解决吗?
huiyugan (2001-11-07 10:42:00)
第二位兄弟的做法似乎有电偷懒啊
shexm, 你知不知道path, region, 完全可以用这个实现的.
首先你用textout书写文字创建path, 然后用这个path生成一个region
然后用FrameRgn就可以绘制轮廓了
huiyugan (2001-11-07 10:53:00)
你试一下下面的代码,
说明一下, 有一个TImage控件, 名称试image1
有一个fontdialog控件,名称是FontDialog1,它的font必须设置为一个矢量字体!!!
代码:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
dc : HDC;
bakClrPen, bakClrBrush : TColor;
rgn : HRGN;
begin
Image1.Canvas.Font := fontdialog1.Font;
dc := Image1.Canvas.Handle;
BeginPath(dc);
Image1.Canvas.TextOut(0, 0, '中国');
CloseFigure(dc);
EndPath(dc);
// SelectClipPath(dc, RGN_COPY);
bakClrPen := Image1.Canvas.Brush.Color;
bakClrBrush := Image1.Canvas.Pen.Color;
Image1.Canvas.Brush.Color := clRed;
Image1.Canvas.pen.Color := clBlue;
rgn := PathToRegion(dc);
if rgn<>0 then
FrameRgn(dc, rgn, Image1.Canvas.Brush.Handle, 1, 1);
Image1.Canvas.Brush.Color := bakClrBrush;
Image1.Canvas.Pen.Color := bakClrPen;
DeleteObject(rgn);
end;
huiyugan (2001-11-07 11:49:00)
代码:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
dc : HDC;
bakClrPen, bakClrBrush : TColor;
tmpRgn : HRGN;
rgn : HRGN;
rgnRect : TRect;
begin
Image1.Canvas.Font := fontdialog1.Font;
dc := Image1.Canvas.Handle;
BeginPath(dc);
Image1.Canvas.TextOut(0, 0, '中国');
CloseFigure(dc);
EndPath(dc);
bakClrPen := Image1.Canvas.Brush.Color;
bakClrBrush := Image1.Canvas.Pen.Color;
Image1.Canvas.Brush.Color := clRed;
Image1.Canvas.pen.Color := clBlue;
rgn := PathToRegion(dc);
GetRgnBox(rgn, rgnRect);
tmpRgn := CreateRectRgn(rgnRect.left, rgnRect.top, rgnRect.Right, rgnRect.Bottom);
CombineRgn(rgn, tmpRgn, rgn, RGN_DIFF);
if rgn<>0 then
FrameRgn(dc, rgn, Image1.Canvas.Brush.Handle, 1, 1);
Image1.Canvas.Brush.Color := bakClrBrush;
Image1.Canvas.Pen.Color := bakClrPen;
SelectClipRgn(dc, 0);
DeleteObject(rgn);
DeleteObject(tmpRgn);
end;
huiyugan (2001-11-07 11:51:00)
你从path中能获得字体的信息,
包括点, 该点的类型等等,具体请看msdn
YB_unique (2001-11-07 12:00:00)
很好很好!这个问题无意中帮我解决了另一个问题! 字体轮廓好东西!^_^
huiyugan (2001-11-07 13:48:00)
YB_unique, 给你解决了什么问题, ^_^
shxm (2001-11-08 13:37:00)
多人接受答案了。
shxm (2001-11-08 13:41:00)
huiyugan,我对这方面不熟,能否多介绍些path方面的情况?
msdn我没看过,是E文的吧?我以前怕看,现在有兴趣了,到哪里找?谢谢.
huiyugan (2001-11-08 14:45:00)
GetPath
The GetPath function retrieves the coordinates defining the endpoints of lines and the control points of curves found in the path that is selected into the specified device context.
int GetPath(
HDC hdc, // handle to DC
LPPOINT lpPoints, // path vertices
LPBYTE lpTypes, // array of path vertex types
int nSize // count of points defining path
);
当你使用BeginPath时, 你的当前DC上的path就被抛弃了
然后你在上面的绘图操作就形成path,当使用endpath时
msdn是开发windows程序的必备参考资料, 是微软的帮助文档,
你可以在卖光盘的地方找到.
里面有非常丰富的文档
shxm (2001-11-13 11:01:00)
to huiyugan:
按你的方法能显示空心笔画,但还有一点问题能否解决?
当两个笔画交叉时(例如横和竖)如果部分轮廓正好重叠,则重叠部分不能显示,能否让重叠部分也显示?
另外,能否显示一个字中某一部分笔画轮廓?
huiyugan (2001-11-13 16:44:00)
to shxm。
这与字体信息有关系。
在矢量字体里面并不是记录横竖这样的信息,它记录的是字体的轮廓信息。也许你可以
找到一种字体能够满足你的要求。
huiyugan-150,卷起千堆雪tyn-50,的回答最终被接受。