CRichEditCtrl 中意外的双行间距
Unintended double line spacing in CRichEditCtrl
我正在将串行端口输入回显到 CRichEditCtrl,每次一个字符到达。我遇到的问题是,当我收到 '\r' 后跟 '\n' 时,我在页面下方有两行,而不是一行。稍微调试一下,我意识到发送“\r\n”会导致(我认为是)正确的单个新行插入,但分别发送“\r”和“\n”会产生两个新行.
简单的例子,其中m_Output显然是一个rich edit控制变量:
m_Output.SetSel(-1, -1);
m_Output.ReplaceSel(_T("X\r\n"));
m_Output.SetSel(-1, -1);
m_Output.ReplaceSel(_T("Y"));
m_Output.SetSel(-1, -1);
m_Output.ReplaceSel(_T("\r"));
m_Output.SetSel(-1, -1);
m_Output.ReplaceSel(_T("\n"));
m_Output.SetSel(-1, -1);
m_Output.ReplaceSel(_T("Z"));
上面的输出是:
X
Y
Z
为什么要加一行?!?!
我认为 Set/ReplaceSel() 的行为可能有些问题,但它不会以这种方式在常规字符之间插入行,例如如果我发送 'a' 后跟 'b' 输出只是 "ab" ...
不同版本的 RichEdit 控件 documented 段落分隔符使用不同的字符; RichEdit 1.0 使用 \r\n
,RichEdit 2.0 被记录为使用 \r
,而 RichEdit 3.0(可能更高)可以同时使用两者。
虽然这看起来像控件实际上也将单独的 \n
视为中断(即听起来它接受 \r
、\n
和 \r\n
因为都代表一次休息)。这与文档不符,但这也不是 Microsoft 文档第一次出现不准确的情况。
控件内部可能不会逐字存储实际的分隔字符,因此当您向它输入 \r
然后单独输入 \n
时,它无法将它们连接成一个单次休息。
听起来最简单的解决方案是过滤掉 \n
个字符,而不是将它们发送到控件。这样所有控件将看到的都是 \r
个字符,您最终只会在文本中看到一个中断。
我正在将串行端口输入回显到 CRichEditCtrl,每次一个字符到达。我遇到的问题是,当我收到 '\r' 后跟 '\n' 时,我在页面下方有两行,而不是一行。稍微调试一下,我意识到发送“\r\n”会导致(我认为是)正确的单个新行插入,但分别发送“\r”和“\n”会产生两个新行.
简单的例子,其中m_Output显然是一个rich edit控制变量:
m_Output.SetSel(-1, -1);
m_Output.ReplaceSel(_T("X\r\n"));
m_Output.SetSel(-1, -1);
m_Output.ReplaceSel(_T("Y"));
m_Output.SetSel(-1, -1);
m_Output.ReplaceSel(_T("\r"));
m_Output.SetSel(-1, -1);
m_Output.ReplaceSel(_T("\n"));
m_Output.SetSel(-1, -1);
m_Output.ReplaceSel(_T("Z"));
上面的输出是:
X
Y
Z
为什么要加一行?!?!
我认为 Set/ReplaceSel() 的行为可能有些问题,但它不会以这种方式在常规字符之间插入行,例如如果我发送 'a' 后跟 'b' 输出只是 "ab" ...
不同版本的 RichEdit 控件 documented 段落分隔符使用不同的字符; RichEdit 1.0 使用 \r\n
,RichEdit 2.0 被记录为使用 \r
,而 RichEdit 3.0(可能更高)可以同时使用两者。
虽然这看起来像控件实际上也将单独的 \n
视为中断(即听起来它接受 \r
、\n
和 \r\n
因为都代表一次休息)。这与文档不符,但这也不是 Microsoft 文档第一次出现不准确的情况。
控件内部可能不会逐字存储实际的分隔字符,因此当您向它输入 \r
然后单独输入 \n
时,它无法将它们连接成一个单次休息。
听起来最简单的解决方案是过滤掉 \n
个字符,而不是将它们发送到控件。这样所有控件将看到的都是 \r
个字符,您最终只会在文本中看到一个中断。