Простой способ узнать, поддерживается ли символ Unicode в текущем шрифте?

Я использую Borland C++ Builder 2009 и отображаю стрелки вправо и влево, например, так:

Button2->Hint = L"Ctrl+\u2190" ;
Button3->Hint = L"Ctrl+\u2192" ; 

Это прекрасно работает в Windows 7, приложение использует шрифт "Segoe UI".

В XP я получаю квадрат вместо стрелок, я использую шрифт Tahoma в XP. Другими словами, упомянутые символы Unicode отсутствуют в Tahoma на XP.

Есть ли простой и быстрый способ просто проверить, поддерживается ли запрошенный символ Unicode в используемом в настоящее время шрифте? Если это так, я мог бы, например, заменить стрелку на ">" или "<". Не идеально, но достаточно хорошо. Я не хочу начинать менять шрифты на этом этапе.

Ваша помощь приветствуется.

2 ответа

Решение

Ты можешь использовать GetFontUnicodeRanges() чтобы увидеть, какие символы поддерживаются шрифтом, выбранным в данный момент в DC. Обратите внимание, что этот API требует, чтобы вы вызывали его один раз, чтобы узнать, насколько большим должен быть буфер, и второй раз, чтобы фактически получить данные.

DWORD dwSize = GetFontUnicodeRanges(hDC, nullptr);
BYTE* bBuffer = new BYTE[dwSize];
GLYPHSET* pGlyphSet = reinterpret_cast<GLYPHSET*>(bBuffer);
GetFontUnicodeRanges(hDC, pGlyphSet);
// use data in pGlyphSet, then free the buffer
delete[] bBuffer;

GLYPHSET структура имеет массив-член ranges который позволяет определить диапазон символов, поддерживаемых шрифтом.

Просто для справки и Google Боги:

bool UnicodeCharSupported(HWND Handle, wchar_t Char)
{
if (Handle)
    {
    DWORD dwSize = GetFontUnicodeRanges(Handle, NULL);
    if (dwSize)
        {
        bool Supported = false ;
        BYTE* bBuffer = new BYTE[dwSize];
        GLYPHSET* pGlyphSet = reinterpret_cast<GLYPHSET*>(bBuffer);
        if (GetFontUnicodeRanges(Handle, pGlyphSet))
            {
            for (DWORD x = 0 ; x < pGlyphSet->cRanges && !Supported ; x++)
                {
                Supported = (Char >= pGlyphSet->ranges[x].wcLow &&
                             Char < (pGlyphSet->ranges[x].wcLow + pGlyphSet->ranges[x].cGlyphs)) ;
                }
            }
        delete[] bBuffer;
        return Supported ;
        }
    }
return false ;
}

Пример, относящийся к моему Вопросу:

if (!UnicodeCharSupported(Canvas->Handle, 0x2190))
    { /* Character not supported in current Font, use different character */ }
Другие вопросы по тегам