richedit 中的链接问题


这种实现的确很不错,但是我么要说的是另一个更现代的实现方式,实现起来也简单得多,关键的就是有个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};
实现代码就一点,就是用这个类来Load Richedit20


<script type="text/javascript"> function ToggleSourceCodeRegion(regionNumber) { var divRegion = document.getElementById('region' + regionNumber); var divRegionBlock = document.getElementById('regionBlock' + regionNumber); if (divRegion.style.display == 'inline') { divRegion.style.display = 'none'; divRegionBlock.style.display = 'inline'; } else { divRegion.style.display = 'inline'; divRegionBlock.style.display = 'none'; } } </script>
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{
24    if( ! ::AfxInitRichEdit() )
25    {
26        return FALSE ;
27    }
28    _AFX_RICHEDITEX_STATE* l_pState = &_afxRichEditStateEx ;
29    if( l_pState->m_hInstRichEdit20 == NULL )
30    {
31        l_pState->m_hInstRichEdit20 = LoadLibraryA("RICHED20.DLL") ;
32    }
33    return l_pState->m_hInstRichEdit20 != NULL ;
34}
然后在我们创建RichEdit的时候,就使用 RichEdit20A 作为ClassName;

1CreateEx(dwExStyle, _T( "RichEdit20A" ), NULL, dwStyle, rect, pParentWnd, nID, NULL );
这样一来,你就使用先进的RichEdit20A了, 可以简单的实现你的要的功能了。
先给你的RichEditCtrl设置EN_LINK Style, 代码量也是少得可怜:



1unsigned mask = ::SendMessage(m_hWnd, EM_GETEVENTMASK, 0, 0);
2::SendMessage
(m_hWnd, EM_SETEVENTMASK, 0, mask | ENM_LINK | ENM_MOUSEEVENTS | ENM_SCROLLEVENTS | ENM_KEYEVENTS); 3::SendMessage(m_hWnd, EM_AUTOURLDETECT, true, 0);
如果你觉得使用CRichEditCtrl的Member Function更方便的话,当然可以使用GetEventMak和SetEventMask,同样方便。
是不是这样就完了呢?呵呵,并不象你想象中的那么完美,而是比你想象中的更完美呢!为了扩展的需要,RichEdit20并没有
定义为,当你点击links的时候用浏览器打开这个页面,而是让你处理这个点击,你就可以任意的扩展,做到一切皆有可能!






ON_NOTIFY(EN_LINK, IDC_SENDMSG, OnRichEditExLink )



知道在哪加吧?呵呵。这个IDC_SENGMSG就是RichEdit的Resource ID, OnRichEditExLink就是处理这个消息的函数咯,
然后看最后的代码,今天的任务就完成了!

1void CMsgerDlg::OnRichEditExLink( NMHDR* in_pNotifyHeader, LRESULT* out_pResult )
2{
3 ENLINK* l_pENLink = ( ENLINK* )in_pNotifyHeader ;
4 *out_pResult = 0 ;
5 switch( l_pENLink->msg )
6 {
7  default:{}
8  break ;
9
10  case WM_LBUTTONDOWN:
11  {
12   CString l_URL ;
13   CHARRANGE l_CharRange ;
14   CExtRichEdit *m_TempEdit;
15   m_TempEdit = (CExtRichEdit*)CExtRichEdit::FromHandle(l_pENLink->nmhdr.hwndFrom);
16   m_TempEdit->GetSel( l_CharRange ) ;
17   m_TempEdit->SetSel( l_pENLink->chrg ) ;
18   l_URL = m_TempEdit->GetSelText() ;
19   m_TempEdit->SetSel( l_CharRange ) ;
20   CWaitCursor l_WaitCursor ;
21   ShellExecute
( this->GetSafeHwnd(), _T( "open" ), l_URL, NULL, NULL, SW_SHOWNORMAL ) ; 22 *out_pResult = 1 ; 23 } 24 break ; 25 26 case WM_LBUTTONUP: 27 { 28 *out_pResult = 1 ; 29 } 30 break ; 31 } 32}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值