为什么CString的长度为134,并没有设置格式,先CRichEditCtrl::SetWindowText()写入,再CRichEditCtrl::GetWindowText()获取到的字符串长度编程了140?可能的原因是什么?如何避免呢?
时间: 2024-02-21 14:56:49 浏览: 19
可能的原因是,当你使用CRichEditCtrl::SetWindowText()方法写入文本时,RichEdit控件会自动添加一些未显示的字符,例如行结束符等。当你使用CRichEditCtrl::GetWindowText()方法获取文本时,这些未显示的字符可能会被包含在内,从而导致字符串长度不一致。
为了避免这种情况,你可以在使用CRichEditCtrl::GetWindowText()方法获取文本之前,先使用CRichEditCtrl::SetSel()方法设置选择范围,然后使用CRichEditCtrl::ReplaceSel()方法将选中文本替换为空字符串。这样可以去掉文本中的未显示字符,从而避免字符串长度不一致。
以下是一个示例代码:
```
// 获取文本
CString text;
richEditCtrl.GetWindowText(text);
// 去掉未显示字符
int start, end;
richEditCtrl.GetSel(start, end);
richEditCtrl.SetSel(start, end);
richEditCtrl.ReplaceSel(_T(""));
// 获取纯文本
CString plainText;
richEditCtrl.GetWindowText(plainText);
```
这样,获取的plainText字符串的长度应该与原始字符串的长度一致。
相关问题
请介绍下CRichEditCtrl::GetPlainText()的用法,我在MFC中没找到这个函数
非常抱歉,我之前的回答有误。CRichEditCtrl类中确实没有名为GetPlainText()的方法。
如果你想获取纯文本,可以使用CRichEditCtrl类的GetWindowText()方法,然后去掉其中的格式化信息。你可以使用CRichEditCtrl类的GetSel()方法获取当前选择文本的位置,然后使用EM_GETCHARFORMAT消息获取该文本的格式,再根据格式去掉相应的格式化信息。
另外,你也可以使用CTextDocument类来处理文本,它提供了一些方便的方法来获取和处理文本。你可以使用CTextDocument类的GetText()方法获取纯文本,该方法将自动去掉格式化信息。例如:
```
CRichEditCtrl richEditCtrl;
CTextDocument textDoc = richEditCtrl.GetTextDocument();
CString text = textDoc.GetText();
```
需要注意的是,CTextDocument类需要将RichEdit控件设置为纯文本格式才能使用。可以通过CRichEditCtrl类的SetOptions()方法来设置。例如:
```
richEditCtrl.SetOptions(ECOOP_OR, ECO_NOHIDESEL | ECO_READONLY | ECOOP_OR, ECOPlainText);
```
CString 怎么转换为 std::string
CString 可以通过调用其GetString()函数获取其对应的 C 风格字符串,然后将其转换为 std::string 类型,示例如下:
CString cstr = "Hello World";
std::string str = CT2A(cstr.GetString());
其中,CT2A 是 CString 提供的一个函数,用于将宽字符转换为多字符。如果 CString 是窄字符类型,也可以使用 CString 本身提供的转换函数 CStringA,示例如下:
CStringA cstr = "Hello World";
std::string str = cstr.GetString();