CRichEditCtrl阻止SetSel上的自动滚动

时间:2013-11-20 13:53:14

标签: c++ mfc cricheditctrl

我有一个从CRichEditCtrl派生的CMyRichEditCtrl。当我调用SetSel时,它会自动滚动CRichEditCtrl的内容,以便可以看到插入符号。我想避免这种行为。

有什么问题,这种行为似乎在6.0和其他版本之间发生了变化。

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

  

插入符号位于选择的末尾,由start(cpMin或nStartChar)和end(cpMax或nEndChar)索引中的较大者指示。 此函数滚动 CRichEditCtrl的内容,以便插入符号可见。

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

  

插入符号位于选择的末尾,由start(cpMin或nStartChar)和end(cpMax或nEndChar)索引中的较大者指示。 此函数不会滚动 CRichEditCtrl的内容,以便可以看到插入符。

有没有办法在调用SetSel时阻止控件的自动滚动?

2 个答案:

答案 0 :(得分:2)

这不是一件容易的事,但我终于找到了解决方法。

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();
 }

答案 1 :(得分:-2)

更改为

RedrawWindow(0,0,RDW_NOERASE);

更好。