Given an HFONT, how do I tell if it's a symbol font? A pdf library I'm using needs to treat symbol fonts differently, so I need a way to programatically tell if any given font is a symbol font or not.
The Symbol font contains Times New Roman Greek capitals and lowercase, figures and basic punctuation together with a collection of mathematical signs and general purpose Pi characters. Use for setting mathematical and scientific work and as a compliment to the symbols found in standard fonts.
Windows' Character Map (found in the Programs > Accessories > System Tools menu) shows all the characters in a font in the form of a scrollable grid. From here you can select and copy a character or group of characters into your document.
The easy way to know what is in a font's character set is by viewing the software's glyph panel. For any font, begin by selecting the Entire Font option. From there, view the submenus, investigating categories of glyphs you might be interested in. (These categories closely mirror those in the OpenType panel.)
Right-click your font and select Properties . Select the tab "CharSet/Unicode". If the Font Encoding Type is not Symbol and the Supported Unicode Ranges list anything besides or in addition to Basic Latin and Latin-1 Supplement, your font is a Unicode font or is compatible with Unicode.
Use GetObject to get the font's properties to a LOGFONT structure. Check the lfCharSet member; if it's SYMBOL_CHARSET, you have a symbol font.
Mark Ransom's answer is going to work 99.999% of the time, but there's a theoretical possibility that it could give the wrong answer.
To avoid this possibility, you should use GetTextMetrics
to get the TEXTMETRICS
of the actual font and check if the tmCharSet
is SYMBOL_CHARSET
.
What's the difference between checking lfCharSet
and tmCharSet
?
When you create an HFONT
, Windows makes an internal copy of the LOGFONT
. It describes the font you want, which could be different than the font you get.
When you select the HFONT
into a device (or information) context, the font mapper finds the actual font that best matches the LOGFONT
associated with that HFONT
. The best match, however, might not be an exact match. So when you need to find out something about the actual font, you should take care to query the HDC
rather than the HFONT
.
If you query the HFONT
with GetObject
, you just get the original LOGFONT
back. GetObject
doesn't tell you anything about the actual font because it doesn't know what actual font the font mapper chose (or will choose).
APIs that ask about the font selected into a particular DC, like GetTextMetrics
, GetTextFace
, etc., will give you information about the actual font.
For this problem, Mark's answer (using GetObject
) is probably always going to work, because the odds of the font mapper choosing a symbol font when you want a textual font (or vice versa) are minuscule. In general, though, when you want to know something about the actual font, find a way to ask the HDC
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With