我有一个固定长度的标签,并且自动换行属性设置为 true。在运行时,该标签有两行,例如:
test := 'quick brown fox jumps over the lazy dog';
在标签上,此文本显示为两行
quick brown fox jumps
over the lazy dog
我想知道运行时的行数:
#13#10
不起作用。
Function NumberOfLines(MyLabel: TLabel): Integer;
var
TempLabel: TLabel;
Pint1: Integer;
Begin
TempLabel := TLabel.Create(Self);
TempLabel.Caption := MyLabel.Caption;
TempLabel.WordWrap := True;
TempLabel.AutoSize := True;
TempLabel.Width := MyLabel.Width;
TempLabel.Font := MyLabel.Font;
PInt1 := TempLabel.Height;
TempLabel.Caption := '';
TempLabel.WordWrap := False;
TempLabel.AutoSize := True;
Result := PInt1 div TempLabel.Height;
TempLabel.Free;
End;
DrawText 函数可用于此目的。
该程序的其余部分与 David Heffernan 在他的评论中提出的没有太大区别。
这里的关键是采用标志DT_WORDBREAK
来自动换行并DT_EDITCONTROL
模仿标题的文本行为。
function TForm1.getNumberOfLinesInCaption(ALabel: TLabel): Integer;
var
r: TRect;
h: Integer;
begin
h := ALabel.Canvas.TextHeight(ALabel.Caption);
if h = 0 then
Exit(0);//empty caption
if not ALabel.WordWrap then
Exit(1);//WordWrap = False
FillChar(r, SizeOf(TRect), 0);
r.Width := ALabel.Width;
r.Height := ALabel.Height;
if 0 = DrawText(ALabel.Canvas.Handle, ALabel.Caption, Length(ALabel.Caption), r, DT_EDITCONTROL or DT_WORDBREAK or DT_CALCRECT) then
Exit(-1);//function call has failed
Result := r.Height div h;
//Assert(r.Height mod h = 0);
end;