Если у вас есть токен IDF_MYFONT
, определенный для идентификатора ресурса, то вы можете встроить свой шрифт в исполняемый файл с помощью строки, подобной этой, в вашем .rc
(или .rc2
) сценарии:
IDF_MYFONT BINARY "..\\MyFont.ttf" // Or whatever the path to your font file is.
Вы можете загрузить и заблокировать ресурс шрифта, используя следующий код:
HANDLE hMyFont = INVALID_HANDLE_VALUE; // Here, we will (hopefully) get our font handle
HINSTANCE hInstance = ::GetModuleHandle(nullptr); // Or could even be a DLL's HINSTANCE
HRSRC hFntRes = FindResource(hInstance, MAKEINTRESOURCE(IDF_MYFONT), L"BINARY");
if (hFntRes) { // If we have found the resource ...
HGLOBAL hFntMem = LoadResource(hInstance, hFntRes); // Load it
if (hFntMem != nullptr) {
void* FntData = LockResource(hFntMem); // Lock it into accessible memory
DWORD nFonts = 0, len = SizeofResource(hInstance, ares);
hMyFont = AddFontMemResourceEx(FntData, len, nullptr, &nFonts); // Fake install font!
}
}
Затем, когда вы закончили со шрифтом, вы можете освободить его из памяти следующим образом:
RemoveFontMemResourceEx(hMyFont);
Я включил некоторые проверки возвращаемых значений для системных вызовов, но вы можете добавить другие. И вам нужно будет уметь обрабатывать случаи, когда любой из них дает сбой (например, предоставление шрифта по умолчанию).
Пока шрифт загружается / блокируется в памяти, вы можете использовать его так, как если бы он был установлен насистема: например, используя свое имя в структуре LOGFONT
:
LOGFONT MyLogFont = { -8, 0, 0, 0, 400, FALSE, FALSE, FALSE, ANSI_CHARSET,
OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY,
VARIABLE_PITCH | FF_SWISS, L"MyFontName" };
Не стесняйтесь просить дальнейших разъяснений и / или объяснений.