2013-11-20 89 views
1

我有一個派生自CRichEditCtrl的CMyRichEditCtrl。當我調用SetSel時,它會自動滾動CRichEditCtrl的內容,使插入符號可見。我想避免這種行爲。CRichEditCtrl防止SetSel上的自動滾動

什麼讓我覺得這個行爲似乎已經在6.0和其他版本之間改變了。

的Visual Studio 2010http://msdn.microsoft.com/en-us/library/4zek9k1f(v=vs.100).aspx

插入符號被放置在由開始(cpMin或nStartChar)和結束(cpMax則或nEndChar)指數的更大的指示的選擇結束。 此功能滾動 CRichEditCtrl的內容,使插入符號可見。

的Visual Studio 6.0http://msdn.microsoft.com/en-us/library/aa313352(v=vs.60).aspx

插入符號被放置在所述選擇的由更大的開始(cpMin或nStartChar)和結束(cpMax則或nEndChar)所示的端指數。 此功能不滾動 CRichEditCtrl的內容,以便插入符號可見。

有沒有辦法來防止在調用SetSel時控件的自動滾動?

回答

1

這並不容易,但我終於找到了解決方法。

void CMyRichEditCtrl::doStuff() 
{ 
    SetRedraw(FALSE); 

    int nOldFirstVisibleLine = GetFirstVisibleLine(); 

    // Save current selection 
    long lMinSel, lMaxSel; 
    GetSel(lMinSel, lMaxSel); 

    // Do something here 
    doSomething(); 

    // Restore selection 
    SetSel(lMinSel, lMaxSel); 

    // Prevent the auto-scroll of the control when calling SetSel() 
    int nNewFirstVisibleLine = GetFirstVisibleLine(); 

    if(nOldFirstVisibleLine != nNewFirstVisibleLine) 
     LineScroll(nOldFirstVisibleLine - nNewFirstVisibleLine); 

    SetRedraw(TRUE); 

    RedrawWindow(); 
} 
-2

更改爲

RedrawWindow(0,0,RDW_NOERASE);

更好。

+1

您應該將此添加爲來自@MasterMind的previos答案的評論,而不是作爲新答案,因爲這不會回答OP的問題。 –

+0

@ user3073563:當我用RedrawWindow(0,0,RDW_NOERASE)替換RedrawWindow()時,RichEditCtrl不再顯示字符,並且行爲不規律......你甚至在嘗試這樣做之前說過它更好嗎? – MasterMind