delphi preferences dpi

Delphi: manejo de la preferencia de fuente del usuario



preferences dpi (6)

Kogus tuvo la idea correcta, pero omitió la función que necesita usar. Sería la rutina de Windows GetTextExtentPoint32 . Le pasa una cuerda y calcula el ancho y la altura de la cadena con la fuente seleccionada actualmente. Lo encontrará en Windows.pas.

Es posible que desee calcular de antemano cuál es el espacio máximo que necesitaría para las fuentes que permite.

O puede usar la función para ajustar dinámicamente el tamaño del área que muestra el texto para que encaje.

Esto estaría bien para uno o dos controles, pero cualquier método sería mucho trabajo si estás intentando hacer esto en toda tu interfaz de usuario.

He creado la llamada que obtiene la preferencia de fuente de UI del usuario (a diferencia de la opción codificada de Borland de "MS Sans Serif").

Supongamos que la preferencia de fuente del usuario es:

Segoe Print, 15pt

Establecí la fuente de todos los artículos, en todos los formularios, en todas las aplicaciones para:

Segoe Print, 15pt

El problema es que las cosas ahora están cortadas. Los botones son demasiado pequeños, demasiado angostos, demasiado cortos. El texto en las etiquetas está cortado, etc.

El formulario tiene su propiedad Escala, pero eso no cambia según el tamaño de fuente. La propiedad escalada escalado el formulario cuando se serializa en función de la altura del número "0".

No puedo encontrar nada en la ayuda sobre cómo Borland me propuso apoyar las preferencias de la aplicación de Windows del usuario.

¿Cómo manejo las preferencias de fuentes del usuario?

Nota: crucé esto desde el servidor del grupo de noticias de Embargadero, ya que el servidor de noticias de Embargadero parece estar muriendo, o censurando, o roto, o requiriendo un inicio de sesión.

Actualización 1

Estoy hablando de la preferencia de fuente de un usuario, no de la configuración de DPI. es decir: imagina el siguiente pseudo-código neutral del lenguaje :

procedure TForm1.FormCreate(Sender: TObject); var FontFace: string; FontHeight: Integer; begin GetUserFontPreference(out FontFace, out FontHeight); Self.Font.Name := FontFace; Self.Font.Height := FontHeight; end;

Nota: Este no es mi código real (después de todo es un seudocódigo que es neutro para el idioma). Pero, además, debe examinar recursivamente todos los controles del formulario, cambiando la fuente cuando deba modificarse. Cuando una fuente tiene un estilo diferente aplicado que su elemento primario (por ejemplo, en negrita) y ya no hereda de su elemento primario, debe configurarse manualmente.

Según la solicitud de lkessler , aquí está el código para recuperar la preferencia de fuente de UI del usuario de Windows:

procedure GetUserFontPreference(out FaceName: string; out PixelHeight: Integer); var lf: LOGFONT; begin ZeroMemory(@lf, SizeOf(lf)); //Yes IconTitleFont (not SPI_GETNONCLIENTMETRICS MessageFont) if SystemParametersInfo(SPI_GETICONTITLELOGFONT, SizeOf(lf), @lf, 0) then begin FaceName := PChar(Addr(lf.lfFaceName[0])); PixelHeight := lf.lfHeight; end else begin { If we can''t get it, then assume the same non-user preferences that everyone else does. } FaceName := ''MS Shell Dlg 2''; PixelHeight := 8; end; end;

Preguntas relacionadas


Me siento contigo. Pero para ser justos: la disposición adecuada de la GUI simplemente no se puede crear con un mecanismo de diseño basado en píxeles como el empleado por el VCL. Lo que se necesita es un motor de diseño dinámico, que establece controles solo después

  1. la fuente adecuada se ha establecido para cada control (esto depende de la versión de Windows, las preferencias del usuario y, por último, pero no menos importante, del tipo de control); y

  2. el texto en el control se ha traducido a la configuración regional actual, porque esto puede disminuir o aumentar el espacio necesario para el control.

