MFC/VC 安装字体并让字体立刻生效

2023-02-10 10:48:16 2387人已围观 5已点赞 5人已收藏

简介本文介绍一个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下亲测可用,特奉上,供有需要的朋友参考。

更多为你推荐