Delphi에서 상자와 텍스트를 포함하여 TCheckbox의 전체 크기를 가져옵니다.

Jan 15 2021

Delphi의 상자와 텍스트를 포함하여 TCheckbox의 전체 크기를 얻고 싶습니다. 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;

버튼에는 상자가 없으므로 값을 추가하는 대신 size.cx를 사용합니다. 그러나 내 테스트에서 실제로 텍스트 너비가 올바르지 않아 버튼이 전체 텍스트를 이해할 수 없습니다. 아래를 참조하십시오.

답변

2 AndreasRejbrand Jan 15 2021 at 21:20

여기 내 2 센트입니다.

실제 확인란의 크기를 얻으려면 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;

아직 알려지지 않은 것은 체크 박스와 캡션 사이의 패딩입니다. 나는 이것을 얻는 올바른 방법을 모르지만 그것은 종종 공간의 너비와 동일한 것 같습니다.

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;