0

我有一个graphiccontrol并试图在画布上绘制文本。目前我正在做一个Canvas.Textout() 但是因为如果画布区域增长文本没有,我会手动设置值。我想让文字也成长。例如。

 {Sets the cards power and draws it on the tcard}
//------------------------------------------------------------
procedure TCard.DrawLPower(value: string);//left number
//------------------------------------------------------------
  begin
  if fbigcard = false then
     begin
     canvas.Font.Size := 8;
     canvas.font.color := TColor($FFFFFF);
     Canvas.TextOut(1,1,value);
     end
  else
     begin
     canvas.font.color := TColor($FFFFFF);
     canvas.Font.Size := 12;
     Canvas.TextOut(1,7,value);
     canvas.Font.Color := CLBlack;
     end;
  end;

我检查卡片/画布是否很大,如果是的话,它会发出 1,7,如果它不大,它会发出 1,1。我在想,如果我使用 textheight 或 text width 方法,它会自动解决这个问题,但不确定如何?并将我绘制的数字保持在同一个位置。目前我在大约 3 个地方这样做,另外两个是。

{sets cards def and draws it to the tcard}
//------------------------------------------------------------
procedure TCard.DrawLDefence(value: string); //right number
//-------------------------------------------------------------
  begin
  if fBigcard = false then
    begin
     canvas.font.color := TColor($FFFFFF);
     canvas.Font.Size := 8;
     canvas.TextOut(32,1,value);
     canvas.Font.Color := CLBlack;
    end
  else
    begin
    canvas.font.color := TColor($FFFFFF);
      canvas.Font.Size := 12;
      canvas.TextOut(115,7,value);
      canvas.Font.Color := CLBlack;
    end;
  end;

{Sets and draws the cost to the TCard}
//-------------------------------------------------------------
procedure TCard.DrawLCost(value :string); //cost
//-------------------------------------------------------------
  begin
  if fbigcard = false then
    begin
     canvas.font.size := 8;
     canvas.font.color := TColor($FFFFFF);
     Canvas.textout(19,1,inttostr(CCost));
    end
  else
    begin
     canvas.font.size := 12;
     canvas.font.color := TColor($FFFFFF);
     Canvas.textout(65,7,inttostr(CCost));
     canvas.Font.Color := CLBlack;
    end;
  end;

如果它有帮助,我想我应该将大小保持为 var 从而删除所有额外的代码..

4

1 回答 1

2

您希望文本大小取决于控件大小吗?然后你需要知道或计算哪些文本应该适合哪个空间,然后绘制它。

查看您的代码,所有三个字符串都Y=1在不同的 X 坐标处彼此相邻输出。我想你为了测试目的硬编码了这些坐标,现在你想获得任何任意控件大小的动态。

所以我假设你在这里问的真正问题是:如何计算给定文本宽度的字体大小?(希望我是对的,我并没有白白写这个答案。不过,您的问题确实应该更清楚。)

答案需要了解如何在控件的宽度之间分配字符串以及中间的边距。假设您希望将所有三个字符串绘制在控件宽度的一半内,并且它们之间的宽度为两个空格(如果不是,至少要确保与字体大小成比例的边距)。AFAIK没有计算给定文本大小的字体大小的例程,因此您必须解决:将字体设置为小,并增加直到文本适合:

procedure TCard.DrawValues(const Power, Defence, Cost: String);
var
  FontRecall: TFontRecall;
  S: String;
  FontHeight: Integer;
begin
  FontRecall := TFontRecall.Create(Canvas.Font);
  try
    S := Format(' %s  %s  %s', [Power, Defence, Cost]);
    FontHeight := -1;
    repeat
      Inc(FontHeight);
      Canvas.Font.Height := FontHeight + 1;
    until Canvas.TextWidth(S) > ClientWidth div 2;
    Canvas.Font.Height := FontHeight;
    Canvas.TextOut(0, 1, S);
  finally
    FontRecall.Free;
  end;
end;

FontHeight理想情况下,仅当控件大小更改(覆盖Resize)或字符串更改时才重新计算。

于 2013-11-01T18:14:05.283 回答