MFC利用CEdit控件实现控制台效果的日志输出,可限制输出行数,并解决界面闪烁问题

本文参考了另一篇博客VC用CEDIT控件输出日志,可限定输出行数,清除超出限制历史行,并做了一些改进,解决了删除首行信息带来的界面闪烁问题。

首先,设置CEdit控件属性,Multiline属性为TRUE,Auto HScroll属性为False,Auto VScroll属性为TRUE。

更改CEdit属性

然后增加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);
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值