Создать ресурс шрифта из байтового массива на Win32 - PullRequest
1 голос
/ 24 января 2020

У меня есть байтовый массив, который содержит содержимое файла чтения в шрифте. Мне бы хотелось, чтобы WinAPI (без Gdi +) создавал из него ресурс шрифта, чтобы я мог использовать его для визуализации текста.

Я знаю только о AddFontResourceExW , который загружает ресурс шрифта из файла, и AddFontMemResourceEx , что звучало как то, что мне нужно, но мне кажется, что это все еще какая-то система ресурсов и данные должны быть предварительно связаны с программой.

Могу ли я каким-то образом преобразовать загруженный массив байтов в ресурс шрифта? (Возможно, не записывая его в файл и затем вызывая AddFontResourceExW)

1 Ответ

2 голосов
/ 24 января 2020

Когда вы загружаете шрифт из скрипта ресурса в память, вы используете код, подобный следующему (вы не добавили языковой тег, поэтому я использую код C / C ++ - дайте мне знать, если это проблема):

    HANDLE H_myfont = INVALID_HANDLE_VALUE;
    HINSTANCE hResInstance = ::GetModuleHandle(nullptr);
    HRSRC ares = FindResource(hResInstance, MAKEINTRESOURCE(IDF_MYID), L"BINARY");
    if (ares) {
        HGLOBAL amem = LoadResource(hResInstance, ares);
        if (amem != nullptr) {
            void *adata = LockResource(amem);
            DWORD nFonts = 0, len = SizeofResource(hResInstance, ares);
            H_myfont = AddFontMemResourceEx(adata, len, nullptr, &nFonts);
        }
    }

Ключевая строка здесь void *adata = LockResource(amem); - это преобразует ресурс шрифта, загруженный как HGLOBAL, в «доступную память» ( документация ). Теперь, предполагая, что ваш байтовый массив имеет правильный формат (см. Ниже), вы, вероятно, могли бы просто передать указатель на него (как void*) при вызове AddFontMemResourceEx. (Вы можете использовать свой известный размер массива вместо вызова SizeofResource.)

Я бы предложил код примерно такой:

    void *my_font_data = (void*)(font_byte_array); // Your byte array data
    DWORD nFonts = 0, len = sizeof(font_byte_array);
    H_myfont = AddFontMemResourceEx(my_font_data, len, nullptr, &nFonts);

, который (надеюсь) даст вам загруженный и Используемый ресурс шрифта.

Когда вы закончите со шрифтом (который после загрузки может использоваться точно так же, как любой системный шрифт), вы можете освободить его с помощью:

    RemoveFontMemResourceEx(H_myfont);

Поскольку у меня нет вашего байтового массива, я не могу (очевидно) проверить эту идею. Однако, если вы попробуете это, сообщите нам, если это работает. (Если это не так, могут быть некоторые другие, относительно простые, шаги, которые необходимо добавить.)

ПРИМЕЧАНИЕ: хотя я не могу сказать 100%, что формат точный «ресурс ресурса шрифта» предполагает, что приведенный выше код работает (для меня) с ресурсом, определенным в скрипте .r c как BINARY с обычным файлом «.ttf», предполагает, что если ваш байтовый массив соответствует формату Windows Font File, он должен работать. Вот как я включил шрифт в качестве встроенного ресурса:

IDF_MYFONT  BINARY  L"..\\Resource\\MyFont.ttf"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...