AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Low/High DPI zur Laufzeit ändern?

Low/High DPI zur Laufzeit ändern?

Ein Thema von romber · begonnen am 15. Nov 2018 · letzter Beitrag vom 30. Jul 2021
Antwort Antwort
Seite 1 von 2  1 2   
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.163 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Low/High DPI zur Laufzeit ändern?

  Alt 15. Nov 2018, 13:55
Hallo,

ich habe meine Anwendung für hohe Auflösungen aufwenfig angepasst. Jetzt sieht der GUI auch bei hohen Auflösungen und Skallierungen bis zu einem gewissen Grad schön und sehr scharf aus.

Einige Testpersonen finden die Anzeige aber zu scharf und würden gerne zu der alten gewohnten Anzeige zurückkehren. Das Problem ist aber, dass die hohe Auflösung bereits im Manifest der Anwendung festgelegt wird so, dass ich jetzt eine zweite Datei ohne die High DPI-Unterstützung bereitstellen müsste. Gibt es den keine vennünftige Möglichkeit, die hohe Auflösung zur Laufzeit (z.B. bei der Initialisierung der Anwendung) zu aktivieren/deaktivieren, ohne dass ich den ganzen Code umnkrempeln muss?

Danke!
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Low/High DPI zur Laufzeit ändern?

  Alt 15. Nov 2018, 14:10
Hallo,

im Prinzip nennst du die Lösung bereits elber. Die Tatsache der "hohen Auflösung" bzw. ob Windows für dich Skaliert oder es die Anwendung selber skaliert steht im Manifest. Niemand zwingt dich das Manifest in die EXE zu integrieren. Du kannst Delphi "bitten" kein Manifest zu integrieren und das externe Manifest selber als Datei mit ausliefern. Bei der Umstellung durch den Anwender musst du dann das externe Manifest ändern. Nach einem Neustart sollte das dann funktionieren.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.592 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Low/High DPI zur Laufzeit ändern?

  Alt 15. Nov 2018, 14:29
Prinzipiell gibt es schon eine Möglichkeit innerhalb des Programms die DPI-Unterstützung anzumelden. Allerdings empfiehlt Microsoft selbst im ersten Satz der Dokumentation zu SetProcessDpiAwarenessContext den Weg über das Manifest.

Ich selbst würde es auch lieber über diese Funktion machen. Dann hätte man die Möglichkeit, auf unterschiedliche Windows 10 Releases auch unterschiedlich zu reagieren. Nicht alle PerMonitorV2 fähigen Systeme machen ihre Arbeit wirklich gut. Man könnte dann von DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 auf DPI_AWARENESS_CONTEXT_UNAWARE herunterschalten, wenn die Windows Version das nicht gut genug macht.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.913 Beiträge
 
#4

AW: Low/High DPI zur Laufzeit ändern?

  Alt 15. Nov 2018, 14:37
Deine GUI sieht, könnte man vermuten, gut aus und alles ist am richtigen Platz. Du hast nur ein Schärfeproblem.
Solchen Geschichten würde ich mich gar nicht hingeben und den paar Leuten die eine Extrawurst haben wollen einen Gefallen tun.
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
566 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Low/High DPI zur Laufzeit ändern?

  Alt 15. Nov 2018, 15:03
Ich habe mir für genau diesen Zweck mit InnoSetup ein kleines Setup gebaut, dass je nach Auswahl eine Manifest-Datei als <MeinProjekt>.exe.manifest entweder mit oder ohne HighDpi-Unterstützung ins Programmverzeichnis kopiert.
In der eigentlichen Exe meines Projeks ist kein Manifest enthalten.

Der Benutzer kann das Setup jederzeit aufrufen und nach einem Neustart von <MeinProjekt>.exe ist die HighDpi-Unterstützung umgestellt.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.978 Beiträge
 
Delphi XE4 Professional
 
#6

AW: Low/High DPI zur Laufzeit ändern?

  Alt 15. Nov 2018, 15:52
Hallo
clevere Idee von bcvs.
Heiko
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.163 Beiträge
 
Delphi 10 Seattle Professional
 
#7

AW: Low/High DPI zur Laufzeit ändern?

  Alt 15. Nov 2018, 23:37
Vielen Dank für Eure Anregungen. SetProcessDPIAwareness sieht gut aus, werde es mir genauer anschauen. Mit den ersten einfachen Test konnte ich zwar die low/high DPI teilweise zur Laufzweit erzwingen, alledings viele der Drittanbieter-Komponente, wie z.B. DevExpress Grid und Bar Suite, spielen (noch) nicht richtig mit. Erstaunlicherweise sind es meistens genau die Bibliotheken, die HighDPI out-of-box unterstützen, wenn mann entsprechenden Kästchen in den Projekteinstellungen aktiviert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
8.592 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Low/High DPI zur Laufzeit ändern?

  Alt 16. Nov 2018, 00:09
Du musst sicher stellen, daß der Call vor allen anderen DPI-API Aufrufen abgesetzt wird. Andernfalls wirkt er nicht mehr.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.163 Beiträge
 
Delphi 10 Seattle Professional
 
#9

AW: Low/High DPI zur Laufzeit ändern?

  Alt 16. Nov 2018, 11:55
Du musst sicher stellen, daß der Call vor allen anderen DPI-API Aufrufen abgesetzt wird. Andernfalls wirkt er nicht mehr.
Wo setzte ich den diesen Call am besten ab? Wenn ich die Funktion vor Application.Initialize; passiert das, was ich beschrieben habe.
  Mit Zitat antworten Zitat
rabatscher

Registriert seit: 13. Dez 2007
21 Beiträge
 
#10

AW: Low/High DPI zur Laufzeit ändern?

  Alt 16. Nov 2018, 12:48
Wir benutzen folgende Unit um das Per Registry zu erledigen:
Die Unit muss unbedingt als erstes (bzw. gleich nach der memory manager unit) eingefügt werden.

Delphi-Quellcode:
unit HighDPIInit;

// note this unit needs to be added to the project BEFORE any unit that uses controls.pas!!!!
// -> otherwise the screen variable is wrongly initialized

interface

const
  Process_DPI_Unaware = 0;
  Process_System_DPI_Aware = 1;
  Process_Per_Monitor_DPI_Aware = 2;

type
  TSetProcessDPIAwareness = function (value : LongWord) : HRESULT; stdcall;

var setProcessDPIAwareness : TSetProcessDPIAwareness;
    hdl : THandle;

implementation

uses Windows, registry, DarwinConsts;


initialization
  with TRegIniFile.Create('', KEY_READ or KEY_WOW64_64KEY) do
  try
     RootKey := HKEY_LOCAL_MACHINE;
     OpenKey('your section here', False);
     if not ReadBool('','HighDPIAware', False) then
        exit;
  finally
       Free;
  end;

  // ###############################################
  // #### Enable high dpi awareness
  // ###############################################

  hdl := LoadLibrary('Shcore.dll');
  if hdl <> 0 then
  begin
       setProcessDPIAwareness := GetProcAddress(hdl, 'SetProcessDpiAwareness');
       if Assigned(setProcessDPIAwareness) then
          setProcessDPIAwareness(Process_System_DPI_Aware);

       FreeLibrary(hdl);
  end;
end.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 06:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf