【问题标题】:CRichEditCtrl prevent auto scroll on SetSelCRichEditCtrl 防止在 SetSel 上自动滚动
【发布时间】:2013-11-20 13:53:13
【问题描述】:

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

让我感到困扰的是,这种行为似乎在 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 时防止控件自动滚动?

【问题讨论】:

    标签: c++ mfc cricheditctrl


    【解决方案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();
     }
    

    【讨论】:

    • 我想在这里补充一点,在上面的块中使用 HideSelection() 隐藏和显示选择将大大提高性能。我刚刚发现它。
    【解决方案2】:

    使用 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);
    

    【讨论】:

      【解决方案3】:

      改成

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

      这样更好。

      【讨论】:

      • 您应该将此作为评论添加到@MasterMind 的先前答案中,而不是作为新答案,因为这不能回答 OP 的问题。
      • @user3073563:当我将 RedrawWindow() 替换为 RedrawWindow(0,0,RDW_NOERASE) 时,RichEditCtrl 不再显示字符并且行为不规律......你在说它更好之前是否尝试过这个?
      猜你喜欢
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      相关资源
      最近更新 更多