Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Windows 10 und Scaled in Runtime (https://www.delphipraxis.net/186197-windows-10-und-scaled-runtime.html)

almisoft 12. Aug 2015 11:20


Windows 10 und Scaled in Runtime
 
Wenn ich unter Windows 10 die dpi hochsetze

Einstellungen -> Anzeige -> Bildschirm/Anzeige anpassen -> Ändern der Größe von apps, Text und andere Elemente -> 150%

und in Delphi die Form-Eigenschaft Scaled=True setze, wird das Fenster meiner Anwendung groß dargestellt.

So möchte ich es auch haben. Meine Anwendung soll auch auf Monitoren mit hoher Auflösung gut erkennbar sein.

Ich möchte dem Nutzer meiner Anwendung aber die Wahl lassen und habe eine CheckBox eingebaut, mit der man die Skalierung zur Laufzeit ein- und ausschalten kann.
Leider funktioniert es zur Laufzeit nicht. Die Skalierung meiner Anwendung ändert sich nur, wenn ich zur Entwurf-Zeit im Object Inspector Scaled auf True bzw. False setze, meine Anwendung neu kompiliere und neu starte.
Selbst ein Form1.Scaled:=true bzw. Form1.Scaled:=false in TForm1.FormCreate wird nicht berücksichtigt. Windows 10 schaut nur, was im Object Inspector steht...

Hat jemand eine Idee, wie man die Anwendung dazu zwingt, sich zur Laufzeit neu zu skalieren?


Im Manifest habe ich die Windows 10-ID hinzugefügt und auch dpiAware auf True gesetzt:

Code:
<?xml version="1.0" encoding="utf-8" ?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>

  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
     <!-- Windows 8.1 -->
            <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
            <!-- Windows Vista -->
            <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
            <!-- Windows 7 -->
            <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
            <!-- Windows 8 -->
            <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
            <!-- Windows 10 -->
            <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
    </application>
  </compatibility>

  <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>
</asmv1:assembly>

jaenicke 12. Aug 2015 11:57

AW: Windows 10 und Scaled in Runtime
 
Zitat:

Zitat von almisoft (Beitrag 1311937)
Im Manifest habe ich die Windows 10-ID hinzugefügt und auch dpiAware auf True gesetzt:

Damit sagst du Windows nur, dass deine Anwendung selbst damit umgehen kann und verhinderst, dass Windows selbst versucht zu skalieren.

Die Eigenschaft Scaled hingegen wird von Delphi selbst benutzt. Und zwar meine ich bereits beim Laden des Formulars. Deshalb wird das im OnCreate nicht gehen, da das danach aufgerufen wird. Du kannst aber einfach den Konstruktor überschreiben und Scaled setzen bevor du den geerbten Konstruktor aufrufst. Das sollte gehen.

Thomasl 6. Sep 2023 08:48

AW: Windows 10 und Scaled in Runtime
 
Das ist zwar schon alt hier, ich habe aber nichts zum Thema gefunden.
vielleicht hilft es jemandem.
nur im constructor Scaled setzen hat auch nicht funktioniert
so funktioniert es bei mir

z.B.
Form1 := TForm1.Create(Application,False);


Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TScaled = (scaledDfm, scaledTrue, scaledFalse);

  TForm1 = class(TForm)
  private
    { Private declarations }
    XScaled: TScaled;
  protected
    procedure InitializeNewForm; override;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent; AScaled: boolean); reintroduce;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TForm1.Create(AOwner: TComponent; AScaled: boolean);
begin
  if AScaled then
    XScaled := scaledTrue
  else
    XScaled := scaledFalse;
  inherited Create(AOwner);
  // hier Scaled einstellen, ist schon zu spät
end;

procedure TForm1.InitializeNewForm;
begin
  inherited;
  case XScaled of
    scaledTrue:
      Scaled := True;
    scaledFalse:
      Scaled := False;
  end;
end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz