比如采用opengl画出字体
只能接受'Arial'等type字体,不能采用行楷等非type font!
下面是函数例子:
procedure TForm1.drawtext;
const
FListBase:GLuint=1000;
var
hf:HFONT;
lf:LOGFONT;
tmpstrlen:integer;
agmf:array[0..128] of GLYPHMETRICSFLOAT ;
ich,j,i:integer;
COText:array[0..128] of char;
FTextList:array[0..128] of byte;
cch:char;
tmpstr:string;
begin
ich:=0;j:=0;i:=0;
lf.lfHeight:=-1;lf.lfWidth:=-1;
lf.lfEscapement:=0;lf.lfOrientation:=0;
lf.lfWeight:=FW_NORMAL;lf.lfItalic:=1;// FALSE ;
lf.lfUnderline:=1;//FALSE;lf.lfStrikeOut :=1;// FALSE ;
lf.lfCharSet:=ANSI_CHARSET;lf.lfOutPrecision:=OUT_TT_PRECIS ;
lf.lfClipPrecision:=CLIP_DEFAULT_PRECIS ;
lf.lfQuality:=PROOF_QUALITY ;
lf.lfPitchAndFamily := VARIABLE_PITCH + TMPF_TRUETYPE + FF_MODERN ;
lstrcpy (lf.lfFaceName, 'Arial') ;
hf:=CreateFontIndirect(lf);
SelectObject(wglGetCurrentDC,hf);
DeleteObject(hf);
tmpstr:='hello show font!';
strcopy(COText,@tmpstr[1]);
tmpstrlen:=length(tmpstr);
i:=0;j:=0;
while(i<tmpstrlen) do
begin
if (IsDBCSLeadByte(byte(COText))) then///判断是否为双字节
begin
ich:=ord(COText);
ich:=ich*256+ord(COText[i+1]); ////256为汉字内码“偏移量”
i:=i+2;
wglUseFontOutlines(wglGetCurrentDC(), /////字体轮廓设备联系DC
ich, /////要转换为显示列表的第一个字符
1, /////要转换为显示列表的字符数
1000+j, /////显示列表的基数
0, /////指定与实际轮廓的最大偏移量
0.15, /////在Z轴负方向的值
WGL_FONT_POLYGONS, /////指定显示列表线段或多边形
@agmf[j]); /////接受字符的地址
FTextList[j]:=j;
inc(j);
end
else
begin
cch:=COText;
inc(i);
wglUseFontOutlines(wglGetCurrentDC(), /////字体轮廓设备联系DC
ord(cch),/////要转换为显示列表的第一个字符
1, /////要转换为显示列表的字符数
1000+j, /////显示列表的基数
0, /////指定与实际轮廓的最大偏移量
0, /////在Z轴负方向的值
WGL_FONT_LINES, /////指定显示列表线段或多边形
@agmf[j]); /////接受字符的地址
FTextList[j]:=j;
inc(j);
end;
end;
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glEnable(GL_NORMALIZE);
glShadeModel(GL_FLAT);
glCullFace(GL_BACK);
glLoadIdentity;
glTranslatef(-3.7, 0.0, -12.0);
glListBase(FListBase);
glCallLists(tmpstrlen,GL_UNSIGNED_BYTE,@FTextList);
glFlush();
SwapBuffers(wglGetCurrentDC);
end;