2008-12-31 16 views
5

¿Cuál es la mejor manera de encontrar todas las fuentes del sistema que un usuario tiene disponibles para que se puedan mostrar en un cuadro de selección desplegable?Encontrar fuentes del sistema con Delphi

También me gustaría distinguir entre las fuentes Unicode y las que no son Unicode.

Estoy utilizando Delphi 2009, que es totalmente compatible con Unicode, y me gustaría una solución Delphi.

Respuesta

11

La propiedad Screen.Fonts se completa a través del EnumFontFamiliesEx API function. Busque en Forms.pas un ejemplo de cómo llamar a esa función.

La función de devolución de llamada que llama recibirá un registro TNewTextMetricEx, y uno de los miembros de ese registro es un TFontSignature. El campo fsUsb indica qué Unicode suborganiza los reclamos de fuentes para admitir.

El sistema en realidad no tiene "fuentes Unicode". Incluso las fuentes que tienen la palabra Unicode en sus nombres no tienen glifos para todos caracteres Unicode. Puede distinguir entre mapa de bits, impresora y fuentes TrueType, pero más allá de eso, lo mejor que puede hacer es averiguar si la fuente que está considerando admite los caracteres que desea. Y si la fuente no es lo que consideraría una "fuente Unicode", pero admite todos los caracteres que necesita, entonces ¿qué diferencia tiene? Para obtener esta información, puede estar interesado en GetFontUnicodeRanges.

La tecnología de Microsoft para mostrar texto con fuentes diferentes según qué fuentes contienen qué caracteres es Uniscribe, particularmente font fallback. No conozco ningún soporte de Delphi para Uniscribe; Empecé a escribir un conjunto de unidades de importación una vez, pero mis intereses son inconstantes, y pasé a otra cosa antes de completarla. Michael Kaplan's blog habla de Uniscribe a veces, por lo que es otro lugar para buscar.

8

puedo responder a la mitad de su pregunta, puede obtener una lista de las fuentes que su entorno actual tiene acceso a una lista de cadenas desde el objeto Pantalla Global

es decir

Listbox1.Items.AddStrings(Screen.Fonts); 
4

Usted puede mirar en la fuente forms.pas para ver cómo Codegear llena Screen.Fonts al enumerar las fuentes de Windows. La estructura de LOGFONT devuelta tiene un miembro de conjunto de caracteres, pero esto no proporciona una simple determinación de 'Unicode'.

Por lo que sé Windows no puede decirle explícitamente si una fuente es 'Unicode'. Además, si intenta mostrar texto Unicode en una fuente 'no Unicode', Windows puede sustituir una fuente diferente, por lo que es difícil decir si una fuente mostrará o no Unicode. Por ejemplo, tengo un antiguo archivo de fuente Arial Black que no contiene glifos Unicode, pero si uso esto para mostrar el texto japonés en una nota D2009, el japonés se muestra correctamente en Arial y el resto en Arial Black. En otros ejemplos, pueden aparecer los cuadrados vacíos usuales.

Cuestiones relacionadas