High DPI/de

From Lazarus wiki
Jump to navigationJump to search

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

Definition

Jede benutzerdefinierte Textgröße (DPI) mit mehr als 96 DPI (Standard) *.

Benutzerdefinierte Textgröße (High DPI) in Windows festlegen

Unter Windows 7 gehen Sie zu Systemsteuerung > Darstellung und Anpassung > Anzeige. Wählen Sie: Kleiner 100% (Standard), Mittel 125% oder Größer 150%. Wenn Sie 100% (96 DPI) ausgewählt haben, ist das die Standardeinstellung von Windows für den DPI-Wert, aber nicht High DPI. Bei 125% (120 DPI) ist die Option "DPI-Skalierung im Stil von Windows XP verwenden" aktiviert, Anwendungen werden unter diesen Einstellungen wie bei Windows XP skaliert. Bei 150% (144 DPI) ist die Option "DPI-Skalierung im Stil von Windows XP verwenden" deaktiviert (die DPI Virtualisierung ist aktiviert), Anwendungen die mit dieser Einstellung ablaufen müssen selbst die Hochauflösung verwalten ("High DPI Awareness") ansonsten liefert die Skalierung des Systems ein verwischtes, unscharfes Bild. Sie können den DPI-Wert auch mit dem Dialog "Benutzerdefinierte Textgröße (DPI) festlegen" einstellen und die DPI Virtualisierung aktivieren/ deaktivieren.

Hochauflösender Text in Lazarus

Mit Lazarus erzeugen Sie eine Anwendung für hochauflösende Schriftgrößen unter Windows 7 mit den folgenden Schritten. Wir benutzen nicht ScaleBy & ScaleControls, weil diese sehr fehlerbehaftet sind.

SCHRITT 1 - High DPI Awareness deklarieren

Dazu brauchen Sie eine Manifest-Datei die diese Deklaration enthält. Mit der neuesten Lazarus Unterversion erreichen Sie dies mit Ansicht > Projekteinstellungen > dann wählen Sie die Optionen "Themen mit Manifest-Datei einschalten (nur in Windows)" und "dpi-abhängige Anwendung (für Vista +)".

Andernfalls kopieren Sie den untenstehenden Code und speichern ihn in einer Textdatei names "manifest.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>

Speichern Sie die folgende Codezeile in einer Textdatei namens "manifest.rc":

 1 24 "manifest.xml"

Dann kopieren Sie beide Dateien in den Hauptordner Ihres Projekts:

 MyProject\manifest.xml
 MyProject\manifest.rc

Und schließen Sie sie in Ihrem Projekt ein:

<delphi>implementation

{$R *.lfm} {$R manifest.rc} // Durch dieses Windows Manifest werden Themen und High DPI aktiviert</delphi>

SCHRITT 2 - Skalieren der Formulare und Steuerelemente

Dazu rufen Sie die folgende Prozedur 'ScaleDPI' im Ereignis 'OnCreate' eines jeden Formulars aus Ihrem Projekt auf.

Kopieren Sie zuerst den nachfolgenden Code und speichern Sie ihn in einer Textdatei als "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>

Kopieren Sie diese Datei "uscaledpi.pas" in den Hauptordner Ihres Projekts:

 MyProject\uscaledpi.pas
 

Fügen Sie im Abschnitt "uses" von Ihrem Projekt den Ausdruck "uScaleDPI" hinzu:

<delphi>unit form1;

{$mode objfpc}{$H+}

interface

uses

 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
 uScaleDPI; // This includes ScaleDPI procedure </delphi>

Das OnCreate-Ereignis jedes Formulars ruft die Prozedur so auf:

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

 if Screen.PixelsPerInch <> 96 then begin
   ScaleDPI(Self,96); // 96 ist der DPI-Wert beim Entwurf des Formulars  
 end;

end;</delphi>

Externe Links