- UID
- 55031
- 积分
- 995
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2003-6-3
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2003-8-29 11:59:15
|
显示全部楼层
别人帮着写了一个提取TTF文件字体名称的函数,供大家研究!!!
<br />
</font><blockquote><font face="宋体,verdana,arial,helvetica" >code:</font>
<TABLE cellSpacing=0 cellPadding=0 bgColor='#ffffff' width=90% align=center><TR><TD><TABLE cellSpacing=1 cellPadding=2 border=0 width=100%><tr><td bgcolor='#F3F3F3'><pre>
<font face="courier new">
void GetFontNameFromFileName(CString fontfilename, CString &fontfullname)
{
// TODO: Add your control notification handler code here
FILE *pfTTF;
char buffer[32], stringbuf[1024]="", *p;
WCHAR wstr[1024];
long index, tablength;
unsigned short tablrecnum, stroffset;
bool hasname = false;
unsigned short platformID, encodingID, languageID, nameID, strlength, strnearoffset;
CString ttffilename;
LANGID langID;
langID = GetSystemDefaultLangID();
ttffilename =fontfilename;
pfTTF = _fsopen(ttffilename, "rb", _SH_DENYWR);
if (pfTTF)
{
fseek(pfTTF, 12L, SEEK_SET); // seek to table directory
while (!hasname)
{
if (fread(buffer, sizeof(char), 16, pfTTF) != 16)
break;
if (buffer[0] == 'n' && buffer[1] == 'a'
&& buffer[2] == 'm' && buffer[3] == 'e')
hasname = true;
}
if (hasname)
{
index = (((long)(unsigned char)buffer[8]) << 24)
+ (((long)(unsigned char)buffer[9]) << 16)
+ (((long)(unsigned char)buffer[10]) << 8)
+ (unsigned char)buffer[11];
tablength = (((long)(unsigned char)buffer[12]) << 24)
+ (((long)(unsigned char)buffer[13]) << 16)
+ (((long)(unsigned char)buffer[14]) << 8)
+ (unsigned char)buffer[15];
fseek(pfTTF, index, SEEK_SET); // seek to name table entry
fread(buffer, sizeof(char), 6, pfTTF);
tablrecnum = (((unsigned short)(unsigned char)buffer[2]) << 8)
+ (unsigned char)buffer[3];
stroffset = (((unsigned short)(unsigned char)buffer[4]) << 8)
+ (unsigned char)buffer[5];
for (int i = 0; i<tablrecnum; i++)
{
fseek(pfTTF, (long)(index+6+i*12), SEEK_SET);
if (fread(buffer, sizeof(char), 12, pfTTF) != 12)
break;
platformID = (((unsigned short)(unsigned char)buffer[0]) << 8) + (unsigned char)buffer[1];
encodingID = (((unsigned short)(unsigned char)buffer[2]) << 8) + (unsigned char)buffer[3];
languageID = (((unsigned short)(unsigned char)buffer[4]) << 8) + (unsigned char)buffer[5];
if (languageID != langID && PRIMARYLANGID(languageID) != LANG_ENGLISH)
continue;
nameID = (((unsigned short)(unsigned char)buffer[6]) << 8) + (unsigned char)buffer[7];
if (nameID != 4)
continue;
strlength = (((unsigned short)(unsigned char)buffer[8]) << 8) + (unsigned char)buffer[9];
if (strlength >= 1024)
strlength = 1023;
strnearoffset = (((unsigned short)(unsigned char)buffer[10]) << 8) + (unsigned char)buffer[11];
fseek(pfTTF, (long)(index+stroffset+strnearoffset), SEEK_SET);
if (fread(stringbuf, sizeof(char), strlength, pfTTF) != strlength)
break;
stringbuf[strlength] = '\0';
if (platformID == 3 )
{
int j=0;
p = stringbuf;
strlength /= 2;
while(j < strlength)
{
wstr[j] = ((unsigned char)*p);
wstr[j] = wstr[j] << 8;
p++;
wstr[j] += ((unsigned char)*p);
p++;
j++;
}
wstr[j] = 0;
}
switch(nameID)
{
default:
break;
case 4: // Full fontname
if (platformID == 3 )
fontfullname = wstr;
else
fontfullname = stringbuf;
break;
}
}
}
fclose(pfTTF);
}
else
{
fontfullname = fontfilename.Left(fontfilename.GetLength() - 4);
}
}
</font>
</pre></TD></tr></TABLE></TD></TR></TABLE><font face="宋体,verdana, arial, helvetica" style="font-size: 10pt"></blockquote><br /> |
|