//下面的代码就是在一个CRichEdit控件尾部,追加显示新数据(比如1024*16个字符),完成后,垂直滚动条自动滚动,把新加入的最后一行显示出来。// 这段代码会循环调用。// 现在的问题是,光标指针一直处于忙状态,其实是在Arrow 和Wait两个状态之间切换,不想显示Wait状态,就想一直显示Arrow即可,大神们,支支招!CRichEditCtrl* pedCtrl = (CRichEditCtrl*)GetDlgItem(IDC_RICHEDIT21);
CHARFORMAT cf = { 0 };
DWORD dwFlags = GTL_NUMCHARS;int txtLen = pedCtrl->GetTextLengthEx(dwFlags);nOldLines = pedCtrl->GetLineCount();cf.cbSize = sizeof(cf);
cf.dwMask = CFM_COLOR;
cf.dwEffects = ~CFE_AUTOCOLOR;cf.crTextColor = RGB(0, 0, 255);pedCtrl->SetSel(txtLen, -1); // Set the cursor to the end of the text area and deselect everything.
pedCtrl->ReplaceSel(strMyString + (strMyString.GetLength() < 1 ? _T("") : _T("\n"))); // Inserts when nothing is selected.int n1 = strMyString.GetLength();
int n2 = pedCtrl->GetTextLengthEx(dwFlags);
// Apply formating to the just inserted text.
pedCtrl->SetSel(txtLen, pedCtrl->GetTextLengthEx(dwFlags));
pedCtrl->SetSelectionCharFormat(cf);
long nVisible = GetNumVisibleLines(pedCtrl);
if (pedCtrl != pedCtrl->GetFocus())
{
pedCtrl->LineScroll(INT_MAX);
pedCtrl->LineScroll(1 - nVisible);
}

解决方案 »

  1.   

    谢回复。可能我描述的不是很清楚。重新描述一下:代码一切正常,没有卡死,执行也没有问题。我是在外面有一个线程,频繁调用这段代码,然后写CRichEdit控件大数据。在这种情况下,windows就是将鼠标指针设置为忙状态,这段代码也是这个效果。但我的要求是,不想让鼠标指针显示忙状态,我想让他一直显示Arrow状态即可,这样显得数据处理比较平滑一下,如何处理?
      

  2.   

    不要一直写,可以线程中处理数据,然后PostMessage异步的方式给主界面UI来更新数据
      

  3.   


    版主好!
    线程里面很简单,首先发送数据,然后接收数据,接收完毕,处理数据,调用上面的一段代码,在CRichEdit控件里显示。显示完毕,然后再开始发送下一帧数据。逻辑关系没有问题。现在的问题是,忙不是由于逻辑原因什么的造成的。由于每次要显示的数量比较大,1024*16个字符,无论是使用我的方式直接调用UI函数,还是使用你建议的消息通知来写入CRichEdit控件,我觉得只要使用上面的那段代码,都会导致鼠标指针处于忙状态。写入数据完成,鼠标指针又恢复Arrow,我想让鼠标指针不要变成忙状态,一直保持Arrow状态就行。跟了一下,下面这个函数占用时间比较长,
    pedCtrl->ReplaceSel(strMyString + (strMyString.GetLength() < 1 ? _T("") : _T("\n")))。跟到里面,Send一个EM_REPLACESEL消息,就没招了。
      

  4.   

    LockWindowUpdate()