加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi – 在rect的中心绘制文本多行

发布时间:2020-12-15 03:51:49 所属栏目:大数据 来源:网络整理
导读:在Delphi中,我希望在TRect中绘制文本.我希望有以下功能: 在TRect中垂直居中绘制文本 在TRect中水平居中绘制文本 如果有超过1行文本的空间(使用TRect的高度),则绘制文本多行 如果文本不适合TRect(在单行或多行上),则将省略号附加到文本中. 我可以看到Windows
在Delphi中,我希望在TRect中绘制文本.我希望有以下功能:

>在TRect中垂直居中绘制文本
>在TRect中水平居中绘制文本
>如果有超过1行文本的空间(使用TRect的高度),则绘制文本多行
>如果文本不适合TRect(在单行或多行上),则将省略号附加到文本中.

我可以看到Windows.DrawText()函数几乎涵盖了这个功能,但是在写文本时,多行和垂直居中是互斥的.

我想知道这个功能是否内置于windows(2000)中?如果没有,有没有办法在不编写自己的功能的情况下这样做?

解决方法

对不起,这是以前所有答案和评论的组合.但似乎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,(R.Bottom - DrawRect.Bottom) div 2)
  else
    DrawRect.Bottom := R.Bottom;
  ZeroMemory(@DrawParams,SizeOf(DrawParams));
  DrawParams.cbSize := SizeOf(DrawParams);
  DrawTextEx(Canvas.Handle,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,200,140);
  Canvas.Rectangle(R);
  InflateRect(R,-1);
  Caption := Format('%d characters drawn',[DrawTextCentered(Canvas,R,S)]);
end;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读