//下面的代碼就是在一個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);
}
uj5u.com熱心網友回復:
單看代碼,感覺沒問題。也沒發現回圈啊。
控制元件操作如果有回圈,最好使用執行緒來處理,否則極容易卡死。
uj5u.com熱心網友回復:
謝回復。可能我描述的不是很清楚。重新描述一下:
代碼一切正常,沒有卡死,執行也沒有問題。我是在外面有一個執行緒,頻繁呼叫這段代碼,然后寫CRichEdit控制元件大資料。在這種情況下,windows就是將滑鼠指標設定為忙狀態,這段代碼也是這個效果。但我的要求是,不想讓滑鼠指標顯示忙狀態,我想讓他一直顯示Arrow狀態即可,這樣顯得資料處理比較平滑一下,如何處理?
uj5u.com熱心網友回復:
不要一直寫,可以執行緒中處理資料,然后PostMessage異步的方式給主界面UI來更新資料uj5u.com熱心網友回復:
版主好!
執行緒里面很簡單,首先發送資料,然后接收資料,接收完畢,處理資料,呼叫上面的一段代碼,在CRichEdit控制元件里顯示。顯示完畢,然后再開始發送下一幀資料。邏輯關系沒有問題。
現在的問題是,忙不是由于邏輯原因什么的造成的。由于每次要顯示的數量比較大,1024*16個字符,無論是使用我的方式直接呼叫UI函式,還是使用你建議的訊息通知來寫入CRichEdit控制元件,我覺得只要使用上面的那段代碼,都會導致滑鼠指標處于忙狀態。寫入資料完成,滑鼠指標又恢復Arrow,我想讓滑鼠指標不要變成忙狀態,一直保持Arrow狀態就行。跟了一下,下面這個函式占用時間比較長,
pedCtrl->ReplaceSel(strMyString + (strMyString.GetLength() < 1 ? _T("") : _T("\n")))。
跟到里面,Send一個EM_REPLACESEL訊息,就沒招了。
uj5u.com熱心網友回復:
LockWindowUpdate()uj5u.com熱心網友回復:
在必要的地方插入一個訊息回圈?轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/115480.html
標籤:界面
上一篇:控制元件copy不了文本
下一篇:求各路大神指導,有點急!
