Difference between revisions of "High DPI/es"

From Lazarus wiki
Jump to navigationJump to search
Line 8: Line 8:
  
 
== High DPI en Lazarus ==
 
== High DPI en Lazarus ==
Con Lazarus debemos seguir estos pasos para hacer una aplicación para Windows 7. No estoy usando ScaleBy ni ScaleControls porque tienen muchos bugs para este propósito.
+
Con Lazarus debemos seguir estos pasos para hacer una aplicación "High DPI Awareness" para Windows 7. No estoy usando ScaleBy ni ScaleControls porque tienen muchos bugs para este propósito.
  
 
=== PASO 1 - Declarar High DPI ===
 
=== PASO 1 - Declarar High DPI ===
Para hacer esto necesitamos un archivo de manifiesto que incluya la declaración, con las subversiones mas nuevas de Lazarus podemos hacer esto en las Opciones > Opciones del proyecto > y seleccionar las opciones "Usar el archivo de manifiesto para habilitar temas (solo Windows)" y "Aplicación 'DPI-Aware' (para Vista+)".
+
Para hacer esto necesitamos un archivo de manifiesto que incluya la declaración, con las subversiones mas nuevas de Lazarus podemos hacer esto entrando a Opciones > Opciones del proyecto > y seleccionando las opciones "Usar el archivo de manifiesto para habilitar temas (solo Windows)" y "Aplicación 'DPI-Aware' (para Vista+)".
  
Sino copia el siguiente código y guardalo en un archivo de texto llamado "manifiesto.xml":
+
Sino puedes copiar el siguiente código y guardarlo en un archivo de texto llamado "manifiesto.xml":
  
 
<xml><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 
<xml><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
Line 43: Line 43:
 
</assembly></xml>
 
</assembly></xml>
  
Y guarda el siguiente código a un archivo de texto llamado "manifiesto.rc":
+
Y guardar el siguiente código a un archivo de texto llamado "manifiesto.rc":
  
 
   1 24 "manifest.xml"
 
   1 24 "manifest.xml"
  
Luego copia esos archivos a la carpeta principal de tu proyecto:
+
Luego copia esos archivos a la carpeta principal del proyecto:
  
 
   MiProyecto\manifiesto.xml
 
   MiProyecto\manifiesto.xml
 
   MiProyecto\manifiesto.rc
 
   MiProyecto\manifiesto.rc
  
Luego incluyelo en el proyecto:
+
Luego incluirlo en el proyecto:
  
 
<delphi>implementation
 
<delphi>implementation
Line 60: Line 60:
  
 
=== PASO 2 - Escalar Formas (Forms) y Controles (Controls) ===
 
=== PASO 2 - Escalar Formas (Forms) y Controles (Controls) ===
Para hacer esto podemos llamar el procedimiento ScaleDPI en el evento OnCreate de cada forma en tu proyecto.
+
Para hacer esto podemos llamar el procedimiento ScaleDPI en el evento OnCreate de cada forma del proyecto.
  
 
Primero copia el siguiente código y guardalo a un archivo de texto "uscaledpi.pas":
 
Primero copia el siguiente código y guardalo a un archivo de texto "uscaledpi.pas":
Line 102: Line 102:
 
end.</delphi>
 
end.</delphi>
  
Copia el archivo "uscaledpi.pas" a la carpeta principal de tu proyecto:
+
Copia el archivo "uscaledpi.pas" a la carpeta principal del proyecto:
  
 
   MiProyecto\uscaledpi.pas
 
   MiProyecto\uscaledpi.pas
 
    
 
    
En la sección "uses" de tu proyecto debes agregar "uScaleDPI":PI":
+
En la sección "uses" del proyecto agrega "uScaleDPI":PI":
  
 
<delphi>unit form1;
 
<delphi>unit form1;
Line 122: Line 122:
 
<delphi>procedure TForm1.FormCreate(Sender: TObject);
 
<delphi>procedure TForm1.FormCreate(Sender: TObject);
 
begin
 
begin
   ScaleDPI(Self,96); // 96 es la configuración de DPI cuando diseñabas la Forma1 (Form1)   
+
   ScaleDPI(Self,96); // 96 es la configuración de DPI cuando diseñaste la Forma1 (Form1)   
 
end;</delphi>
 
end;</delphi>
  

Revision as of 20:34, 23 January 2011

Deutsch (de) English (en) español (es) русский (ru)

Definicion

Cualquier configuración personalizada de DPI mayor a 96 DPI (la configuración predeterminada) *.
En español debe emplearse el término PPP (Puntos por pulgada) que es la traducción de "DPI" (Dots per inch), "High DPI" sería "PPP elevado" o "Configuración elevada de PPP", "High DPI Awareness" sería aplicación "Consciente de la configuración elevada de PPP".

Configurando High DPI en Windows

