本文参考了另一篇博客VC用CEDIT控件输出日志,可限定输出行数,清除超出限制历史行,并做了一些改进,解决了删除首行信息带来的界面闪烁问题。
首先,设置CEdit控件属性,Multiline属性为TRUE,Auto HScroll属性为False,Auto VScroll属性为TRUE。
然后增加CEdit控件能容纳的字符数量,经过测试,在Windows 10、VS2008 SP1、32位应用程序中执行以下代码,利用GetLimitText函数获得的最大字符数为30000,程序输出第5185个字符时停止。
UINT nLimit = m_wndEdit.GetLimitText();
for (int i = 1; i <= 10000; i++)
{
CString strText;
strText.Format(_T("%d\r\n"), i);
int iTextLen = m_wndEdit.GetWindowTextLength();
m_wndEdit.SetSel(iTextLen, iTextLen, FALSE);
m_wndEdit.SetFocus();
m_wndEdit.ReplaceSel(strText);
}
通过SetLimitText函数增大字符数量限制后,可以完整输出10000个数字了。
UINT nLimit = m_wndEdit.GetLimitText();
m_wndEdit.SetLimitText(1000000);
for (int i = 1; i <= 10000; i++)
{
CString strText;
strText.Format(_T("%d\r\n"), i);
int iTextLen = m_wndEdit.GetWindowTextLength();
m_wndEdit.SetSel(iTextLen, iTextLen, FALSE);
m_wndEdit.SetFocus();
m_wndEdit.ReplaceSel(strText);
}
最后附上完整源代码以及注释:
// 换行符
#define LINE_BREAK _T("\r\n")
void DisplayLog(CString m_strLog)
{
// 阻止CEdit控件重绘,防止界面闪烁
m_wndEditLog.SetRedraw(FALSE);
int nLineCount = m_wndEditLog.GetLineCount();
// 如果输出日志超过1000行,则删除第一行
if (nLineCount > 1000)
{
int nBegin = 0;
int nEnd = nBegin + m_wndEditLog.LineLength(nBegin) + _tcslen(LINE_BREAK);
m_wndEditLog.SetSel(nBegin, nEnd);
m_wndEditLog.Clear();
}
// 每行输出日志结尾加上换行符
m_strLog += LINE_BREAK;
int nTextLen = m_wndEditLog.GetWindowTextLength();
m_wndEditLog.SetSel(nTextLen, nTextLen, FALSE);
m_wndEditLog.ReplaceSel(m_strLog);
m_wndEditLog.LineScroll(m_wndEditLog.GetLineCount());
m_wndEditLog.SetRedraw(TRUE);
}