有三个问题不能解决,请教达人:1、日志信息是追加到底部的,用的是EM_SETSEL和EM_REPLACESEL,但这会改变光标位置,如果输出时正在前面看信息,不想自动滚到底部,有什么方法可以解决?
2、设为只读的话背景是灰的,怎么做到只读且保持白底?
3、日志太多的时候怎么自动清掉前面的一些行,和第一个问题一样,不能改变当前光标位置和视图内容(除非被删了)

解决方案 »

  1.   

    问题2,当把编辑框设为只读时,系统就把他当做一个STATIC来处理,你可以重载WM_CTLCOLOR消息 case WM_CTLCOLORSTATIC:
    {
    HBRUSH lhbrush = NULL;
    HBRUSH lhbrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
    return (LRESULT)lhbrush;
    }
      

  2.   

    为什么要用编辑框呢?list box 和 list view都比编辑框要好
      

  3.   

    如果你是MFC程序可以这样HBRUSH CRemoveToolsDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO:  Change any attributes of the DC here if (pWnd->GetDlgCtrlID() == IDC_EDIT1) //IDC_EDIT1是你的控件ID
    {
    pDC->SetBkMode(TRANSPARENT);
    HBRUSH lhbrush = (HBRUSH)GetStockObject(WHITE_BRUSH);
    return (HBRUSH)lhbrush;
    }
    return hbr;
    }
      

  4.   

    用CRichEditCtrl,这个比较合适用于打日志。
      

  5.   

    同意娄山观点CRichEditCtrl这个再好不过了
      

  6.   

    1,直接在编辑框原有文字后拼接你新增加的文字。
    2,派生一个CEdit,屏蔽键盘输入操作(有些消息保留)
    3,还是文字操作(字符串操作)。
      

  7.   

    CRichEditCtrl& edit = GetRichEditCtrl();
    int len = GetWindowTextLength();
    if(len > MAX_EVENT_LINE)
    {
    edit.SetSel(0, -1);
    edit.Clear();
    len = 0;
    edit.SetReadOnly();//设置只读,按你情况定
    }
    edit.SetSel(len, len);
    edit.ReplaceSel("日志内容");
      

  8.   

    感觉只解决了第二个问题
    控件内容更新不影响当前视图内容的话,就保持当前视图内容
    关键是SetSel会改变位置,,再SetSel回来的话又会闪
    求达人啊,分不够再加
      

  9.   

    不好意思,少写了一句。
    CRichEditCtrl& edit = GetRichEditCtrl();
    int len = GetWindowTextLength();
    if(len > MAX_EVENT_LINE)
    {
        edit.SetReadOnly(FALSE);//如果你初始化的时候设置为只读,那么这里先取消只读,才能输出。
        edit.SetSel(0, -1);
        edit.Clear();
        len = 0;
        edit.SetReadOnly();//再设置回只读。
    }
    edit.SetSel(len, len);
    edit.ReplaceSel("日志内容");