正在阅读:CRichEditCtrl实现MSN背景,字体,超链接CRichEditCtrl实现MSN背景,字体,超链接

2005-07-13 10:22 出处: 作者:dtianx 责任编辑:moningfeng

  相关链接:CRichEditCtrl实现MSN/QQ动画表情


  首先对标题说明一下,在MSN中,聊天的窗口可能是一个自定义的类。大家用Spy ++可以看看。

  对与自定义窗口,可以使用CreateWindow, SetWindowLong或者是SubclassWindow实现,不过这不是我现在讨论的话题。

  好, 先看看效果再说(如图1):


图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};

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品