|
相关链接: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};
更多内容请看MSN专题专题,或 实现代码就一点,就是用这个类来Load Richedit20
1_AFX_RICHEDITEX_STATE::_AFX_RICHEDITEX_STATE() 2{ 3 m_hInstRichEdit20 = NULL ; 4} 5 6 7 8_AFX_RICHEDITEX_STATE::~_AFX_RICHEDITEX_STATE() 9{
10 if( m_hInstRichEdit20 != NULL ) 11 { 12 ::FreeLibrary( m_hInstRichEdit20 ) ; 13 } 14} 15 16 17 18_AFX_RICHEDITEX_STATE _afxRichEditStateEx ; 19 20 21 22BOOL PASCAL AfxInitRichEditEx() 23{
上一篇:C/C++头文件一览
下一篇:CRichEditCtrl实现MSN/QQ动画表情
|