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 个字符,您最终只会在文本中看到一个中断。