Предыдущий способ позволял устанавливать шрифт на время работы системы. То есть после перезагрузки Windows приходиться заново его устанавливать. Это способ хорош в том случае если Ваша программа регистрирует шрифт при запуске. А что делать если Вы хотите установить его при инсталляции. Надо сделать следующие шаги
1. Скопировать его в папочку Fonst 2. Зарегистрировать в реестре. 3. Использовать функцию AddResourceFont для того что бы не перезагружать компьютер.
Давайте договоримся что будет использовать имя файла шрифта как имя шрифта. Вообще то это не одно и тоже. Имя файла шрифта например GeoMap.ttf a имя шрифта у него вот такое.
Именно это имя будет использоваться, если добавить шрифт стандартными средствами Windows. Мы с Вами пока будет оперировать именем файла. Это удобно в том плане, что не надо запоминать имя шрифта. Оно же не совпадает с именем файла. Для простоты будет регистрировать под именем файла. Создадим класс CFontInstall. Мы будет пользоваться классами MFC поэтому код будет работать только с поддержкой MFC.
#include "afx.h"
#include "atlbase.h"
#define PATH_FONT "Fonts\\"
#define REGKEY_FONT "Software\\Microsoft\\Windows\\CurrentVersion\\Fonts"
class CFontInstall
{
public:
void RemoveFonts(CString csFile); // удалить шрифт
void InstallFonts(CString csFile, CString csPath); // добавить шрифт
CFontInstall();
virtual ~CFontInstall();
private:
CString GetName(CString csFile); // отрезать расширение
CString GetWinDir(); // папка Windows
void RegisterFont(CString csFile); // регистрировать в реестре
};
Пишем код. Первое это отрезание расширение что бы получить имя.
CString CFontInstall::GetName(CString csFile)
{
CString csTemp=csFile;
csTemp=csTemp.Left(csTemp.Find('.',0)); // найти точку взять все что с лева
return csTemp;
}
Получение системной папки Windows. Кто сказал, что она должны быть только на диске С.
CString CFontInstall::GetWinDir()
{
char buffer[MAX_PATH];
if (GetWindowsDirectory(buffer,MAX_PATH)==0) throw CString("Error GetSystemDirectory");
CString temp(buffer);
temp+="\\";
temp+=PATH_FONT;
return temp;
}
Регистрация в реестре.
void CFontInstall::RegisterFont(CString csFile)
{
CRegKey cKey;
if (cKey.Open(HKEY_LOCAL_MACHINE,REGKEY_FONT)!=ERROR_SUCCESS) throw CString("Error Open Registry");
if (cKey.SetValue(csFile,GetName(csFile))!=ERROR_SUCCESS) throw CString("Error Add Key");
AddFontResource(csFile);
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
}
Непосредственная установка.
void CFontInstall::InstallFonts(CString csFile,CString csPath)
{
CString in=csPath+csFile;
CString out=GetWinDir()+csFile;
if (CopyFile(in,out,FALSE)==0) throw CString("Error Copy");
RegisterFont(csFile);
}
Удаление.
void CFontInstall::RemoveFonts(CString csFile)
{
if (DeleteFile(GetWinDir()+csFile)==0) throw CString("Error Delete ");
CRegKey cKey;
if (cKey.Open(HKEY_LOCAL_MACHINE,REGKEY_FONT)!=ERROR_SUCCESS) throw CString("Error Open Registry");
if (cKey.DeleteValue(GetName(csFile))!=ERROR_SUCCESS) throw CString("Error Delete");
RemoveFontResource(csFile);
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
}
Попробуем ?
#include "stdafx.h"
#include "iostream.h"
#include "FontInstall.h"
#include "conio.h"
void main()
{
CFontInstall cf;
try
{
cf.InstallFonts("geomap.ttf","D:\\VС\\InstallFont\\");
cout << "install" << endl;
getch();
cf.RemoveFonts("geomap.ttf");
cout << "remove" << endl;
}
catch(CString s)
{
cout << s << endl;
}
}
В проекте находится класс CFontInstall упaкованный для использования в Component Gallery как ogx файл.