2017-06-17 3 views
-1

Nach meiner Erfahrung habe ich bemerkt, dass es 3 Arten von Anwendungen:Wie werden die Steuerelemente im Formular unabhängig von der DPI des Systems mit derselben Größe und Position angezeigt?

  1. diejenigen, die zusammen mit Windows-DPI-Einstellung und erhält skaliert korrekt erhalten.

  2. diejenigen, die immer alles auf der gleichen Pixelposition halten und nicht alles skalieren (das ist, was ich will).

  3. diejenigen, die mit Nicht-Standard-DPI-Einstellungen nicht bewältigen können, so dass ihre Kontrollen überall sind. Solche Programme empfehlen dem Benutzer manchmal, seine DPI-Einstellungen zu ändern.

Ich weiß schon, dass es SetProcessDPIAwareness() und SetProcessDPIAware() Funktionen in dem Win32-API und Scaled und PixelsPerInch Eigenschaften in der TForm Klasse.

ich mit diesen Dingen experimentiert habe, suchten im Internet, aber ich habe keinen festen Ansatz gefunden oder entwickelt.

+0

Erlauben Sie mir, anderer Meinung zu sein: dass Benutzer fragt nach „verhalten gut“. Ich weiß nicht einmal, was er damit meint. Sie denken, er meint, mit der gleichen Größe und Position unabhängig von DPI des Systems erscheinen? –

+0

Nur um die Dinge zu verdeutlichen: Der obige Kommentar ist eine Antwort an Ken White, der die Frage als Duplikat kennzeichnet. –

Antwort

1

Um das zu erreichen, was Sie wünschen:

  1. Declare in Ihrer Anwendung manifestieren, dass Ihr Programm ist DPI bewusst. Dadurch wird sichergestellt, dass das System Ihr Programm nicht als Teil des Fensterzusammensetzungsmechanismus skaliert.
  2. Stellen Sie die Scaled Eigenschaft für jedes Formular False. Dies stellt sicher, dass das Formular und seine Steuerelemente nicht auf das vorherrschende DPI skaliert werden.

in Ihrer Anwendung manifest ist die richtige Einstellung:

<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3"> 
    <asmv3:windowsSettings 
     xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> 
    <dpiAware>True/PM</dpiAware> 
    </asmv3:windowsSettings> 
</asmv3:application> 

Es ist wichtig, um das Programm zu erklären, pro Monitor DPI bewusst zu sein. Wenn Sie andernfalls nur die System-DPI-Awareness deklarieren, können Sie immer noch feststellen, dass Fenster vom Fensterzusammensetzungsmechanismus skaliert werden.

Schließlich, wenn Sie Seattle oder höher verwenden, die selbst unterstützt pro Monitor DPI Bewusstsein, müssen Sie das deaktivieren. Es sollte die Handhabung der WM_DPICHANGED Nachricht außer Kraft zu setzen für jedes Top-Level-Fenster, und nichts tun, als Reaktion auf diese Nachricht genug sein:

type 
    TBaseForm = class(TForm) // all forms in your program must derive from this base class 
    protected 
    procedure WMDpiChanged(var Msg: TMessage); message WM_DPICHANGED; 
    end; 

.... 

procedure TBaseForm.WMDpiChanged(var Msg: TMessage); 
begin 
    // return 0 to indicate that we have processed the message 
    Msg.Result := 0; 
end; 
+0

Danke, ich habe das ausprobiert und kann nur hoffen, dass das funktioniert, weil ich es noch nicht testen konnte. –

+0

Danke, ich habe das ausprobiert und kann nur hoffen, dass das funktioniert, weil ich es noch nicht testen konnte. –

Verwandte Themen