好的,问题来了。我在面板中有一个标签组件。该标签与alClient对齐并启用了wordwrap。文本可以从一行到几行不等。我想重新调整面板(和标签)的高度以适合所有文本。计算TLabel所需的尺寸
如何获取标签的必要高度时,我知道文字和面板的宽度是多少?
好的,问题来了。我在面板中有一个标签组件。该标签与alClient对齐并启用了wordwrap。文本可以从一行到几行不等。我想重新调整面板(和标签)的高度以适合所有文本。计算TLabel所需的尺寸
如何获取标签的必要高度时,我知道文字和面板的宽度是多少?
可以使用TCanvas.TextRect方法,与tfCalcRect和tfWordBreak标志位:
var
lRect : TRect;
lText : string;
begin
lRect.Left := 0;
lRect.Right := myWidth;
lRect.Top := 0;
lRect.Bottom := 0;
lText := myLabel.Caption;
myLabel.Canvas.TextRect(
{var} lRect, //will be modified to fit the text dimensions
{var} lText, //not modified, unless you use the "tfModifyingString" flag
[tfCalcRect, tfWordBreak] //flags to say "compute text dimensions with line breaks"
);
ASSERT(lRect.Top = 0); //this shouldn't have moved
myLabel.Height := lRect.Bottom;
end;
TCanvas.TextRect
包从Windows API的DrawTextEx
函数的调用。
tfCalcRect
和tfWordBreak
标志是delphi封装的windows API值DT_CALCRECT
和DT_WORDBREAK
。你可以找到msdn
使用文本宽度和textHeight不同。
在这里看到一个例子: http://www.greatis.com/delphicb/tips/lib/fonts-widthheight.html
文本宽度会告诉你的文本将有多宽是,然后你可以将通过控制宽度就看你有多少行需要。该部门的其余部分应该是一个额外的行。
如果u使用自动换行多则需要1条额外线 – 2013-03-07 14:32:40
这是很酷的,是有可能确定的选框或大小,这可能会出问题?我注意到它随组件的字体和大小而变化......我的意思是框越大或越小... – 2014-05-18 14:41:36
他们的DrawTextEx
文档中的影响的详细信息,您可以用一行代码,这
label.width:= label.canvas.textwidth(label.caption);
,或者您可以在Object Inspector中使用标签自动调整大小属性为true。
他想重新调整高度 – 2013-03-08 09:41:51
您应该在TextRect行之前添加myLabel.Canvas.Font:= myLabel.Font。 – 2011-06-29 16:39:21