Como todo esto depende de las propiedades del tiempo de ejecución al crear diálogos al colocar controles, no pueden funcionar. Mecanismos de diseño como los de GTK y QT o los sizers en wxWidgets son más adecuados.

No sé de nada para los programas de Delphi. Lo que hago en algunos programas es el dimensionamiento manual y el posicionamiento de los controles después de la configuración de la fuente y la traducción del texto. Mucho trabajo, pero dependiendo de tu audiencia puede valer la pena.

También puede consultar el código que Jordan Russell escribió para Inno Setup. No usa la propiedad Scaled de formularios, pero tiene un código escrito para escalar controles personalizados. Tal vez también funcione para fuentes muy grandes en pantallas con alta DPI; Me doy cuenta de que al menos en mi 124 DPI, los cuadros de diálogo de configuración de la pantalla del portátil se ven bastante bien.


Para hacer esto bien, creo que tendrías que:

1 - Cargar la preferencia de fuente del usuario

2 - Aplicarlo como has descrito

3 - Determine el ancho y la altura de todos los subtítulos (en píxeles) y compárelos con el ancho y el alto del control, y ajuste en consecuencia.

Desafortunadamente, la parte de "ajustar en consecuencia" es difícil. Podría ampliar un botón, pero luego debería comprobar si se superpone con otro control.

Su mejor opción podría ser crear controles ligeramente sobredimensionados, y esperar que el usuario no elija un tamaño de letra de 32 puntos.


Primero, para que quede claro, Borland ya no es dueño de Delphi. Embarcadero ahora es dueño de Delphi, y ahora estamos en manos seguras y protegidas.

De acuerdo, a tu pregunta.

El truco es establecer TForm.AutoScroll en False Y asegúrese de que su máquina de desarrollo esté configurada en fuentes pequeñas. Dejando TForm. Escalado solo (su valor predeterminado es True).

Así es como lo hacemos internamente aquí, y el IDE maneja todo muy bien.


Yo diría que esto fue similar a la traducción. En nuestra aplicación, hemos creado botones, etiquetas, ediciones, todo un poco más grande para que las palabras más largas que necesitan algunos idiomas se puedan acomodar fácilmente. No duele un poco el diseño.


Me gusta usar esta función. Está basado en Graphics.GetFontData

procedure SystemFont(Font: TFont); var LogFont: TLogFont; begin if SystemParametersInfo(SPI_GETICONTITLELOGFONT, SizeOf(TLogFont), @LogFont, 0) then begin Font.Height := LogFont.lfHeight; Font.Orientation := LogFont.lfOrientation; Font.Charset := TFontCharset(LogFont.lfCharSet); Font.Name := PChar(@LogFont.lfFaceName); Font.Style := []; if LogFont.lfWeight >= FW_BOLD then Font.Style := Font.Style + [fsBold]; if LogFont.lfItalic = 1 then Font.Style := Font.Style + [fsItalic]; if LogFont.lfUnderline = 1 then Font.Style := Font.Style + [fsUnderline]; if LogFont.lfStrikeOut = 1 then Font.Style := Font.Style + [fsStrikeOut]; case LogFont.lfPitchAndFamily and $F of VARIABLE_PITCH: Font.Pitch := fpVariable; FIXED_PITCH: Font.Pitch := fpFixed; else Font.Pitch := fpDefault; end; end; end;

Simplemente utilízalo en todos los eventos TForm.OnCreate. Una alternativa podría ser crear una nueva clase que haga esto en la creación o en el bucle de Screen.Forms.

Si cambia algunas de las propiedades de la fuente predeterminada de cualquiera de los controles en el formulario, seguirá utilizando la fuente anterior. Si desea propiedades personalizadas en algunos controles, tendrá que ajustarlos después de llamar a SystemFont.

Cambiar Graphics.DefFontData en tiempo de ejecución podría ayudar si el diseñador de formularios solo escribió las propiedades modificadas en los archivos .dfm.