Windows 系统中如何从字体的face name得到字体文件路径?

alphasun 2003-11-26 04:32:52
rt

谢谢
...全文
455 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
alphasun 2003-11-27
  • 打赏
  • 举报
回复
Windows 字体对话框中的 face name 可以从 ttf 之类的字体文件总取得吗?
alphasun 2003-11-27
  • 打赏
  • 举报
回复
当 ttRecord.uLanguageID == 1032 时,你可以得到中文的 face name,不过这个是unicode的,而且是 motolora 字节序,要小心取得。 2308 时是英文的。

程序下载 http://www.codeproject.com/gdi/fontnamefromfile/fontnamefromfile_demo.zip


CFile f;
BOOL bRetVal = FALSE;

if(f.Open(lpszFilePath, CFile::modeRead|CFile::shareDenyWrite)){
TT_OFFSET_TABLE ttOffsetTable;
f.Read(&ttOffsetTable, sizeof(TT_OFFSET_TABLE));
ttOffsetTable.uNumOfTables = SWAPWORD(ttOffsetTable.uNumOfTables);
ttOffsetTable.uMajorVersion = SWAPWORD(ttOffsetTable.uMajorVersion);
ttOffsetTable.uMinorVersion = SWAPWORD(ttOffsetTable.uMinorVersion);

//check is this is a true type font and the version is 1.0
if(ttOffsetTable.uMajorVersion != 1 || ttOffsetTable.uMinorVersion != 0)
return bRetVal;

TT_TABLE_DIRECTORY tblDir;
BOOL bFound = FALSE;
CString csTemp;

for(int i=0; i< ttOffsetTable.uNumOfTables; i++){
f.Read(&tblDir, sizeof(TT_TABLE_DIRECTORY));
strncpy(csTemp.GetBuffer(5), tblDir.szTag, 4);
csTemp.ReleaseBuffer(4);
if(csTemp.CompareNoCase(_T("name")) == 0)
{
bFound = TRUE;
tblDir.uLength = SWAPLONG(tblDir.uLength);
tblDir.uOffset = SWAPLONG(tblDir.uOffset);
break;
}
else if(csTemp.IsEmpty())
{
break;
}
}

if(bFound){
f.Seek(tblDir.uOffset, CFile::begin);
TT_NAME_TABLE_HEADER ttNTHeader;
f.Read(&ttNTHeader, sizeof(TT_NAME_TABLE_HEADER));
ttNTHeader.uNRCount = SWAPWORD(ttNTHeader.uNRCount);
ttNTHeader.uStorageOffset = SWAPWORD(ttNTHeader.uStorageOffset);
TT_NAME_RECORD ttRecord;
bFound = FALSE;

for(int i=0; i<ttNTHeader.uNRCount; i++)
{
f.Read(&ttRecord, sizeof(TT_NAME_RECORD));
ttRecord.uNameID = SWAPWORD(ttRecord.uNameID);
ttRecord.uStringLength = SWAPWORD(ttRecord.uStringLength);
ttRecord.uStringOffset = SWAPWORD(ttRecord.uStringOffset);

if(1/*ttRecord.uNameID == 1 || ttRecord.uNameID == 0 || ttRecord.uNameID == 7*/)
{
int nPos = f.GetPosition();
f.Seek(tblDir.uOffset + ttRecord.uStringOffset + ttNTHeader.uStorageOffset, CFile::begin);
csTemp.Empty();
int nLen = f.Read(csTemp.GetBuffer(ttRecord.uStringLength), ttRecord.uStringLength);
csTemp.ReleaseBuffer();
TRACE("[%d] len= %d, platform %d, lang %d, encode %d, name id %d>> %s\n",
ttRecord.uNameID,
nLen,
ttRecord.uPlatformID,
ttRecord.uLanguageID,
ttRecord.uEncodingID,
ttRecord.uNameID,
csTemp);

if(csTemp.GetLength() > 0)
{
switch(ttRecord.uNameID)
{
case 1:
lpFontProps->csFamily.IsEmpty() ? lpFontProps->csFamily = csTemp : void(0);
bRetVal = TRUE;
break;
case 0:
lpFontProps->csCopyright.IsEmpty() ? lpFontProps->csCopyright = csTemp : void(0);
break;
case 7:
lpFontProps->csTrademark.IsEmpty() ? lpFontProps->csTrademark = csTemp : void(0);
break;
case 4:
lpFontProps->csName.IsEmpty() ? lpFontProps->csName = csTemp : void(0);
break;
default:
break;
}
}
f.Seek(nPos, CFile::begin);
}
}
}
f.Close();
if(lpFontProps->csName.IsEmpty())
lpFontProps->csName = lpFontProps->csFamily;
}
return bRetVal;
topwork 2003-11-27
  • 打赏
  • 举报
回复
说说怎么搞的,我想听听。谢谢。
alphasun 2003-11-27
  • 打赏
  • 举报
回复
ttf 的已经被我搞定了,ttc 得有人能搞定吗?
topwork 2003-11-26
  • 打赏
  • 举报
回复
我再在下班的路上好好想想,回家后再发贴。
alphasun 2003-11-26
  • 打赏
  • 举报
回复
一个字体文件中可能会包含多种 face
alphasun 2003-11-26
  • 打赏
  • 举报
回复
不行的, filename != facename

filename.ttf != facename.ttf

比如说
仿宋_GB2312.ttf 是不存在的。况且,系统中的字体文件不见得都是 .ttf 的,还有.ttc, .fon 等
topwork 2003-11-26
  • 打赏
  • 举报
回复
有了,用我刚才的代码,再拼上facename,然后再拼上.ttf就ok了。
topwork 2003-11-26
  • 打赏
  • 举报
回复
下面一句可以得到系统字体目录,可能还不能完成你的需求:
char szBuf[MAX_PATH] = {0};
SHGetSpecialFolderPath(m_hWnd , szBuf , CSIDL_FONTS , FALSE);
alphasun 2003-11-26
  • 打赏
  • 举报
回复
这个问题一点也不奇怪。
我在我的程序中采用了 freetype,它可以接受一个字体文件,然后帮你在 OpenGL 中绘制漂亮的文字。

当然,我会向用户提供字体选择对话框。于是问题就来了,字体选择对话框得到的是 face name,但是 freetype 却需要 font file name,所以,我需要一种 face name 和 font file name 对应的方法。
alphasun 2003-11-26
  • 打赏
  • 举报
回复
或者,如何从 facename 得到字体文件?
zhucde 2003-11-26
  • 打赏
  • 举报
回复
奇怪的问题

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