TdxForm.ScaleFactorChanged(Integer,Integer) Method
Updates the form and components within it when the scale factor changes.
Declaration
procedure ScaleFactorChanged(M: Integer; D: Integer); virtual;
Parameters
Name | Type | Description |
---|---|---|
M | Integer | The new scale factor multiplier. |
D | Integer | The new scale factor denominator. |
Remarks
The ScaleFactorChanged
procedure is called automatically every time the application accepts the WM_DPICHANGED
[1] system message if the Scaled property is set to True
. ScaleFactorChanged
calls the [UpdateImageLists] procedure to dynamically switch between multiple image lists with bitmap icons that target different DPIs.
For example, you can override the ScaleFactorChanged
procedure in a TdxForm class descendant to execute custom actions when the ScaleFactor property value changes. To allow the custom form to switch between DPI-specific image lists, call the UpdateImageLists procedure within a custom ScaleFactorChanged
procedure implementation.
Tip
This image list replacement technique is deprecated. We recommend that you use only SVG images as UI icons in projects that target multi-monitor mixed-DPI environments.
Code Example
The following code example demonstrates a custom ScaleFactorChanged
procedure implementation that switches between multiple image lists based on DPI thresholds:
function TMyForm.GetMostSuitableImageList: TcxImageList;
var
ATargetDPI: Integer;
begin
ATargetDPI := ScaleFactor.Apply(96); // Calculates the current DPI
if ATarget >= 192 then
Result := ilImages200 // Chooses the icon set designed for 200% DPI
else if ATargetDPI >= 144 then
Result := ilImages150 // Chooses the icon set designed for 150% DPI
else if ATargetDPI >= 120 then
Result := ilImages125 // Chooses the icon set designed for 125% DPI
else
Result := ilImages; // Chooses the icon set designed for 100% DPI (unscaled)
end;
procedure TMyForm.ScaleFactorChanged(M, D: Integer);
var
AImageList: Integer;
begin
AImageList := GetMostSuitableImageList; // Chooses a suitable replacement image list
btnBMPGlyph.OptionsImage.Images := AImageList; // Substitutes the button's image list
AImageList.GetImage(0, btnBMPGlyph.OptionsImage.Glyph); // Applies the first image as a button glyph
btnBMPGlyph.OptionsImage.Glyph.SourceDPI := AImageList.SourceDPI; // Updates the glyph DPI
end;