CRichEdit GetSel引起的问题

The fool 2012-02-03 05:07:37
程序需要搜索指定字符串并调整到该位置,在试验中出现一个问题,如下:
执行代码为:
void CNovelReaderView::OnTextpos()
{
// TODO: 在此添加命令处理程序代码
long nStartChar, nEndChar;
GetRichEditCtrl().GetSel(nStartChar, nEndChar);
CString msg;
msg.Format("选中位置起始%d字节,结束%d字节",nStartChar,nEndChar);
AfxMessageBox(msg);
}
测试字符串为:"abc你好吗?"
选中后为"abc你好吗?"
在VS2010中执行结果为:起始3字节,结束5字节;(使用UNICODE编码)
在VC6.0中执行结果为: 起始3字节,结束7字节

疑问:(1)GetSel返回值是基于0的字符个数还是字节个数?
(2)为什么文字理论上的字节数通过GetSel获取的值不同? 函数功能怎么实现?
...全文
327 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
The fool 2012-02-11
  • 打赏
  • 举报
回复
最终解决:
(1)GetSel返回的应该是字符位置 而不是字节位置 至于vc6.0 中的返回位置 这只能说是个低版本的richedit的特点
(2)实验最终采用UNICODE编码解决,注意不管是什么编码GetSel返回的应该是字符位置 而不是字节位置
但是UNICODE编码中 不管中英文都占2字节(16 Bit),因此可以较准确的通过GetSel判断出
字节位置
(3) 当txt文件10M以上时,计算还是会存在偏差 这可能是内存分配连续与不连续方面的问题 一时无法解决

谢谢各位!
SKy_kid 2012-02-03
  • 打赏
  • 举报
回复
直接改工程属性改成多字节就是了。
The fool 2012-02-03
  • 打赏
  • 举报
回复

谢谢
所谓计算就是这样:就是把这个文件快速映射到某个内存块,然后再操作。这个方法在这里不重要。现在是用记事本时,通过粘贴,恰好到"第十三章"时,文件大小显示接近72270字节大小,那么我就是想使用SetSel将改文字选中,传递参数72270是不行的。

你说的如果要转换字符的编码,那么对于一个10M的txt文件来说太大了,也不好处理(这正是我使用内存文件的原因).
为什么在VC6.0下那么方便在VS下那么复杂.
SKy_kid 2012-02-03
  • 打赏
  • 举报
回复
和GetSel没关系,你所谓的内存映射文件计算不知道是什么,是不是从文件中取得string再find目标串?。看情形应该是你取的string没转换成unicode.用A2T转成unicode字符再find位置就应该和getsel位置相同了。
The fool 2012-02-03
  • 打赏
  • 举报
回复
谢谢你们的帮助
现在得问题时:
比如我现在在内存中计算了一个字符串如 "第十三章" 理论值为72270字节的位置(通过内存映射文件后计算),要将文档视类转到"第十三章",我是通过发送EM_FINDTEXT消息的方法来实现文本查找并使用GetSel来做到的:
这个 "第十三章" 理论值是72270字节,通过GetSel获取(选中文本中的"第十三章"时获取的)的却是近37464左右,那么使用SetSel时必须也是使用37464这个值 因此使用搜索时无法精确定位,不能有效的减少搜索时间.

疑问:
(1)将理论位置除2或者某种计算,但是好像这种倍数关系不明显,计算效果并不佳
(2)使用全文搜索这样会造成搜索时延较大,不可行

请教这怎么解决理论值和GetSel获取的实际值问题?
Eleven 2012-02-03
  • 打赏
  • 举报
回复
VC6默认是使用多字节编码,VS2010默认是使用Unicode编码。
一个中文汉字占2个字节
SKy_kid 2012-02-03
  • 打赏
  • 举报
回复
vc6.0的工程使用的是宽字节吧。前面三个英文的len为3,每个汉字算两个字节所以"你好"的len为4,一起是7;2010里你的工程使用的是unicode,前面三个英文len为3,"你好"的len为2 加起来为5

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