delphi - 将文本保持在一个圆圈内

标签 delphi delphi-7

我正在使用delphi,我有一个文本,我想将它放入一个criicle;通过意味着我想减少文本的字体以使其保持在圆圈内,我知道如何将其保持为矩形的代码,但我对允许我将其保持在圆圈内的数学函数有点困惑
这是我在网上冲浪时得到的矩形代码

double fontSize = 20.0;
bool bFontFits = false;

while (bFontFits == false)
{
    m_pCanvas->Font->Size = (int)fontSize;
    TSize te = m_pCanvas->TextExtent(m_name.c_str());
    if (te.cx < (width*0.90))  // Allow a little room on each side
    {
        // Calculate the position
        m_labelOrigin.x = rectX + (width/2.0) - (te.cx/2);
        m_labelOrigin.y = rectY + (height/2.0) - te.cy/2);
        m_fontSize = fontSize;
        bFontFits = true;
        break;
    }
    fontSize -= 1.0;

}

最佳答案

我会为这样的矩形调整代码:

procedure CalcFontSizeRectangle(aCanvas : TCanvas; const aText : string; const aRect : TRect);
var
  te : TSize;
begin
  aCanvas.Font.Size := 20;

  while aCanvas.Font.Size > 0 do begin
    te := aCanvas.TextExtent(aText);
    if (te.cx < ((aRect.Right-aRect.Left)*0.90)) and (te.cy < ((aRect.Bottom-aRect.Top)*0.90)) then begin
      break;
    end;

    aCanvas.Font.Size := aCanvas.Font.Size - 1;
  end;
end;

并对其进行一些更改以使其适用于这样的圈子:
procedure CalcFontSizeCircle(aCanvas : TCanvas; const aText : string; const aDiameter : integer);
var
  te : TSize;
  d  : double;
begin
  aCanvas.Font.Size := 20;

  while aCanvas.Font.Size > 0 do begin
    te := aCanvas.TextExtent(aText);
    d := sqrt(te.cx * te.cx + te.cy * te.cy);
    if d < (aDiameter*0.90) then begin
      break;
    end;

    aCanvas.Font.Size := aCanvas.Font.Size - 1;
  end;
end;

结果字体大小在 Canvas 中。

关于delphi - 将文本保持在一个圆圈内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5727398/

相关文章:

delphi - 服务终止原因

xml - 消除xml文件的声明

Delphi 2009从字符串中读取oem而无需setCodePage

delphi - 使用 RTTI 方法调用返回的函数引用

delphi - 使用 Delphi 7 在 Windows 7 上的注册表写入权限

delphi - 如何在Delphi 7中为某些代码添加书签?

windows - 更新 Windows 资源管理器中显示的可用空间量

delphi - 如何在Delphi中使用FFMPEG

delphi - 在运行时遵循设计时规则重新排列组件位置、大小、所有权(一般属性)的某种方法

delphi - TClientDataset 组件应该位于哪里?