很容易判断当前字体是否支持unicode字符?

时间:2015-12-14 23:13:51

标签: c++ c winapi c++builder

我正在使用Borland C ++ Builder 2009,我会像这样显示右箭头和左箭头:

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

这在Windows 7上运行正常,应用程序使用字体'Segoe UI'。

在XP上我得到一个正方形而不是箭头,我在XP上使用字体“Tahoma”。 换句话说,在XP上的Tahoma中没有提到Unicode字符。

是否有一种简单快捷的方法可以简单地检查当前使用的字体是否支持所请求的Unicode字符? 如果是这样,我可以用'>'替换箭头或'<'。不完美,但足够好。我不想在这个阶段开始更改字体。

您的帮助表示赞赏。

2 个答案:

答案 0 :(得分:7)

您可以使用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的成员数组,可以让您确定字体支持的字符范围。

答案 1 :(得分:2)

仅供参考和Google Gods:

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 */ }