Pregunta

¿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?

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

Estoy usando Delphi 2009, que está totalmente habilitado para Unicode, y me gustaría una solución Delphi.

¿Fue útil?

Solución

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

La función de devolución de llamada a la que llama recibirá un TNewTextMetricEx registro, y uno de los miembros de ese registro es un TFontSignature . El campo fsUsb indica qué Unicode subordina la fuente que afirma admitir.

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

La tecnología de Microsoft para mostrar texto con diferentes fuentes en función de qué fuentes contienen qué caracteres es Uniscribe , especialmente fuente de retorno . No tengo conocimiento de ningún soporte de Delphi para Uniscribe; Comencé a escribir un conjunto de unidades de importación para él una vez, pero mis intereses son inconstantes y pasé a otra cosa antes de completarlo. El blog de Michael Kaplan habla sobre Uniscribe a veces, así que ese es otro lugar para buscar.

Otros consejos

Puedo responder la mitad de tu pregunta, puedes obtener una lista de las fuentes a las que tu entorno actual tiene acceso como una lista de cadenas desde el objeto de pantalla global

es decir,

Listbox1.Items.AddStrings(Screen.Fonts);

Puede buscar en la fuente de forms.pas para ver cómo Codegear rellena Screen.Fonts enumerando las fuentes de Windows. La estructura LOGFONT devuelta tiene un miembro de conjunto de caracteres, pero esto no proporciona una determinación 'Unicode' simple.

Por lo que sé, Windows no puede decirle explícitamente si una fuente es 'Unicode'. Además, si intenta mostrar el 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 de Unicode, pero si lo uso para mostrar texto en japonés en una nota del D2009, el japonés se muestra correctamente en Arial y el resto en Arial Black. En otros ejemplos, pueden aparecer los cuadrados vacíos habituales.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top