LCL/TCustomCheckbox and descendants: Measure size of checkbox/radiobutton symbol from ThemeServices rather than from SystemMetrics. Fixes issue #39398.

This commit is contained in:
wp_xyz 2021-09-25 22:08:25 +02:00
parent 736e71078e
commit d33a33921c

View File

@ -1988,17 +1988,33 @@ end;
class procedure TWin32WSCustomCheckBox.GetPreferredSize(const AWinControl: TWinControl; class procedure TWin32WSCustomCheckBox.GetPreferredSize(const AWinControl: TWinControl;
var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean);
var var
dx: Integer; // pixel spacing between checkbox and text
iconHeight: integer; iconHeight: integer;
iconWidth: Integer;
details: TThemedElementDetails;
begin begin
if MeasureText(AWinControl, AWinControl.Caption, PreferredWidth, PreferredHeight) then if MeasureText(AWinControl, AWinControl.Caption, PreferredWidth, PreferredHeight) then
begin begin
Inc(PreferredWidth, GetSystemMetrics(SM_CXMENUCHECK));
// pixels spacing between checkbox and text
if ThemeServices.ThemesEnabled then if ThemeServices.ThemesEnabled then
Inc(PreferredWidth, 4) begin
else dx := 4;
Inc(PreferredWidth, 6); if AWinControl is TRadioButton then
iconHeight := GetSystemMetrics(SM_CYMENUCHECK); details := ThemeServices.GetElementDetails(tbRadioButtonCheckedNormal)
else
// ToDo: Handle TToggleBox separately from TCheckbox
details := ThemeServices.GetElementDetails(tbCheckBoxCheckedNormal);
with ThemeServices.GetDetailSize(details) do
begin
iconWidth := CX;
iconHeight := CY;
end;
end else
begin
dx := 6;
iconWidth := GetSystemMetrics(SM_CXMENUCHECK);
iconHeight := GetSystemMetrics(SM_CYMENUCHECK);
end;
Inc(PreferredWidth, iconWidth + dx);
if iconHeight > PreferredHeight then if iconHeight > PreferredHeight then
PreferredHeight := iconHeight; PreferredHeight := iconHeight;
if WithThemeSpace then if WithThemeSpace then