CTextRender 类
一篇关于 TextOut (ExtTextOut) 函数替代方案的文章。
引言
本文介绍的是对 TextOut
GDI 函数所做的改进。通过提供的文本渲染类,可以利用 RTF 标签(“\b”、“\i”、“\u”、“\par”、“\r”、“\n”)执行简单的文本格式化,并且可以在给定的边界矩形内进行简单的文本对齐(左对齐、居中、右对齐、顶部、中间、底部)。
请注意,您不受任何限制,可以将此类仅用于 MFC 应用程序。
背景
CodeProject 上有关于类似主题的文章,但这只是开发易于使用但功能强大的文本格式化功能的初步步骤。
使用代码
要使用代码,请在您的项目中包含头文件“TextRender.h”。然后添加一个 CTextRender
类的实例。调用 EnhDrawText
方法,并提供文本,就完成了。
#include "TextRender.h" // hDC is the device context for text rendering CTextRender m_TextRender; char text[] = "\\b1Hello, World !!!\\b0\\par\\par\\i1Thi" "s is a simple demonstration\\par of new\\i0" " \\ul1EnhDrawText\\ul0 \\i1function...\\i0"; RECT margins = {10, 5, 10, 5}; RECT textRect = {100, 100, 300, 300}; DWORD textAlignment = THA_CENTER | TVA_MIDDLE; m_TextRender.EnhDrawText( hDC, text, strlen(text), &textRect, &margins, textAlignment );
现在,让我们看看 EnhDrawText
的其他参数是什么。第一个参数是用于文本渲染的设备上下文的句柄。第二个和第三个参数分别是带有格式化标签的文本和文本的长度。第四个参数是文本边界矩形(所有换行都将在此矩形内完成)。第五个参数是文本边距,最后是文本对齐标志。它可以具有以下水平对齐值
THA_LEFT
THA_CENTER
THA_RIGHT
此外,它可以采用以下垂直对齐值
TVA_TOP
TVA_MIDDLE
TVA_BOTTOM
组合这些值以获得不同的结果。
文本格式化标签
文本格式化使用基本的 RTF(富文本格式)标签进行。CTextRender
类此版本支持以下标签
- \b1 - 加粗文本开启
- \b0 - 加粗文本关闭
- \i1 - 斜体文本开启
- \i0 - 斜体文本关闭
- \u1 - 下划线文本开启
- \u0 - 下划线文本关闭
- \par - 新行标志,(与以下组合相同)
- \r - 回车标志,(单独使用不起作用)
- \n - 换行标志,(可以单独使用)
计算文本高度
要计算格式化的文本高度,请使用 CTextRender
类的 CalculateTextHeight
方法。请参阅下面的示例
int textHeight = CalculateTextHeight( hDC, text, strlen(text), textRect, margins, width, height ); // To set width and height arguments do next // width = textRect->right - textRect->left - (margins->right+margins->left); // height = textRect->bottom - textRect->top - (margins->top+margins->bottom);
关注点
在处理这个问题时,我意识到通过 ExtTextOut
甚至 DrawTextEx
进行基本的文本渲染支持是不够的,因此我正在尝试将这些 GDI 函数升级到可以用于高级文本渲染的水平。
历史
在 CTextRender
类的此版本中,支持基本的文本格式化和对齐。对于下一次升级,计划扩展支持的 RTF 标签列表,并添加文本对齐和 Unicode 文本支持。