CRichEditCtrl中意外的双行间距

时间:2015-01-08 09:17:06

标签: winapi mfc

我回复CRichEditCtrl的串口输入,一次到达一个char。我遇到的问题是,当我收到' \ r'其次是' \ n'我最后两页上下两行,而不是一行。调试一下我意识到发送" \ r \ n"导致(我认为是)正确的单个新行插入,但发送' \ r'和' \ n'分别产生两条新线。

简单示例,其中m_Output显然是一个丰富的编辑控件变量:

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" ...

1 个答案:

答案 0 :(得分:3)

RichEdit控件的各种版本为documented,因为段落符号使用不同的字符; RichEdit 1.0使用\r\n,RichEdit 2.0记录为使用\r而RichEdit 3.0(可能更高)可以使用它们。

这看起来虽然控件实际上也看到了一个单独的\n作为中断(即听起来它接受\r\n和{{1}所有代表单个休息时间)。这与文档不符,但话说再次,这不是Microsoft文档第一次有些不准确。

在内部,控件可能不会逐字存储实际的中断字符,因此当您将\r\n\r分别输入时,它无法将它们连接成一个单独的中断

听起来最简单的解决方案是过滤掉\n个字符,而不是将它们发送给控件。这样,所有控件都会看到\n个字符,并且您最终只会在文本中出现一个中断。