CRichEditCtrl系列讲堂3 关于版本和查找错位问题

1 如何使用richedit2.0 or richedit3.0

使用原因:由于RichEdit2.0A自动为宽字符(WideChar),所以它可以解决中文乱码以及一些汉字问题

方法一:(msdn上的做法,适用于用VC.NET及以后版本创建的工程)
To update rich edit controls in existing Visual C++ applications to version 2.0,
open the .RC file as text, change the class name of each rich edit control from "RICHEDIT" to "RichEdit20a".
Then replace the call to AfxInitRichEdit with AfxInitRichEdit2.
方法二:以对话框为例:
(1) 增加一全局变量 HMODULE hMod;
(2) 在CxxxApp::InitInstance()中添加一句hMod = LoadLibrary(_T("riched20.dll"));
在CxxxApp::ExitInstance()中添加一句FreeLibrary(hMod);
(3) 在对话框上放一个richedit,文本方式打开.rc文件修改该richedit控件的类名"RICHEDIT" to "RichEdit20a".
(4) 在对话框头文件添加 CRichEditCtrl m_richedit;
在OnInitDialog中添加 m_richedit.SubclassDlgItem(IDC_RICHEDIT1, this);

来源:百度文档

2 CRichEdit GetSel引起的问题

 程序需要搜索指定字符串并调整到该位置,在试验中出现一个问题,如下:
执行代码为:
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获取的值不同? 函数功能怎么实现?

最终解决:
(1)GetSel返回的应该是字符位置 而不是字节位置 至于vc6.0 中的返回位置 这只能说是个低版本的richedit的特点
(2)实验最终采用UNICODE编码解决,注意不管是什么编码GetSel返回的应该是字符位置 而不是字节位置
但是UNICODE编码中 不管中英文都占2字节(16 Bit),因此可以较准确的通过GetSel判断出
字节位置
(3) 当txt文件10M以上时,计算还是会存在偏差 这可能是内存分配连续与不连续方面的问题 一时无法解决

来源 http://topic.csdn.net/u/20120203/17/ae48c543-637f-470a-be99-97079e84e637.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值