2010-05-18 11 views
5

Dado un HFONT, ¿cómo puedo saber si es una fuente de símbolos? Una biblioteca de PDF que estoy usando necesita tratar las fuentes de símbolos de manera diferente, por lo que necesito una forma de decir mediante programación si una fuente determinada es una fuente de símbolos o no.¿Cómo puedo saber si una fuente es una fuente de símbolo?

Respuesta

5

Usa GetObject para obtener las propiedades de la fuente en una estructura LOGFONT. Verifique el miembro lfCharSet; si es SYMBOL_CHARSET, tiene una fuente de símbolo.

+0

¡Día! Estaba leyendo la página de LOGFONT en http://msdn.microsoft.com/en-us/library/dd145037%28v=VS.85%29.aspx y me ganaste con la respuesta ... –

+0

Esto probablemente sea en la práctica, pero en teoría podría fallar. GetObject devuelve una copia de LOGFONT que se utilizó para especificar la fuente. Pero el mapeador de fuentes podría haber sustituido una fuente diferente. Si bien parece extremadamente improbable que sea una fuente de símbolos para una fuente textual (o viceversa), podría suceder en teoría. Así que es mejor que revise el campo tmCharSet en el TEXTMETRIC devuelto por GetTextMetrics, ya que debería representar la fuente real en lugar de la fuente lógica. –

+0

@AdrianMcCarthy Pensé que 'GetObject' devuelve un' LOGFONT' de la fuente que se seleccionó realmente, no la que se solicitó originalmente; Puede valer la pena verificar un experimento, a menos que tengas un enlace que lo corrobore. Si crees que 'GetTextMetrics' es mejor, otra respuesta sería bienvenida. –

1

La respuesta de Mark Ransom va a funcionar el 99.999% del tiempo, pero hay una posibilidad teórica de que podría dar una respuesta incorrecta.

Para evitar esta posibilidad, se debe utilizar para obtener el GetTextMetricsTEXTMETRICS de la fuente real y comprobar si el tmCharSet es SYMBOL_CHARSET.

¿Cuál es la diferencia entre marcar lfCharSet y tmCharSet?

Cuando crea un HFONT, Windows hace una copia interna del LOGFONT. Describe la fuente que desea, que podría ser diferente de la fuente que obtiene.

Al seleccionar HFONT en un contexto de dispositivo (o información), el asignador de fuentes encuentra la fuente real que mejor coincide con el LOGFONT asociado con ese HFONT. Sin embargo, la mejor combinación podría no ser una coincidencia exacta. Por lo tanto, cuando necesite averiguar algo acerca de la fuente real, debe tener cuidado de consultar el HDC en lugar del HFONT.

Si consulta el HFONT con GetObject, acaba de obtener el LOGFONT original. GetObject no dice nada acerca de la fuente real porque no sabe qué fuente real eligió el mapeador de fuentes (o elegirá).

Las API que preguntan acerca de la fuente seleccionada en un DC en particular, como GetTextMetrics, GetTextFace, etc., le darán información acerca de la fuente real.

Para este problema, la respuesta de Mark (usando GetObject) probablemente siempre va a funcionar, porque las probabilidades de que el mapeador de fuentes elija una fuente de símbolos cuando quiere una fuente textual (o viceversa) son minúsculas. Sin embargo, en general, cuando desee saber algo sobre la fuente real, busque la forma de preguntar en el HDC.

Cuestiones relacionadas