鱼C论坛

 找回密码
 立即注册
查看: 18688|回复: 9

[API档案] DrawText

[复制链接]
发表于 2014-5-28 18:01:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
函数原型:

DrawText 函数在指定的矩形里写入格式化的正文,根据指定的方法对正文格式化(扩展的制表符,字符对齐、折行等)。

需要指定更多的格式选项,可以使用 DrawTextEx 函数。


API 函数原型:
int DrawText(
  _In_     HDC hDC,
  _Inout_  LPCTSTR lpchText,
  _In_     int nCount,
  _Inout_  LPRECT lpRect,
  _In_     UINT uFormat
);

参数解析:

参数 含义
hDC 指定“显示设备描述表”句柄
lpchText 1. 指向将被写入的字符串的指针,如果参数 nCount 是 -1,则字符串必须是以 \0 结束的
2. 如果 uFormat 包含 DT_MODIFYSTRING,则函数可为此字符串增加 4 个字符,存放字符串的缓冲区必须足够大,能容纳附加的字符
nCount 1. 指向字符串中的字符数
2. 如果 nCount 为 -1,则 lpchText 指向的字符串被认为是以 \0 结束的,DrawText 会自动计算字符数
lpRect 指向 RECT 结构的指针,其中包含文本将被置于其中的矩形的信息(按逻辑坐标)
uFormat 1. 指定格式化文本的方法
2. 此参数可以通过指定下列标志或标志的组合


uFormat 参数各种标志解析

标志 含义
DT_BOTTOM 对齐文字到矩形的底部,当且仅当设置了 DT_SINGLELINE 标志才有效
DT_CALCRECT 1. 这个参数决定矩形的宽度和高度
2. 如果输出文本有多行,DrawText 函数使用 lpRect 定义的矩形的宽度,并扩展矩形的底部以容纳输出文本的最后一行
3. 如果输出文本只有一行,则 DrawText 函数改变矩形的右边界,以容纳下正文行的最后一个字符
4. 出现上述任何一种情况,DrawText 函数将返回格式化文本的高度,而不是绘制文本
DT_CENTER 文本水平居中显示
DT_EDITCONTROL 将拥有多行编辑控件的正文显示特性(尤其是平均字符宽度的计算方法,并且不会显示不可见的最后一行)
DT_END_ELLIPSIS 1. 对于显示的文本,如果结束的字符串的范围不在矩形内,它会被截断并以省略号标识
2. 如果一个字母不是在字符串的末尾但却超出了矩形范围,它会被换行但没有追加省略号标识
3. 除非指定了 DT_MODIFYSTRING 标志,否则字符串不会被修改
DT_EXPANDTABS 1. 扩展制表符,每个制表符的缺省字符数是 8
2. DT_WORD_ELLIPSIS, DT_PATH_ELLIPSIS 和 DT_END_ELLIPSIS 不能和此参数一起使用
DT_EXTERNALLEADING 在行的高度里包含字体的外部标头(通常外部标头不被包含在正文行的高度里)
DT_HIDEPREFIX 1. 忽略正文中的前缀字符(&),并且前缀字符后面的字母不会出现下划线,其它前缀字符的调用方式不受影响
2. 例如:输入字符串为“F&is&&hC”,正常显示为“Fis&hC”,使用 DT_HIDEPREFIX 显示为“Fis&hC”
DT_INTERNAL 用系统字体来计算正文尺寸
DT_LEFT 正文左对齐
DT_MODIFYSTRING 1. 允许系统修改给定的字符串来匹配显示的正文
2. 此标志必须和 DT_END_ELLIPSIS 或 DT_PATH_ELLIPSIS 同时使用
DT_NOCLIP 无裁剪绘制,使用 DT_NOCLIP 可以提高 DrawText 的效率
DT_NOFULLWIDTHCHARBREAK 1. 在宽字符的字符串中防止行断开,因此折行规则相当于单字符的字符串
2. 例如,我们可以用在韩国版的 Windows 中,为图标标签提供更好的可读性
3. 除非指定 DT_WORDBREAK,否则此值没有作用
DT_NOPREFIX1. 关闭前缀字符的处理(通常 DrawText 解释 & 为给其后的字符加下划线,解释 && 为显示单个 &)
2. 例如:输入字符串为“F&is&&hC”,正常显示为“Fis&hC”,使用 DT_NOPREFIX 显示为“F&is&&hC”
DT_PATH_ELLIPSIS 1. 对于过长的正文,自动替换字符串中间的字符为省略号(...),以确保结果能在合适的矩形内显示
2. 如果该字符串包含反斜杠(\)字符,DT_PATH_ELLIPSIS 尽可能的保留最后一个反斜杠之后的字符
3. 除非指定了 DT_MODIFYSTRING 标志否则字符串不会被修改
DT_PREFIXONLY1. 仅仅在(&)前缀字符的位置下绘制一个下划线,但不绘制字符串中的任何其他字符
2. 例如:输入字符串为“F&is&&hC”,正常显示为“Fis&hC”,使用 DT_PREFIXONLY 显示为“_”
DT_RIGHT 正文右对齐
DT_RTLREADING 当设备环境的字体是希伯来文或阿拉伯文字体时,为双向正文安排从右到左的阅读顺序
DT_SINGLELINE 显示正文的同一行,回车和换行符都不能换行
DT_TABSTOP 1. 设置制表符,参数 uFormat 的 8~15 位(低位字中的高位字节)指定每个制表符的字符数,每个制表符的缺省字符数是 8
2. DT_CALCRECT, DT_EXTERNALLEADING, DT_INTERNAL, DT_NOCLIP 和 DT_NOPREFIX 不能和此参数一起使用
DT_TOP 正文顶端对齐
DT_VCENTER 使正文在矩形中垂直居中,当且仅当设置了 DT_SINGLELINE 标志才有效
DT_WORDBREAK 1. 当一行中的字符将会延伸到由 lpRect 指定的矩形的边框时,此行自动地在单词之间断开
2. 一个回车一换行也能使之换行
3. 如果没有指定,输出会在一行上
DT_WORD_ELLIPSIS 截短不符合矩形的正文,并增加省略号(与 DT_END_ELLIPSIS 类似)


