65.9K
CodeProject 正在变化。 阅读更多。
Home

CTextRender 类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.63/5 (18投票s)

2005年10月20日

CPOL

2分钟阅读

viewsIcon

48271

downloadIcon

1937

一篇关于 TextOut (ExtTextOut) 函数替代方案的文章。

TextRender - Sample project.jpg

引言

本文介绍的是对 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 文本支持。

© . All rights reserved.