Einzelnen Beitrag anzeigen

Carsten Hölscher

Registriert seit: 29. Jul 2008
73 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Frames skalieren falsch unter HighDPI-Gesichtspunkten

  Alt 17. Jan 2022, 20:13
Ich hab wohl jetzt eine Lösung für das Problem. Man baut sich eine eigene Frameklasse wie unten und leitet alle Frames von dieser ab, also TMyFrame = class(TFrameCH) statt TMyFrame = class(TFrame).

Damit verhalten sich alle meine Testfälle korrekt, wobei ich möglicherweise nicht alle erfast habe. Der Entwurfsmonitor steht wie schon geschrieben auf 150%, die DPI-Werte in der dfm-datei auf 144.

Delphi-Quellcode:
unit CHFrame;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TFrameCH = class(TFrame)
  private
    { Private-Deklarationen }
    FCreate:Boolean;
    FDPIStart:integer;
  protected
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    procedure ScaleForPPI(NewPPI: Integer); override;
  end;

implementation

{$R *.dfm}

constructor TFrameCH.Create(AOwner: TComponent);
var m:TMonitor;
begin
  FCreate:=true;
  m:=Screen.MonitorFromWindow(Application.MainForm.Handle, mdNearest);
  FDPIStart:=m.PixelsPerInch;

  inherited Create(AOwner);

  if Self.PixelsPerInch <> m.PixelsPerInch then
  begin
    ScaleControls(96, Self.PixelsPerInch);
  end;
end;

procedure TFrameCH.ScaleForPPI(NewPPI: Integer);
var m:TMonitor;
begin
  m:=Screen.MonitorFromWindow(Application.MainForm.Handle, mdNearest);
  if not FCreate then
  begin
    ScaleControls(m.PixelsPerInch, FDPIStart);
    FDPIStart:=m.PixelsPerInch;
  end
  else
  begin
    Inherited;
    FCreate:=false;
  end;
end;

end.
  Mit Zitat antworten Zitat