在 wxWidgets 中使用 RichEdit 及超链接自动识别

http://blog.csdn.net/joliny/article/details/3507268

 

wxWidgets 中没有专门的 wxRichTextCtrl 类,只有 wxTextCtrl 类,要使用 RichEdit 的话只要在创建 wxTextCtrl 控件时指定 wxTE_RICH 或 wxTE_RICH2 属性即可,另外要让 RichEdit 对超链接自动识别还要加上 wxTE_AUTO_URL 属性。用上述步骤创建出来的文本控件已经可以自动识别超链接了,但是想要让它对鼠标点击动作作出反应还需要一些额外的手续。
  用 Win32 SDK、WTL 或 MFC 进行这项工作时需要响应 RichEdit 控件的 EN_LINK 通知消息,在传过来的参数中可以取得超链接的起始和终止位置,从而得到超链接文字。在 wxWidgets 中也基本是这个原理,我们需要做的消息映射是:EVT_TEXT_URL( IDC_RICHEDIT, OnTextUrl ),OnTextUrl() 的原型如下:
void OnTextUrl( wxTextUrlEvent &event );
然后用 event.GetURLEnd() 和 event.GetURLStart() 就可以取到超链接的位置了,但是我试了一下,我正在用的 2.6.0 版似乎对中文的支持有点问题,用 wxTextCtrl.GetRange() 取到的内容有点偏差。比如 RichEdit 中的内容是“测试 http://www.google.com”,用返回的超链接位置取到的内容却是“试 http://www.google.c”,看来 wxWidgets 传给我们的数据是按字符算的,但是我们调用的 GetRange() 却是用字节来计算的。想来想去又换了一种方法,就是先用得到的位置将超链接选中(这一步执行正确),再获取选中的内容,结果还是有点偏差。无奈,只好用 Win32 SDK 的方法解决了这个问题,后果就是这部分代码不再具有跨平台的能力了:-(
最后的代码如下:
void
FooWnd::OnTextUrl( wxTextUrlEvent &event )
{
  if( !event.GetMouseEvent().LeftIsDown() )
    return;
#ifdef WIN32
  char *pURL = new char[event.GetURLEnd() - event.GetURLStart() + 2];
  if( pURL )
  {
    memset( pURL, 0, event.GetURLEnd() - event.GetURLStart() + 2 );
    TEXTRANGE tr = { { event.GetURLStart(), event.GetURLEnd() }, pURL };
    SendMessage( (HWND)m_pRichEdit->GetHWND(), EM_GETTEXTRANGE, 0, (LPARAM)&tr );
    NavigateURL( pURL );
    delete[] pURL;
  }
#endif
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值