图1:实现效果图
一、MSN超链接的实现
关于HyperLink的是实现,我找到了一种自绘的实现方式,自己维护,效果也很不错(如图2)。

图2:超链接
就在我觉得实现OLE的插入有难度时,就想过了直接自己绘制,自己维护,但是觉得做法不是很正统,对不起Microsoft给我留的IRichEditOle接口,就没有使用这种解决方法。我们大致讲一下实现方式:
定义一个struct描述每个hyperlink对象:
1typedef struct _HYPERLINKINFO
2{
3 CRect rectDimension;
4 CString csLinkText;
5 UINT unLinkDlgID;
6 inline operator = (struct _HYPERLINKINFO linkInfo){ rectDimension = linkInfo.rectDimension;csLinkText = linkInfo.csLinkText;unLinkDlgID = linkInfo.unLinkDlgID;}
7}HYPERLINKINFO,*LPHYPERLINKINFO;
这里有一个UINT unLinkDlgID,是来描述点击这个link后弹出的dialog的。
CRect rectDimension;用来保存这个link的rect,以检查鼠标是否在其中,以显示鼠标光标;对于多links,他使用了一个CList来维护(或者可以选择使用std::list):
1CList m_lsLinks;
其中很关键的就是判断鼠标是不是在一个link的rect内。这种实现的确很不错,但是我要说的是另一个更现代的实现方式,实现起来也简单得多,关键的就是有个Style =>。ENM_LINK 这个style在RichEdit20中才有,所以我们应该使用RichEdit20A!我们维护这样一个类:
1class _AFX_RICHEDITEX_STATE
2{
3public:
4 _AFX_RICHEDITEX_STATE();
5 virtual ~_AFX_RICHEDITEX_STATE();
6 HINSTANCE m_hInstRichEdit20 ;
7};
eyW北方站长站
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面