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?
Thema durchsuchen
Ansicht
Themen-Optionen

Low/High DPI zur Laufzeit ändern?

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

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#1

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
722 Beiträge
 
Delphi 12 Athens
 
#2

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
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#3

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.167 Beiträge
 
Delphi 10 Seattle Professional
 
#4

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
11.609 Beiträge
 
Delphi 12 Athens
 
#5

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.167 Beiträge
 
Delphi 10 Seattle Professional
 
#6

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
Ort: Bruck an der Mur
69 Beiträge
 
#7

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


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 +1. Es ist jetzt 05:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz