利用CFontDialog获取字体属性后,如何从字体名字得到存放该字体的文件路径呢~
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("宋体"),后面的两个参数就能输出结果了,一个是显示名称(显示名和字体名不一定相同,另一个就是存放字体的文件名)。