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 回答
0

使用 CRichEditCtrl::SetOptions 方法或下面的代码来禁用和启用自动滚动。hwnd 是富编辑控件的处理对象。

您可以使用以下代码禁用自动滚动:

LRESULT prevOptions = SendMessage(hwnd, EM_GETOPTIONS, 0, 0);
SendMessage(hwnd, EM_SETOPTIONS, ECOOP_SET, prevOptions & ~ECO_AUTOVSCROLL);

并使用以下方式启用它:

SendMessage(hwnd, EM_SETOPTIONS, ECOOP_SET, prevOptions);
于 2021-09-23T15:26:37.910 回答
-2

改成

重绘窗口(0,0,RDW_NOERASE);

它更好。

于 2013-12-06T08:03:30.460 回答