多行超文本编辑控件






4.89/5 (31投票s)
一个从 CEdit 派生的多行超链接编辑控件。
引言
CHyperEdit
的灵感来源于以下帖子。
CHyperEdit
是标准 MFC CEdit
控件的直接替代品,无需额外的初始化或函数调用即可完全正常运行。但是,可以微调构成可超链接标记的确切内容,并且可以通过重写虚拟函数 IsWordHyper
在派生的 CHyperEdit
类中轻松实现;点击这里查看示例。
特点
- 可自定义的超链接和悬停颜色。
- 多个超链接可以与普通文本自由混合。
- 可扩展的超链接标记器。
API
public
COLORREF GetNormalColor()
COLORREF GetHoverColor()
void SetLinkColors(COLORREF clrNormal, COLORREF clrHover)
CString IsHyperlink(CPoint& pt)
受保护的
virtual BOOL IsWordHyper(const CString& csToken)
用法
基本用法
使用 CHyperEdit
再简单不过了,只需向对话框添加一个普通的 EDIT
控件。右键单击您刚添加的 EDIT
控件并选择Classwizard。单击成员变量选项卡。双击您刚添加的 EDIT
控件的控件 ID。输入一个成员变量名称,然后在类别下拉列表中选择控件而不是值。在变量类型下拉列表下,您现在应该看到 CHyperEdit
。
注意:您可能需要删除您的 *.clw 文件并重新构建它,CHyperEdit
才能可用.
如果 CHyperEdit
类不可用,您可以只选择 CEdit
并将任何 CEdit
实例替换为 CHyperEdit
。您可能还必须在编译之前手动添加所需的 #include
指令。
高级用法
为了更好地控制 CHyperEdit
,您可以选择覆盖超链接标记器的默认功能,并更好地指定构成可超链接 URL 的确切内容。例如,以下代码片段通过仅超链接域名中包含 www 的标记来扩展默认行为。如果我们希望忽略 IP 地址,这将非常有用。
// Derived class overrides this function to extend hyperlinking BOOL CMyHyperEdit::IsWordHyper(const CString& csToken) const { if(IsWhiteSpace(csToken, 0)) return FALSE; CString csTemp(csToken); // Make a temp copy so we can convert it's case csTemp.MakeLower(); // Ignore IP addresses if(csTemp.Left(7) == "http://www") return TRUE; return FALSE; // Not a valid token by default }
注意:您也可以使用现成的正则表达式库,如 regex++,对 URL 或电子邮件地址进行更复杂的语法检查。
IsHyperlink
是一个公开可用的函数,其目的可能并不立即显现;说实话,我只是现在才意识到它可能有用。 :)
此函数返回鼠标当前悬停的整个超链接标记(如果有)。如果调用此函数时鼠标未悬停在任何超链接标记上,则它将返回 CString::Empty()
的结果。
发挥一点想象力,会出现一些有趣的可能性。例如,您可以在应用程序中使用 WM_TIMER
并检查 IsHyperlink
的返回值;如果它返回一个网站的有效 URL,您可以下载 HTML 页面并提取 TITLE
并将其显示在工具提示中。