利用CFontDialog获取字体属性后,如何从字体名字得到存放该字体的文件路径呢~

woshizhanhun 2009-04-27 11:32:36
DavidHsing的解答
C/C++ code
BOOL GetFontFile(LPCTSTR lpszFontName, CString& strDisplayName, CString& strFontFile)
{
ASSERT(lpszFontName && lpszFontName[0] != 0);

_TCHAR szName[2 * MAX_PATH];
_TCHAR szData[2 * MAX_PATH];

CString strFont = _T("Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts");

strFontFile.Empty();

BOOL bResult = FALSE;

while (GetNextNameValue(HKEY_LOCAL_MACHINE, strFont, szName, szData) == ERROR_SUCCESS)
{
if (strnicmp(lpszFontName, szName, strlen(lpszFontName)) == 0)
{
TRACE(_T("found font\n"));
strDisplayName = szName;
strFontFile = szData;
bResult = TRUE;
break;
}

strFont.Empty(); // this will get next value, same key
}

GetNextNameValue(HKEY_LOCAL_MACHINE, NULL, NULL, NULL); // close the registry key

return bResult;
}

LONG GetNextNameValue(HKEY key, LPCTSTR subkey, LPTSTR szName, LPTSTR szData)
{
static HKEY hkey = NULL;
static DWORD dwIndex = 0;
LONG retval;

if (subkey == NULL && szName == NULL && szData == NULL)
{
TRACE(_T("closing key\n"));
if (hkey)
RegCloseKey(hkey);
hkey = NULL;
return ERROR_SUCCESS;
}

if (subkey && subkey[0] != 0)
{
retval = RegOpenKeyEx(key, subkey, 0, KEY_ALL_ACCESS, &hkey);
if (retval != ERROR_SUCCESS)
{
TRACE(_T("RegOpenKeyEx failed\n"));
return retval;
}
else
{
TRACE(_T("RegOpenKeyEx ok\n"));
}
dwIndex = 0;
}
else
{
dwIndex++;
}

ASSERT(szName != NULL && szData != NULL);

*szName = 0;
*szData = 0;

char szValueName[MAX_PATH];
DWORD dwValueNameSize = sizeof(szValueName)-1;
BYTE szValueData[MAX_PATH];
DWORD dwValueDataSize = sizeof(szValueData)-1;
DWORD dwType = 0;

retval = RegEnumValue(hkey, dwIndex, szValueName, &dwValueNameSize, NULL,
&dwType, szValueData, &dwValueDataSize);
if (retval == ERROR_SUCCESS)
{
TRACE(_T("szValueName=<%s> szValueData=<%s>\n"), szValueName, szValueData);
lstrcpy(szName, (char *)szValueName);
lstrcpy(szData, (char *)szValueData);
}
else
{
TRACE(_T("RegEnumKey failed\n"));
}

return retval;
}




调用很简单,往 GetFontFile 传个名称就可以了,比如 lpszFontName = _T("宋体"),后面的两个参数就能输出结果了,一个是显示名称(显示名和字体名不一定相同,另一个就是存放字体的文件名)。
...全文
541 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshizhanhun 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 DavidHsing 的回复:]
算了,分就算了。
交个朋友吧,呵呵
[/Quote]

O(∩_∩)O哈哈~,多多指教~
DavidHsing 2009-04-27
  • 打赏
  • 举报
回复
算了,分就算了。
交个朋友吧,呵呵

16,548

社区成员

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

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

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