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

来源:互联网 发布:宝宝创意照片软件 编辑:程序博客网 时间:2024/05/29 09:56
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 的方法解决了这个问题,后果就是这部分代码不再具有跨平台的能力了:-(
 
最后的代码如下:
voidFooWnd::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}
 
  这肯定是 wxWidgets 的一个 Bug,有时间可以试着给他们写个 patch,如果我能搞定的话:-)
原创粉丝点击