在Delphi中,我希望在TRect中绘制文本。我希望有以下功能:
我可以看到Windows.DrawText()函数几乎涵盖了这个功能,但是在写文本时,多行和垂直居中是互斥的。
我想知道这个功能是否内置于windows(2000+)中?如果没有,有没有办法在不编写我自己的函数的情况下做到这一点?
答案 0 :(得分:18)
抱歉,这是以前所有答案和评论的组合。但似乎OP需要更多的帮助。
function DrawTextCentered(Canvas: TCanvas; const R: TRect; S: String): Integer;
var
DrawRect: TRect;
DrawFlags: Cardinal;
DrawParams: TDrawTextParams;
begin
DrawRect := R;
DrawFlags := DT_END_ELLIPSIS or DT_NOPREFIX or DT_WORDBREAK or
DT_EDITCONTROL or DT_CENTER;
DrawText(Canvas.Handle, PChar(S), -1, DrawRect, DrawFlags or DT_CALCRECT);
DrawRect.Right := R.Right;
if DrawRect.Bottom < R.Bottom then
OffsetRect(DrawRect, 0, (R.Bottom - DrawRect.Bottom) div 2)
else
DrawRect.Bottom := R.Bottom;
ZeroMemory(@DrawParams, SizeOf(DrawParams));
DrawParams.cbSize := SizeOf(DrawParams);
DrawTextEx(Canvas.Handle, PChar(S), -1, DrawRect, DrawFlags, @DrawParams);
Result := DrawParams.uiLengthDrawn;
end;
procedure TForm1.FormPaint(Sender: TObject);
const
S = 'This is a very long text as test case for my paint routine.';
var
R: TRect;
begin
SetRect(R, 100, 100, 200, 140);
Canvas.Rectangle(R);
InflateRect(R, -1, -1);
Caption := Format('%d characters drawn', [DrawTextCentered(Canvas, R, S)]);
end;
答案 1 :(得分:5)
首先使用DT_CALCRECT
测量文字。传递DT_WORDBREAK
以指定启用自动换行。这将允许您找到文本所需的高度。然后,您可以在代码中计算垂直偏移,为您提供垂直居中的文本,并绘制到该偏移。