我在OnTimer里写的以下代码,每隔几十ms就在edit里添加一行数据. 但是只有前22行可以正常滚动到最下面,到了23行,edit开始闪,就不管用了,请大家帮我看看下面代码哪里有问题. 
m_strEditShow是编辑框的关联变量.
strTimer是每次要添加的数据.
……
m_strEditShow+=strTimer+"写入成功\r\n";
UpdateData(false);
CEdit* pEdit = (CEdit*)this->GetDlgItem(IDC_EDITShow);
if (pEdit != NULL) 
{
 pEdit->LineScroll(pEdit->GetLineCount());

……

解决方案 »

  1.   

    加个滚动条? 可是我在edit控件里把多行和水平垂直滚动条都选上了,前22行也可以正常滚动啊!
      

  2.   

    几十毫秒  太快了肯定闪 
    你应该定时更新CEdit 前面的代码只增加内容 你定100毫秒滚动一次 
      

  3.   

    设置垂直滚动条,Auto Vscroll设置为true,放入文本后把插入点设置到末尾。
      

  4.   

    Left ScrollBar.然后LineScroll就可以.
      

  5.   

    代码没有错,有无滚动条都可以,估计是要显示的内容过多,超出了控件允许的最大长度,或者是更新频率太高,而代码的运行效率较低,忙不过来。
    Edit控件不适合显示太多的内容,默认限制好象是64K,程序可以自己设置。
    CString也不宜过长,其追加内容的效率很低,可以改成用定长的字符数组,初始化时用new分配。
      

  6.   

    你可以试下追加而并非合并字符串
    参考http://topic.csdn.net/t/20041107/18/3529877.html
      

  7.   

    滚动到最底部:给编辑框发送一个滚动消息(具体名字忘记了,自己查一下),前一个参数是SB_BOTTOM,后一个是NULL
      

  8.   

    不了解LineScroll的实现方式,但从你说的开始闪的现象,估计是时间短、字符量大、EDIT多造成的处理显示效率过低,每个EDIT进行LineScroll后都要REDRAW,所以显示效率是很低的。
      

  9.   

    跟踪一下看看linecount,text什么的.
      

  10.   

    我发现了,代码前还有个调用WriteToPort的语句,把这条语句注释掉,就不闪了,那为什么呢?我该怎么改进一下WriteToPort的定义如下:void CSerialPort::WriteToPort(char* string,int n)
    {
    assert(m_hComm != 0);
    memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer));
    memcpy(m_szWriteBuffer, string, n);
    m_nWriteSize=n;
    SetEvent(m_hWriteEvent);
    }
      

  11.   

    但是把同样含有WriteToPort的语句写在一个按扭的onButton事件里,Edit就会正常滚动.到底怎么回事啊?
      

  12.   

    CString str;
    GetDlgItemText(IDC_EDIT1,str);
    long len=str.GetLength();
    ((CEdit*)GetDlgItem(IDC_EDIT1))->SetSel(len,len,true);
    ((CEdit*)GetDlgItem(IDC_EDIT1))->ReplaceSel("12121212");
      

  13.   

    SendMessage(WM_SCROLL, SB_Bottom);