En Windows 7 ve al Panel de Control > Pantalla. Elije Más pequeño 100% (predeterminado), Mediano 125% o Más grande 150%. Si elijes 100% (96 DPI) es la configuración predeterminada de DPI de Windows, no es High DPI. Si elijes 125% (120 DPI) la opción "Usar ajuste de ppp con el estilo de Windows XP" esta activada, las aplicaciones que ejecutes con esta configuración son escaladas como en Windows XP. Si elijes 150% (144 DPI) la opción "Usar ajuste de ppp con el estilo de Windows XP" esta desactivada (Virtualización de DPI activada), las aplicaciones que ejecutes con esta configuración deben ser "High DPI Awareness", sino serán escaladas por el sistema como si se tratara de una imagen blureada. También puede establecer una configuración personalizada de DPI en la opción "Establecer tamaño de texto personalizado (PPP)" y activar/desactivar la Virtualización de DPI. La mejor manera de entender esto es cambiar las opciones y ejecutar aplicaciones bajo las distintas configuraciones.

High DPI en Lazarus

Con Lazarus debemos seguir estos pasos para hacer una aplicación "High DPI Awareness" para Windows 7. No estoy usando ScaleBy ni ScaleControls porque tienen muchos bugs para este propósito.

PASO 1 - Declarar High DPI

Para hacer esto necesitamos un archivo de manifiesto que incluya la declaración, con las subversiones mas nuevas de Lazarus podemos hacer esto entrando a Opciones > Opciones del proyecto > y seleccionando las opciones "Usar el archivo de manifiesto para habilitar temas (solo Windows)" y "Aplicación 'DPI-Aware' (para Vista+)".

Sino puedes copiar el siguiente código y guardarlo en un archivo de texto llamado "manifiesto.xml":

<xml><?xml version="1.0" encoding="UTF-8" standalone="yes"?>

 <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"><description>Windows Shell</description>
 <dependency>
     <dependentAssembly>
         <assemblyIdentity
             type="win32"
             name="Microsoft.Windows.Common-Controls"
             version="6.0.0.0"
             processorArchitecture="*"
             publicKeyToken="6595b64144ccf1df"
             language="*"
         />
     </dependentAssembly>
 </dependency>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
     <security>
         <requestedPrivileges>
             <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
         </requestedPrivileges>
     </security>
 </trustInfo>
 <application xmlns="urn:schemas-microsoft-com:asm.v3">
     <windowsSettings>
         <dpiAware  xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
     </windowsSettings>
 </application>

</assembly></xml>

Y guardar el siguiente código a un archivo de texto llamado "manifiesto.rc":

 1 24 "manifest.xml"

Luego copia esos archivos a la carpeta principal del proyecto:

 MiProyecto\manifiesto.xml
 MiProyecto\manifiesto.rc

Luego incluirlo en el proyecto:

<delphi>implementation

{$R *.lfm} {$R manifiesto.rc} // Esto incluye el Manifiesto de Windows para habilitar Temas e High DPI</delphi>

PASO 2 - Escalar Formas (Forms) y Controles (Controls)

Para hacer esto podemos llamar el procedimiento ScaleDPI en el evento OnCreate de cada forma del proyecto.

Primero copia el siguiente código y guardalo a un archivo de texto "uscaledpi.pas":

<delphi>unit uscaledpi;

{$mode objfpc}{$H+}

interface

uses

 Graphics, Controls;
 

procedure ScaleDPI(Control: TControl; FromDPI: Integer);

implementation

procedure ScaleDPI(Control: TControl; FromDPI: Integer); var

 n: Integer;
 WinControl: TWinControl;

begin

 with Control do begin
   Left:=ScaleX(Left,FromDPI);
   Top:=ScaleY(Top,FromDPI);
   Width:=ScaleX(Width,FromDPI);
   Height:=ScaleY(Height,FromDPI);
 end;
 if Control is TWinControl then begin
   WinControl:=TWinControl(Control);
   if WinControl.ControlCount > 0 then begin
     for n:=0 to WinControl.ControlCount-1 do begin
       if WinControl.Controls[n] is TControl then begin
         ScaleDPI(WinControl.Controls[n],FromDPI);
       end;
     end;
   end;
 end;

end;

end.</delphi>

Copia el archivo "uscaledpi.pas" a la carpeta principal del proyecto:

 MiProyecto\uscaledpi.pas
 

En la sección "uses" del proyecto agrega "uScaleDPI":PI":

<delphi>unit form1;

{$mode objfpc}{$H+}

interface

uses

 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs
 uScaleDPI; // Esto incluye el procedimiento ScaleDPI </delphi>

En el evento OnCreate de cada forma llama el procedimiento en esta forma:

<delphi>procedure TForm1.FormCreate(Sender: TObject); begin

 ScaleDPI(Self,96); // 96 es la configuración de DPI cuando diseñaste la Forma1 (Form1)  

end;</delphi>

Links Externos