如何根据图形控件大小自动绘制文本

时间:2013-11-01 16:48:02

标签: delphi delphi-xe2

我有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或文本宽度的方法,它会自动修复它,但不知道如何?并保持我在同一地点绘制的数字。目前我在这里做了大约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,从而删除所有额外的代码..

1 个答案:

答案 0 :(得分: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