学习笔记 :DrawText
2015-12-23 09:49
393 查看
最近在做一个TStringGrid的自绘处理,在画文字处理上遇到了高度的计算问题。后来经过一段时间还是找到了一些方法:
函数原型
int DrawText(
HDC hDC, // 设备描述表句柄
LPCTSTR lpString, // 将要绘制的字符串
int nCount, // 字符串的长度
LPRECT lpRect, // 指向矩形结构RECT的指针
UINT uFormat // 正文的绘制选项
);
参数
hdc:
[输入]设备环境句柄。
lpString:
[输入]指向将被写入的字符串的指针,如果参数nCount是-1,则字符串必须是以\0结束的。 如果uFormat包含DT_MODIFYSTRING,则函数可为此字符串增加4个字符,存放字符串的缓冲区必须足够大,能容纳附加的字符。
nCount:
[输入]指向字符串中的字符数。如果nCount为-1,则lpString指向的字符串被认为是以\0结束的,DrawText会自动计算字符数。
lpRect:
[输入/输出]指向结构RECT的指针,其中包含文本将被置于其中的矩形的信息(按逻辑坐标)。
uFormat:
[输入]指定格式化文本的方法。它可以下列值的任意组合,各值描述如下:
DT_CALCRECT:这个参数比较重要,可以使DrawText函数计算出输出文本的尺寸。如果输出文本有多行,DrawText函数使用lpRect定义的矩形的宽度,并扩展矩形的底部以容纳输出文本的最后一行。如果输出文本只有一行,则DrawText函数改变矩形的右边界,以容纳下正文行的最后一个字符。出现上述任何一种情况,DrawText函数将返回格式化文本的高度,而不是绘制文本。
DT_CENTER:指定文本水平居中显示。
DT_VCENTER:指定文本垂直居中显示。该标记只在单行文本输出时有效,所以它必须与DT_SINGLELINE结合使用。
DT_SINGLELINE:单行显示文本,回车和换行符都不断行。
函数里面最后面那段蓝字标示的很重要,DT_CALCRECT就是用来计算文本尺寸的哦。。做个试验吧:
注意点:
这里有一点,DrawText计算后的矩形大小还是通过cellRect来返回的哦。这个参数传入时是做为计算文本显示的矩形大小,返回时就是文本实际占用的矩形大小。
同时DrawText运算后也会有函数返回值的,就是文本实际的高度。
1、使用TLabel
这个方法是有点绕路的,方法倒是简单,就是使用AutoSize属于来完成。。2、使用DrawText
DrawText的函数定义:函数原型
int DrawText(
HDC hDC, // 设备描述表句柄
LPCTSTR lpString, // 将要绘制的字符串
int nCount, // 字符串的长度
LPRECT lpRect, // 指向矩形结构RECT的指针
UINT uFormat // 正文的绘制选项
);
参数
hdc:
[输入]设备环境句柄。
lpString:
[输入]指向将被写入的字符串的指针,如果参数nCount是-1,则字符串必须是以\0结束的。 如果uFormat包含DT_MODIFYSTRING,则函数可为此字符串增加4个字符,存放字符串的缓冲区必须足够大,能容纳附加的字符。
nCount:
[输入]指向字符串中的字符数。如果nCount为-1,则lpString指向的字符串被认为是以\0结束的,DrawText会自动计算字符数。
lpRect:
[输入/输出]指向结构RECT的指针,其中包含文本将被置于其中的矩形的信息(按逻辑坐标)。
uFormat:
[输入]指定格式化文本的方法。它可以下列值的任意组合,各值描述如下:
DT_CALCRECT:这个参数比较重要,可以使DrawText函数计算出输出文本的尺寸。如果输出文本有多行,DrawText函数使用lpRect定义的矩形的宽度,并扩展矩形的底部以容纳输出文本的最后一行。如果输出文本只有一行,则DrawText函数改变矩形的右边界,以容纳下正文行的最后一个字符。出现上述任何一种情况,DrawText函数将返回格式化文本的高度,而不是绘制文本。
DT_CENTER:指定文本水平居中显示。
DT_VCENTER:指定文本垂直居中显示。该标记只在单行文本输出时有效,所以它必须与DT_SINGLELINE结合使用。
DT_SINGLELINE:单行显示文本,回车和换行符都不断行。
函数里面最后面那段蓝字标示的很重要,DT_CALCRECT就是用来计算文本尺寸的哦。。做个试验吧:
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运算后也会有函数返回值的,就是文本实际的高度。
相关文章推荐
- Struts-Menu角色权限的实例代码
- java内存管理
- Android应用开发中单元测试分析
- 有一个本地文件的路径或者文件的名字,计算文件的大小
- Linux环境Tomcat运行报错java.lang.OutOfMemoryError
- iOS---取出字符串中的数字
- [Java]Java工程师成神之路
- 从URL中移除JSESSIONID
- OCI编程
- ASP.NET Boilerplate 深入系列之:概述
- 单例模式示例
- Android编程开发之Spinner控件用法实例分析
- 串的模式匹配算法---RK
- 多线程编程与同步控制(Java与C)
- Qt之认识JSON
- spring security 转
- Android Native 实用型开发指南
- Javacript中文传参Java解码说明(附参考资料)
- CPU affinity
- nginx/apache/php隐藏http头部版本信息的实现方法