在 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 的方法解决了这个问题,后果就是这部分代码不再具有跨平台的能力了:-(
最后的代码如下:
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 }
相关文章推荐
- 在 wxWidgets 中使用 RichEdit 及超链接自动识别
- 在RichEdit中使用超链接
- Richedit使用大全
- MFC RichEdit使用
- RichEdit中插入GIF动画(使用QQ的ImageOle.dll)
- 自动识别超链接
- Richedit使用技巧
- 对着电脑吼一声,自动打开谷歌网站或者自动打开命令行终端--使用google speech 语音识别程序操作电脑
- wpf,能够复制文字 及自动识别URL超链接的TextBlock
- thinkphp 使用U方法自动生成URL超链接
- C++ budilder 使用ImageOle.dll 实现richedit显示任意格式图片和连接 gif
- Richedit实现超链接
- 使用自动手势识别
- RichEdit 的ScrollBar自动向下滚动
- 图片验证码自动识别,使用tess4j进行验证码自动识别(java实现)
- Crichedit超链接(只能自动检测超链接)
- IT 接口后端:足迹第十七步Restful请求格式(如何使用Swagger自动生成接口的说明文档)
- 用于验证码图片识别的类(C#源码) 使用进程投票,可自动清除Alert弹出窗口,可自动换IP,ADSL用户自行修改Restart.bat中第三行内容
- VC中RichEdit 控件的使用
- 给激活了WS_HSCROLL,WS_VSCROLL的RichEdit增加自动换行的控制(转)