我正在尝试使用WinAPI的DrawText函数在位图中垂直和水平居中绘制一个包含字的字符串。
问题在于,如果文字比可用空间长,并且" END ELLIPSIS" (...)被添加到裁剪的字符串中,使用" DT_CALCRECT"时返回报告的绘图坐标。通过垂直居中计算报告未加工的线条数量。
我在这上面阅读了很多帖子,并认为" Delphi - Draw text multiline in the centre of a rect"可能会得到答案,但它没有(使用链接问题http://zoomplayer.com/pix/font_vcenter.jpg中的示例输出代码的屏幕截图)。接受的答案的作者建议我创建一个新问题,所以在这里。
为了快速参考,这里是链接的接受答案的略微简化(删除不相关的代码)文本呈现代码:
procedure DrawTextCentered(Canvas: TCanvas; const R: TRect; S: String);
var
DrawRect: TRect;
DrawFlags: Cardinal;
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;
DrawTextEx(Canvas.Handle, PChar(S), -1, DrawRect, DrawFlags, nil);
end;
从屏幕截图中可以看出,问题出现在使用&#34; DT_CALCRECT&#34;初始调用DrawText之后。标记以测量输出高度以便以后垂直居中,渲染字符串&#34;趋势:全球&#34;返回表示3行文本的DrawRect.Bottom值,即使只绘制了2行,也会破坏垂直居中代码。