简介本文介绍一个C++代码片段:MFC/VC 安装字体并让字体立刻生效,感兴趣的朋友可以参考一下。
// 字体是否存在
static bool sg_bIsFontExits;
// 列举本机所有字体回调函数
INT CALLBACK NEnumFontNameProc(LOGFONT *plf, TEXTMETRIC* /*ptm*/, INT /*nFontType*/, LPARAM lParam)
{
CString* strFontName = (CString*)lParam;
if (lstrcmpi(plf->lfFaceName, *strFontName) == 0)
{
sg_bIsFontExits = true;
}
return 1;
}
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;
}
// 安装字体
void InstallFontFile()
{
// 列举本机所有字体
CString strFontName = _T("Digiface");
EnumFontFamilies(GetDC(NULL), (LPTSTR)NULL, (FONTENUMPROC)NEnumFontNameProc, (LPARAM)&(strFontName));
if (!sg_bIsFontExits)
{
// 安装字体
CString strFontPath = _T("");
CString strPath = _T("");
int nPos;
GetModuleFileName(NULL, strPath.GetBufferSetLength(MAX_PATH + 1), MAX_PATH);
strPath.ReleaseBuffer();
nPos = strPath.ReverseFind(_T('\\'));
strPath = strPath.Left(nPos);
strFontPath.Format(_T("%s\\%s.ttf"), strPath, strFontName);
if (!FontInstall(strFontPath))
WriteLog("Digiface.ttf 字体安装失败...");
}
}
注意的是, 让安装的字体立刻生效 注意消息要发送两次:
// 让安装的字体立刻生效 注意消息要发送两次
::SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
本站Win10下亲测可用,特奉上,供有需要的朋友参考。
本文向大家介绍一个C++实战项目:C++实现雪花算法(SnowFlake)产生唯一ID,主要涉及雪花算法、算法知识等,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文介绍一个C++代码片段:如何在C++中删除一个文件目录下的所有文件及目录,感兴趣的朋友可以参考一下。
本文介绍C++实现C++实现8种排序算法,主要包括冒泡排序、插入排序、二分插入排序、希尔排序、直接选择排序、堆排序、归并排序、快速排序,直接上代码,感兴趣的朋友可以参考一下。
本文介绍C++实现线程同步的四种方式:事件对象、互斥对象、临界区、信号量,感兴趣的朋友可以参考一下。
本文介绍C++内存泄漏的检测与定位方法,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:C++实现一个多线程安全的队列容器模板类,主要涉及C++模板类的使用、互斥体实现多线程安全、队列数据结构等知识,具有一定的C++实战价值,感兴趣的朋友可以参考一下。