AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Windows 10 und Scaled in Runtime

Ein Thema von almisoft · begonnen am 12. Aug 2015 · letzter Beitrag vom 6. Sep 2023
Antwort Antwort
Benutzerbild von almisoft
almisoft

Registriert seit: 14. Feb 2007
Ort: Berlin
40 Beiträge
 
Delphi 7 Professional
 
#1

Windows 10 und Scaled in Runtime

  Alt 12. Aug 2015, 12:20
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>
Alexander Miehlke
Alexander Miehlke
Wer Schreibfehler findet, darf sie behalten

Geändert von almisoft (12. Aug 2015 um 12:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Windows 10 und Scaled in Runtime

  Alt 12. Aug 2015, 12:57
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Thomasl

Registriert seit: 19. Jun 2006
Ort: Vreden
67 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Windows 10 und Scaled in Runtime

  Alt 6. Sep 2023, 09:48
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.
Thomas Levering
  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 22:20 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