返回值:

1. 如果函数调用成功,返回值是正文的高度(逻辑单位);

2. 如果指定了 DT_VCENTER 或 DT_BOTTOM,返回值是 lpRect -> top 到绘制的正文的底部的偏移值;

3. 如果 函数调用失败,返回值是 0。


备注:

1. 函数 DrawText 用设备环境中的字体选择、正文颜色和背景颜色来写正文。

2. DrawText 裁剪正文,使之不会出现在指定矩形的外面,除非指定了 DT_NOCLIP。

3. 除非使用 DT_SINGLELINE 格式化,否则其余的格式都认为正文有多行。

4. 如果选择的字体对指定的矩形而言太大,DrawText 并不会试图去换成一种小字体。

5. 设备环境的正文对齐方式必须包括 TA_LEFT, TA_TOP 和 TA_NOUPDATECP 标志。

【API档案】版权归鱼C工作室(www.fishc.com)所有,转载请注明来源。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-29 20:56:24 | 显示全部楼层
好累! 好累! 好累!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2014-8-6 17:08:20 | 显示全部楼层
黑色 发表于 2014-5-29 20:56
好累! 好累! 好累!

我也是Me too!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

发表于 2015-2-12 13:08:36 | 显示全部楼层

我也是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-12 18:46:13 | 显示全部楼层
内容有点多呀:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-9-16 20:36:06 | 显示全部楼层
感谢叫甲鱼老师
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-30 21:35:53 | 显示全部楼层
刚学,请问怎么设置DrawText函数绘制之后的位置?是和&rect有关么?GetClientRect(hwnd, &rect);是不是就是把hwnd句柄代表的窗口的中间坐标传给rect?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2016-10-22 13:14:11 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-30 09:59:43 | 显示全部楼层
非常详细啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-17 23:09:34 | 显示全部楼层
为什么我无法使用Text Out函数呢?编译器告诉我未定义的引用  undefined reference to `TextOutA@20'  这是怎么回事求解决啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-21 22:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表