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;
}
测试字符串为:"abc你好吗?"
选中后为"abc你好吗?"
在VS2010中执行结果为:起始3字节,结束5字节;(使用UNICODE编码)
在VC6.0中执行结果为: 起始3字节,结束7字节
疑问:(1)GetSel返回值是基于0的字符个数还是字节个数?
最终解决:
(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