简单的HTML绘图类






4.72/5 (25投票s)
2003 年 4 月 6 日
4分钟阅读

172328

5449
将HTML文本绘制到设备上下文。
引言
在我的一些项目中,我需要在Windows环境和浏览器中显示一些富文本,并希望它们的外观大致相同。我不需要嵌入图像或超链接,只需要一些简单的文本格式,如颜色、字体名称以及粗体/斜体/下划线属性。我还希望能够控制背景的外观。因此,使用HTML或Rich Text控件并不是一个显而易见的选择。
我的意图不是重新发明轮子,提供一个真正的HTML解析器,而只是一个我几乎可以在任何地方使用的精简版HTML查看器。随时改进代码并添加对其他HTML标签(或您自己的标签,如果需要)的支持。让我知道您所做的任何改进,以便我更新源代码(以及我的项目)。
当时我得知Hans Dietrich已经开发了一个非常类似的功能在此。查看他的控件,并受到那里一些评论的启发,我决定创建另一个控件CHTMLStatic
,它将支持超链接和<p>
标签。
背景
现在是自夸的部分!无论如何,这是Drawer
支持的标签列表:
<B>
和</B>
或<STRONG>
和</STRONG>
:将标签之间的文本设置为粗体<I>
和</I>
或<EM>
和</EM>
:将文本设置为斜体<U>
和</U>
:给文本加下划线<FONT>
和</FONT>
:设置字体名称、大小和颜色(支持的属性是FACE
、COLOR
和SIZE
)。您可以通过其RGB值或名称来指定颜色(输入列表相当痛苦)。<BR>
:添加一个换行符<P>
:定义一个段落。唯一支持的属性是ALIGN
(值可以是left、center或right)。<CENTER>
:定义一个居中段落。<A HREF=url>
:定义一个超链接。
两点不符合HTML标准:
- 当遇到2个空格时,HTML假定只有一个。我不是。
- 换行符在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
用作临时存储类,您可能不需要在代码中引用它。
实现方法
- 尝试将文本分解成具有相同字体设置的小部分。这就是我所说的原子。这在
ParseHTMLText()
中完成。 - 然后,每当一个原子超出矩形右侧时,它就会被分解成更小的原子(尝试在空格处断开)。此函数还计算原子的显示位置。有关详细信息,请检查
BreakIntoLines()
。
我们还跟踪与URL链接的原子。 - 最后,我们在
ApplyAlignments
中找到最低原子的位置以垂直居中文本并应用对齐。 - 实际的绘制在
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的主意……感谢您的积极反馈!)。
- 我对