判断当前字体是否支持 unicode 字符的简便方法?

Easy way to tell if unicode character is supported in current font?

我使用的是 Borland C++ Builder 2009,我显示左右箭头,如下所示:

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

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

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

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

感谢您的帮助。

您可以使用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 */ }