Простой способ узнать, поддерживается ли символ 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 */ }