直接上代码:
// 安装字体
static BOOL FontInstall(CString strFontFilePath_)
{
if (strFontFilePath_.IsEmpty() ||
!PathFileExists(strFontFilePath_))
{
return FALSE;
}
// 文件名
int _nIndex = strFontFilePath_.ReverseFind('\\');
CString _strFileName = strFontFilePath_.Right(strFontFilePath_.GetLength() - _nIndex - 1);
// 字体名
_nIndex = _strFileName.ReverseFind('.');
CString _strFontName = _strFileName.Left(_nIndex);
// 系统字体路径
TCHAR _szWinDir[MAX_PATH] = { NULL };
GetWindowsDirectory(_szWinDir, MAX_PATH);
CString _strSysFontPath(_szWinDir);
_strSysFontPath += _T("\\Fonts\\");
CString _strSysFontInstall = _strSysFontPath + _strFileName;
// 拷贝字体到系统字体目录
if (!CopyFile(strFontFilePath_, _strSysFontInstall, FALSE))
{
//return FALSE;
}
// 添加字体到系统字体库
int _nFontNum = AddFontResource(_strSysFontInstall);
if (_nFontNum <= 0)
{
//return FALSE;
}
// 向注册表注册字体
HKEY _phkResult;
DWORD _dwRegResult = 0;
RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts"),
0, _T("REG_SZ"), 0, KEY_WRITE, 0, &_phkResult, &_dwRegResult);
RegSetValueEx(_phkResult, _strFontName, 0, REG_SZ, (LPBYTE)_strFileName.GetBuffer(), (_tcslen(_strFileName) + 1)*sizeof(TCHAR));
//int _nLength = _strFileName.GetLength();
//std::wstring _sFileName = _strFileName.GetBuffer(_nLength);
//BYTE* _byValue = (BYTE*)_sFileName.c_str();
//RegSetValueEx(_phkResult, _strFontName, 0, REG_SZ, _byValue, _nLength);
RegCloseKey(_phkResult);
// 让安装的字体立刻生效 注意消息要发送两次
::SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
return TRUE;
}
注意的是, 让安装的字体立刻生效 注意消息要发送两次:
::SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
个人Win10下亲测可用,特奉上,供有需要的程序员参考。