forked from digao-dalpiaz/DzHTMLText
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ScalingUtils.pas
100 lines (85 loc) · 2.07 KB
/
ScalingUtils.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
unit ScalingUtils;
interface
uses
{$IFDEF FPC}
Forms
{$ELSE}
Vcl.Forms
{$ENDIF};
type
TDzFormScaling = class
private
FScaled: Boolean;
FDesignerPPI: Integer;
FMonitorPPI: Integer;
public
property Scaled: Boolean read FScaled;
property DesignerPPI: Integer read FDesignerPPI;
property MonitorPPI: Integer read FMonitorPPI;
procedure Update(F: TCustomForm; xDesignerDPI: Integer);
function Calc(Value: Integer): Integer;
end;
function RetrieveDesignerPPI(F: TCustomForm): Integer;
function RetrieveMonitorPPI(F: TCustomForm): Integer;
implementation
uses
{$IFDEF FPC}
SysUtils, Windows
{$ELSE}
System.SysUtils, Winapi.Windows
{$ENDIF};
{$IF (Defined(DCC) and (CompilerVersion >= 30)) or Defined(FPC)} //D10 Seattle or Lazarus
{$DEFINE NEW_MONITOR}
{$ENDIF}
function RetrieveMonitorPPI(F: TCustomForm): Integer;
{$IFNDEF NEW_MONITOR}
var
DC: HDC;
{$ENDIF}
begin
{$IFDEF NEW_MONITOR}
Result := F.Monitor.PixelsPerInch;
{$ELSE}
DC := GetDC(0);
Result := GetDeviceCaps(DC, LOGPIXELSY);
ReleaseDC(0, DC);
{$ENDIF}
end;
//
type
TFormScaleHack = class(TCustomForm);
function RetrieveDesignerPPI(F: TCustomForm): Integer;
begin
Result :=
{$IFDEF FPC}
F.PixelsPerInch
{$ELSE}
{$IF CompilerVersion >= 31} //D10.1 Berlin
TFormScaleHack(F).GetDesignDpi
{$ELSE}
TFormScaleHack(F).PixelsPerInch
{$ENDIF}
{$ENDIF};
end;
procedure TDzFormScaling.Update(F: TCustomForm; xDesignerDPI: Integer);
begin
if F<>nil then
begin
FScaled := TFormScaleHack(F).Scaled;
FDesignerPPI := xDesignerDPI; //Delphi 11 is not storing original design DPI (it changes by current monitor PPI)
FMonitorPPI := RetrieveMonitorPPI(F);
end else
begin
FScaled := False;
FDesignerPPI := 0;
FMonitorPPI := 0;
end;
end;
function TDzFormScaling.Calc(Value: Integer): Integer;
begin
if FScaled then
Result := MulDiv(Value, FMonitorPPI, FDesignerPPI) //{$IFDEF FPC}ScaleDesignToForm(Value){$ELSE}ScaleValue(Value){$ENDIF} - only supported in Delphi 10.4
else
Result := Value;
end;
end.