具体代码在下面有贴出。具体工程下载:下载地址
安装代码:
void CInstallFontDemoDlg::OnBnClickedButton1()//安装字体
{
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Font File(*.ttf)|*.ttf; |Font File(*.otf)|*.otf; ||"), NULL);
if (dlg.DoModal() != IDOK)
return;
CString strPath = dlg.GetPathName();
// 文件名
int nIndex = strPath.ReverseFind('\\');
CString strFileName = strPath.Right(strPath.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(strPath, strSysFontInstall, FALSE))
{
int nErr = GetLastError();
CString strTip;
strTip.Format(_T("拷贝字体到系统字体目录失败! 错误码:%d"), nErr);
AfxMessageBox(strTip);
return;
}
// 添加字体到系统字体库,操作需要程序具有管理员权限
int _nFontNum = AddFontResource(strSysFontInstall);
if (_nFontNum <= 0)
{
int nErr = GetLastError();
CString strTip;
strTip.Format(_T("添加字体到系统字体库失败! 错误码:%d"), nErr);
AfxMessageBox(strTip);
return;
}
// 向注册表注册字体,操作需要程序具有管理员权限
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));
RegCloseKey(phkResult);
// 让安装的字体立刻生效 注意消息要发送两次
//::SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
//::SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
AfxMessageBox(_T("安装字体成功!"));
}
卸载代码:
void CInstallFontDemoDlg::OnBnClickedButton2()//卸载字体
{
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Font File(*.ttf)|*.ttf; |Font File(*.otf)|*.otf; ||"), NULL);
if (dlg.DoModal() != IDOK)
return;
CString strPath = dlg.GetPathName();
// 文件名
int nIndex = strPath.ReverseFind('\\');
CString strFileName = strPath.Right(strPath.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 (!RemoveFontResource(strSysFontInstall))
{
int nErr = GetLastError();
CString strTip;
strTip.Format(_T("从系统字体库删除字体失败! 错误码:%d"), nErr);
AfxMessageBox(strTip);
return;
}
// 删除系统字体,操作需要程序具有管理员权限
if (!DeleteFile(strSysFontInstall))
{
int nErr = GetLastError();
CString strTip;
strTip.Format(_T("删除系统字体失败! 错误码:%d"), nErr);
AfxMessageBox(strTip);
return;
}
// 向注册表删除字体,操作需要程序具有管理员权限
HKEY phkResult;
CString strKey = _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Fonts") ;
LSTATUS st = RegOpenKeyEx(HKEY_LOCAL_MACHINE, strKey, 0, KEY_QUERY_VALUE | KEY_WRITE, &phkResult);
if (st == ERROR_SUCCESS)
{
st = RegDeleteValue(phkResult, strFontName);
RegCloseKey(phkResult);
AfxMessageBox(_T("卸载字体成功!"));
}
}