在 Delphi 中获取 TCheckbox 的总大小,包括框和文本
Get the total size of the TCheckbox, including box and text, in Delphi
我想获取 TCheckbox 的总大小,包括框和 Delphi 中的文本。我查看了 上的文章,但 TCheckbox 似乎没有 Canvas 属性,因此代码不适合它。
更新
让我解释一下为什么我需要知道这一点。在我的一些复选框中,我需要放置一个与复选框相关的 spineedit。例如,在复选框“当文件大小大于”###“字节”时拆分文件,其中### 是旋转编辑。
由于复选框不支持自动调整大小,一种方法是将复选框放大以容纳所有文本。然后将旋转编辑放在最后一个可见字符之后。
这对于单一语言来说很好,但是,要支持多语言,某些语言会比其他语言长很多。
遇到这种情况,我可以选择:
- 计算checkbxo可见部分的大小。
或
- 在最后一个可见字符和旋转编辑之间保留一些空格。
方法 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;
由于按钮没有任何框,所以我使用 size.cx 而不是添加一些值。但是,在我的测试中,实际上文本宽度不正确,导致按钮无法容纳整个文本,如下所示:
这是我的两分钱。
要获得实际复选框的大小,我相信你应该问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;
同样,这会检索文本(标题)的宽度:
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;
仍然未知的是复选框和标题之间的填充。我不知道获得这个的正确方法,但它似乎通常与 space:
的宽度相同
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;
我想获取 TCheckbox 的总大小,包括框和 Delphi 中的文本。我查看了
更新
让我解释一下为什么我需要知道这一点。在我的一些复选框中,我需要放置一个与复选框相关的 spineedit。例如,在复选框“当文件大小大于”###“字节”时拆分文件,其中### 是旋转编辑。
由于复选框不支持自动调整大小,一种方法是将复选框放大以容纳所有文本。然后将旋转编辑放在最后一个可见字符之后。
这对于单一语言来说很好,但是,要支持多语言,某些语言会比其他语言长很多。
遇到这种情况,我可以选择:
- 计算checkbxo可见部分的大小。
或
- 在最后一个可见字符和旋转编辑之间保留一些空格。
方法 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;
由于按钮没有任何框,所以我使用 size.cx 而不是添加一些值。但是,在我的测试中,实际上文本宽度不正确,导致按钮无法容纳整个文本,如下所示:
这是我的两分钱。
要获得实际复选框的大小,我相信你应该问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;
同样,这会检索文本(标题)的宽度:
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;
仍然未知的是复选框和标题之间的填充。我不知道获得这个的正确方法,但它似乎通常与 space:
的宽度相同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;