学习笔记 :DrawText

2018-01-12 18:00:25 浏览数 (1)

最近在做一个TStringGrid的自绘处理,在画文字处理上遇到了高度的计算问题。后来经过一段时间还是找到了一些方法:

1、使用TLabel

  这个方法是有点绕路的,方法倒是简单,就是使用AutoSize属于来完成。。

2、使用DrawText

  DrawText的函数定义:

函数原型 int DrawText( HDC hDC, // 设备描述表句柄 LPCTSTR lpString, // 将要绘制的字符串 int nCount, // 字符串的长度 LPRECT lpRect, // 指向矩形结构RECT的指针 UINT uFormat // 正文的绘制选项 ); 参数 hdc: [输入]设备环境句柄。 lpString: [输入]指向将被写入的字符串的指针,如果参数nCount是-1,则字符串必须是以结束的。 如果uFormat包含DT_MODIFYSTRING,则函数可为此字符串增加4个字符,存放字符串的缓冲区必须足够大,能容纳附加的字符。 nCount: [输入]指向字符串中的字符数。如果nCount为-1,则lpString指向的字符串被认为是以结束的,DrawText会自动计算字符数。 lpRect: [输入/输出]指向结构RECT的指针,其中包含文本将被置于其中的矩形的信息(按逻辑坐标)。 uFormat: [输入]指定格式化文本的方法。它可以下列值的任意组合,各值描述如下: DT_CALCRECT:这个参数比较重要,可以使DrawText函数计算出输出文本的尺寸。如果输出文本有多行,DrawText函数使用lpRect定义的矩形的宽度,并扩展矩形的底部以容纳输出文本的最后一行。如果输出文本只有一行,则DrawText函数改变矩形的右边界,以容纳下正文行的最后一个字符。出现上述任何一种情况,DrawText函数将返回格式化文本的高度,而不是绘制文本。 DT_CENTER:指定文本水平居中显示。 DT_VCENTER:指定文本垂直居中显示。该标记只在单行文本输出时有效,所以它必须与DT_SINGLELINE结合使用。 DT_SINGLELINE:单行显示文本,回车和换行符都不断行。

函数里面最后面那段蓝字标示的很重要,DT_CALCRECT就是用来计算文本尺寸的哦。。做个试验吧:

代码语言:javascript复制
procedure TForm1.Button1Click(Sender: TObject);
var
  sData: string;
  cellRect: TRect;
begin
  cellRect.Left := 10;
  cellRect.Top := 10;
  cellRect.Right := 200;
  cellRect.Bottom := 25;
  sData := '中中国国国 大';
  DrawText(Canvas.Handle, PChar(sData), Length(sData), cellRect, DT_WORDBREAK or DT_CALCRECT);
end;//执行后没有在界面上画文本

procedure TForm1.Button2Click(Sender: TObject);
var
  sData: string;
  cellRect: TRect;
begin
  cellRect.Left := 10;
  cellRect.Top := 10;
  cellRect.Right := 200;
  cellRect.Bottom := 25;
  sData := '中中国国国 大';
  DrawText(Canvas.Handle, PChar(sData), Length(sData), cellRect, DT_WORDBREAK);
end;//执行后在界面上显示一行字

注意点:

  • 这里有一点,DrawText计算后的矩形大小还是通过cellRect来返回的哦。这个参数传入时是做为计算文本显示的矩形大小,返回时就是文本实际占用的矩形大小。
  • 同时DrawText运算后也会有函数返回值的,就是文本实际的高度。

0 人点赞