我有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,从而删除所有额外的代码..
答案 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
。