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

简单的HTML绘图类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.72/5 (25投票s)

2003 年 4 月 6 日

4分钟阅读

viewsIcon

172328

downloadIcon

5449

将HTML文本绘制到设备上下文。

Sample Image - HTMLDrawer.gif

引言

在我的一些项目中,我需要在Windows环境和浏览器中显示一些富文本,并希望它们的外观大致相同。我不需要嵌入图像或超链接,只需要一些简单的文本格式,如颜色、字体名称以及粗体/斜体/下划线属性。我还希望能够控制背景的外观。因此,使用HTML或Rich Text控件并不是一个显而易见的选择。

我的意图不是重新发明轮子,提供一个真正的HTML解析器,而只是一个我几乎可以在任何地方使用的精简版HTML查看器。随时改进代码并添加对其他HTML标签(或您自己的标签,如果需要)的支持。让我知道您所做的任何改进,以便我更新源代码(以及我的项目)。

当时我得知Hans Dietrich已经开发了一个非常类似的功能在此。查看他的控件,并受到那里一些评论的启发,我决定创建另一个控件CHTMLStatic,它将支持超链接和<p>标签。

背景

现在是自夸的部分!无论如何,这是Drawer支持的标签列表:

  • <B></B><STRONG></STRONG>:将标签之间的文本设置为粗体
  • <I></I><EM></EM>:将文本设置为斜体
  • <U></U>:给文本加下划线
  • <FONT></FONT>:设置字体名称、大小和颜色(支持的属性是FACECOLORSIZE)。您可以通过其RGB值或名称来指定颜色(输入列表相当痛苦)。
  • <BR>:添加一个换行符
  • <P>:定义一个段落。唯一支持的属性是ALIGN(值可以是left、center或right)。
  • <CENTER>:定义一个居中段落。
  • <A HREF=url>:定义一个超链接。

两点不符合HTML标准:

  1. 当遇到2个空格时,HTML假定只有一个。我不是。
  2. 换行符在HTML中被解释为空格,在这里不是。

如果您需要,这些很容易实现。

Using the Code

您可以选择使用CHTMLDrawer及其static函数DrawText。这只会渲染HTML,而不会允许您使用超链接。

/////////////////////////////////////////////////////////////
// DrawText
/////////////////////////////////////////////////////////////
// Parameters:
// pDC : Device context
// strText: Text to be drawn
// fntDefault : Default font to be used
// rctPosition : Rectangle in which the text is to be drawn
// nAlignment: 0 (left) or 1 (centered) or 2 (right)
/////////////////////////////////////////////////////////////
void CHTMLDrawer::DrawText(CDC * pDC, const CString & strText,
            const CHTMLFont & fntDefault,CRect & rctPosition,short nAlignment)

或者,您可以使用控件CHTMLStatic。您可以定义其背景颜色、使用的默认字体、高亮超链接的颜色以及在高亮时是否带有下划线。

CHTMLFont封装了一个字体的定义(名称、属性、大小和颜色)。您需要它来定义使用的默认字体。CHTMLAtom用作临时存储类,您可能不需要在代码中引用它。

实现方法

  1. 尝试将文本分解成具有相同字体设置的小部分。这就是我所说的原子。这在ParseHTMLText()中完成。
  2. 然后,每当一个原子超出矩形右侧时,它就会被分解成更小的原子(尝试在空格处断开)。此函数还计算原子的显示位置。有关详细信息,请检查BreakIntoLines()
    我们还跟踪与URL链接的原子。
  3. 最后,我们在ApplyAlignments中找到最低原子的位置以垂直居中文本并应用对齐。
  4. 实际的绘制在DrawAtoms中完成。

备注

整个过程并不算太复杂,尽管我确信仍然存在一些错误,并且有很大的优化空间。只要您不对我不利的后果负责,就可以随意使用它!

代码的某些部分受到了Hans Dietrich的启发(或复制),而Hans Dietrich本人又从Chris Maunder那里借鉴,Chris Maunder是Paul DiLascia的MSJ专栏的忠实读者。

历史

  • 2003年3月23日:v1.0
  • 2003年4月11日:v1.1
    • 添加了控件CHTMLStatic,它支持超链接(并且文本保持在边界内 - 感谢Doc McClenny)。
    • 添加了对以下标签的支持:<P><CENTER><A HREF=url><EM>
      不同字号的文本已正确对齐,并删除了字号的7个上限(感谢Chopper的评论)。
    • 最后,感谢Hockey向我展示了Hans Dietrich的文章,我毫不惭愧地借鉴了它...
  • 2003年8月4日:v1.2
    • 我对CHTMLStatic(封装了绘图器的控件)进行了一些错误修复,包括调整大小问题和光标闪烁(感谢Pranavamhari的评论)。
    • 我还添加了一个新的示例,将绘图器封装在一个视图中,该视图允许使用垂直滚动条(这是Koh Zi Chun的主意……感谢您的积极反馈!)。
© . All rights reserved.