在 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 的方法解决了这个问题,后果就是这部分代码不再具有跨平台的能力了:-(
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,如果我能搞定的话:-)
- 在 wxWidgets 中使用 RichEdit 及超链接自动识别
- 在 wxWidgets 中使用 RichEdit 及超链接自动识别
- 在RichEdit中使用超链接
- 在RichEdit中实现超链接
- RichEdit中加超链接
- 在wxWidgets中使用ActiveX
- RichEdit超链接
- 自动识别超链接
- RichEdit中支持超链接的实现
- 在VS2010中使用wxWidgets 2.9.3
- 在VS2010中使用wxWidgets 2.9.3
- 在VS2010中使用wxWidgets 2.9.3
- 在VS2010中使用wxWidgets 2.9.3
- 在VS2012中使用wxWidgets 2.9.5
- Duilib中Richedit使用
- 关于在使用codeblocks+wxWidgets的过程中遇到的问题及解决
- 在RichEdit中插入Bitmap
- MFC应用---超链接RichEdit
- wxWidgets不完全系列之--wxDC
- Wxwidgets和C#的感悟
- C# 模仿QQ、MSN消息提示系列 一、基本原理
- C# 模仿QQ、MSN消息提示系列 二、基本效果模仿包含代码
- wxWidgets经典问题——主窗体收不到按键事件的最终解决
- 在 wxWidgets 中使用 RichEdit 及超链接自动识别
- C# 模仿QQ、MSN消息提示系列 三、实现多个提示效果
- wxWidgets中线程里使用wxSOCKET
- C# 模仿QQ、MSN消息提示系列 四、bug修改 效果优化
- 请问emesene怎么保存聊天记录?
- C# 模仿QQ、MSN消息提示系列 五、改进 只使用两个时间控件
- 一段大家熟悉的汇编代码分析
- 用Visual C#编写仿MSN Messager的滚动提示窗口
- 利用C#实现标注式消息提示窗口