2013-11-20 92 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