3

CRichEditCtrl から派生した CMyRichEditCtrl があります。SetSel を呼び出すと、キャレットが表示されるように CRichEditCtrl の内容が自動的にスクロールされます。この動作は避けたいと思います。

この動作が 6.0 と他のバージョンの間で変更されたように見えるのは、私を悩ませていることです。

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

キャレットは、開始 (cpMin または nStartChar) インデックスと終了 (cpMax または nEndChar) インデックスの大きい方によって示される選択範囲の最後に配置されます。この関数は、CRichEditCtrl の内容をスクロールして、キャレットが表示されるようにします。

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

キャレットは、開始 (cpMin または nStartChar) インデックスと終了 (cpMax または nEndChar) インデックスの大きい方によって示される選択範囲の最後に配置されます。この関数は、キャレットが表示されるように CRichEditCtrl の内容をスクロールしません。

SetSel を呼び出すときにコントロールの自動スクロールを防ぐ方法はありますか?

4

3 に答える 3

3

これは簡単なことではありませんでしたが、最終的に回避策を見つけました。

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();
 }
于 2013-11-20T18:15:43.083 に答える
-2

への変更

RedrawWindow(0,0,RDW_NOERASE);

それは良いです。

于 2013-12-06T08:03:30.460 に答える