CRichEditCtrl无法用Unicode字符串替换选中内容的技术求助
MFC中CRichEditCtrl使用Unicode字符串调用ReplaceSel的解决方法
问题背景
在Windows 11 Pro + Visual Studio 2022环境下,使用RichEdit20W类型的CRichEditCtrl(富编辑2.0控件),控件本身支持Unicode,但调用ReplaceSel时传入wstring的c_str()(const wchar_t*)会编译报错。原因是当前项目字符集为多字节,LPCTSTR被定义为const char*,和const wchar_t*类型不匹配。
示例报错代码:
CRichEditCtrl re; wstring line; auto x = line.c_str(); // const wchar_t* re.ReplaceSel(x); // 编译错误:类型不匹配
CRichEditCtrl::ReplaceSel原型:
void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE);
解决方法
方法1:修改项目为Unicode字符集(推荐)
这是最简便的方案,直接让LPCTSTR映射为const wchar_t*:
- 打开项目属性
- 进入「配置属性」→「常规」→「字符集」
- 选择「使用Unicode字符集」
- 重新编译项目
修改后原代码无需改动,re.ReplaceSel(x)可以直接正常调用。
方法2:直接发送Unicode版本的消息(不修改字符集)
如果不想改动项目字符集,直接调用控件的Unicode原生API:
CRichEditCtrl re; wstring line; auto x = line.c_str(); // 发送EM_REPLACESELW消息,传入Unicode文本和撤销标记 re.SendMessage(EM_REPLACESELW, FALSE, (LPARAM)x); // 若需要支持撤销,把FALSE改成TRUE // re.SendMessage(EM_REPLACESELW, TRUE, (LPARAM)x);
因为控件是RichEdit20W(Unicode版本),直接使用EM_REPLACESELW消息即可,无需类型转换。
方法3:字符串转换(不推荐)
如果必须保留多字节字符集,可将Unicode字符串转成多字节,但会丢失部分Unicode字符(比如生僻字、emoji),仅适合兼容老代码场景:
CRichEditCtrl re; wstring line; auto x = line.c_str(); // 转换为UTF-8多字节字符串 int bufSize = WideCharToMultiByte(CP_UTF8, 0, x, -1, nullptr, 0, nullptr, nullptr); vector<char> multiByteBuf(bufSize); WideCharToMultiByte(CP_UTF8, 0, x, -1, multiByteBuf.data(), bufSize, nullptr, nullptr); re.ReplaceSel(multiByteBuf.data());
内容的提问来源于stack exchange,提问作者Woody20
相关产品推荐
相关产品推荐

