diff --git a/lcl/controls.pp b/lcl/controls.pp index 22cf265ebd..8a99d2d0e2 100644 --- a/lcl/controls.pp +++ b/lcl/controls.pp @@ -1597,6 +1597,7 @@ type procedure AutoAdjustLayout(AMode: TLayoutAdjustmentPolicy; const AFromPPI, AToPPI, AOldFormWidth, ANewFormWidth: Integer); virtual; procedure ShouldAutoAdjust(var AWidth, AHeight: Boolean); virtual; + procedure FixDesignFontsPPI(const ADesignTimePPI: Integer); virtual; procedure ScaleFontsPPI(const AToPPI: Integer; const AProportion: Double); virtual; public constructor Create(TheOwner: TComponent);override; diff --git a/lcl/include/control.inc b/lcl/include/control.inc index d1376be618..b0b00f6053 100644 --- a/lcl/include/control.inc +++ b/lcl/include/control.inc @@ -943,6 +943,19 @@ procedure TControl.ExecuteDefaultAction; begin end; +procedure TControl.FixDesignFontsPPI(const ADesignTimePPI: Integer); +begin + // Problem: Font.PixelsPerInch isn't saved in the LFM, therefore the + // design-time font PPI is different from the one that is loaded on target + // machine, which results in different font scaling. + // DoFixDesignFont restores the corrent design-time font PPI so that it can + // be used for LCL HighDPI scaling. + // Override this function - list all custom fonts in the overriden procedure + // To-Do: maybe save Font.PixelsPerInch in the LFM and remove this? + + DoFixDesignFontPPI(Font, ADesignTimePPI); +end; + procedure TControl.ExecuteCancelAction; begin end; @@ -1918,7 +1931,7 @@ begin if (AFont.Height=0) and not (csDesigning in ComponentState) then AFont.Height := MulDiv(GetFontData(AFont.Reference.Handle).Height, AFont.PixelsPerInch, Screen.PixelsPerInch); if AToPPI>0 then - AFont.PixelsPerInch := MulDiv(AFont.PixelsPerInch, AToPPI, AFont.PixelsPerInch) + AFont.PixelsPerInch := AToPPI else AFont.PixelsPerInch := Round(AFont.PixelsPerInch*AProportion); end; diff --git a/lcl/include/customdesigncontrol.inc b/lcl/include/customdesigncontrol.inc index a176e7e56d..3c87f7cc31 100644 --- a/lcl/include/customdesigncontrol.inc +++ b/lcl/include/customdesigncontrol.inc @@ -57,10 +57,27 @@ begin end; procedure TCustomDesignControl.Loaded; + procedure FixChildren(const AParent: TWinControl); + var + I: Integer; + begin + for I := 0 to AParent.ControlCount-1 do + begin + AParent.Controls[I].FixDesignFontsPPI(FDesignTimePPI); + if AParent.Controls[I] is TWinControl then + FixChildren(TWinControl(AParent.Controls[I])); + end; + end; begin inherited Loaded; FPixelsPerInch := FDesignTimePPI; + + if Application.Scaled and Scaled then + begin + FixDesignFontsPPI(FDesignTimePPI); + FixChildren(Self); + end; end; procedure TCustomDesignControl.SetDesignTimePPI(const ADesignTimePPI: Integer);