在 Delphi 中获取 TCheckbox 的总大小,包括框和文本

ala*_*ncc 0 delphi size checkbox

我想获得TCheckbox的总大小,包括Delphi中的框和文本。我查看了Delphi FMX TCheckbox/TRadiobutton Autosize上的文章,但似乎 TCheckbox 没有 Canvas 属性,因此代码不适合它。

更新

让我解释一下为什么我需要知道这一点。在我的一些复选框中,我需要放置与复选框相关的 spinedit。例如,在“文件大小大于”###“字节”复选框中,其中 ### 是旋转编辑。

由于复选框不支持自动调整大小,一种方法是放大复选框以容纳所有文本。然后将旋转编辑放在最后一个可见字符之后。

这对于单一语言来说很好,但是,为了支持多语言,某些语言会比其他语言长得多。

在这种情况下,我可以选择:

  1. 计算checkbxo可见部分的大小。

或者

  1. 在最后一个可见字符和旋转编辑之间保留一些空格。

方法 2 不太好,因为对于某些语言,复选框和旋转编辑之间会有很大的距离。

更新2

还有一个问题,我尝试对按钮执行相同的操作,如下所示:

var
  bmp: TBitmap;
  size: TSize;
  width: Integer;
begin
  Checkbox1.Caption := Edit3.Text;
  Button3.Caption := Edit3.Text;

  bmp := TBitmap.Create;
  try
    bmp.SetSize(CheckBox1.Width, CheckBox1.Height);
    bmp.Canvas.Font := CheckBox1.Font;
    size := bmp.Canvas.TextExtent(CheckBox1.Caption);
    Width := bmp.Canvas.TextWidth(Checkbox1.Caption);
    CheckBox1.Width := size.cx + 20;
    button3.Width := size.cx;
    SpinEdit1.Left := Checkbox1.Left + Checkbox1.Width + 5;
  finally
    bmp.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

由于按钮没有任何框,因此我使用 size.cx 而不是添加一些值。然而,在我的测试中,实际上文本宽度不正确,这使得按钮无法容纳整个文本,如下所示:

在此输入图像描述

And*_*and 5

这是我的两分钱。

要获取实际复选框的大小,我相信您应该询问 Win32 主题 API ( uses UxTheme):

var
  h: HTHEME;
  S: TSize;
begin

  h := OpenThemeData(Handle, 'BUTTON');
  try

    if Succeeded(GetThemePartSize(h, Canvas.Handle, BP_CHECKBOX,
      CBS_UNCHECKEDNORMAL, nil, TS_DRAW, S))
    then
      ShowMessage('Check box width: ' + S.cx.ToString);

  finally
    CloseThemeData(h);
  end;
Run Code Online (Sandbox Code Playgroud)

同样,这会检索文本(标题)的宽度:

var
  h: HTHEME;
  R: TRect;
begin

  h := OpenThemeData(Handle, 'BUTTON');
  try

    if Succeeded(GetThemeTextExtent(h, Canvas.Handle, BP_CHECKBOX,
      CBS_UNCHECKEDNORMAL, PChar(CheckBox1.Caption),
      Length(CheckBox1.Caption), 0, nil, R))
    then
      ShowMessage('Caption width: ' + R.Width.ToString);

  finally
    CloseThemeData(h);
  end;
Run Code Online (Sandbox Code Playgroud)

仍然未知的是复选框和标题之间的填充。我不知道获得此值的正确方法,但它似乎通常与空间的宽度相同:

var
  h: HTHEME;
  S: TSize;
  R: TRect;
begin

  h := OpenThemeData(Handle, 'BUTTON');
  try

    if Succeeded(GetThemePartSize(h, Canvas.Handle, BP_CHECKBOX,
      CBS_UNCHECKEDNORMAL, nil, TS_DRAW, S))
    then
      ShowMessage('Check box width: ' + S.cx.ToString);

    if Succeeded(GetThemeTextExtent(h, Canvas.Handle, BP_CHECKBOX,
      CBS_UNCHECKEDNORMAL, PChar(#32+CheckBox1.Caption),
      1+Length(CheckBox1.Caption), 0, nil, R))
    then
      ShowMessage('Caption width including padding: ' + R.Width.ToString);

  finally
    CloseThemeData(h);
  end;
Run Code Online (Sandbox Code Playgroud)