2015-12-14 19 views
5

は、私は、Borland C++ Builderの2009を使用していると私は右を表示し、左:現在のフォントでUnicode文字がサポートされているかどうかを簡単に確認できますか?そのよう指す矢印を

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

これは、Windows 7上で正常に動作しますが、アプリケーションはフォント「のSegoe UI」を使用しています。

XPでは、矢印の代わりに正方形が表示されます。XPではフォント「Tahoma」を使用します。 言い換えれば、XP上のTahomaにUnicode文字は含まれていません。

現在使用されているフォントで要求されたUnicode文字がサポートされているかどうかを簡単に確認する方法はありますか? たとえば、矢印を「>」または「<」に置き換えることができます。完璧ではないが、十分に良い。私はこの段階でフォントを変更したいとは思わない。

あなたのお手伝いがあります。

+0

これは、特定のプログラミング言語に関連するのではなく、ライブラリ。これらは言語固有のものなので、実際に使用する言語、CまたはC++を提供する必要があります。標準に準拠した方法ではないことに注意してください。 – Olaf

+3

@Olaf CソリューションはC++で使用できるので、私はこの場合両方のタグを使うのは不適切だとは思わない。 Windowsの特定の解決策に関する質問が明確であり、コンパイラが指定されているため、標準にないことは無関係です。 –

+0

@ MarkRansom:CはC++ではありません。 C++にはない互換性のないセマンティクスと機能があります。少なくとも標準Cを使用している場合、qはC11 - または少なくともC99を意味します(C11はほとんどの機能を追加しましたが、セマンティクスは変更しません)。コンパイラが標準に準拠していない場合、コンパイラは壊れているか、少なくとも古いものと呼ばれます。 Windowsでも他のコンパイラを使うことができます。 – Olaf

答えて

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と呼ばれるメンバーのアレイを有します。参考までとGoogleの神々のため

+1

可変サイズのバッファに 'new/delete'の代わりに' std :: vector'を使うことができます。 –

+0

@ MarkRansom真実。 –

+0

@Jonathan、DCとは何ですか?どのようにハンドルを取得できますか? GetDC()? – Peter

1

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

'Char'のマッチを見つけたら、あなたのループから' break'-ingを考えてみてください。 – c00000fd

関連する問題