您的位置:首页 > 其它

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

2012-12-26 15:36 363 查看
/article/1981242.html

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
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: