首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CRichEditCtrl防止在SetSel上自动滚动

CRichEditCtrl防止在SetSel上自动滚动
EN

Stack Overflow用户
提问于 2013-11-20 13:53:13
回答 3查看 1.8K关注 0票数 3

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

困扰我的是,这种行为似乎在6.0和其他版本之间发生了变化。

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

插入符号放置在由开始(cpMin或nStartChar)和结束(cpMax或nEndChar)索引的较大值所指示的选择的末尾。此函数滚动 CRichEditCtrl的内容,以便插入符号是可见的。

VisualStudio6.0http://msdn.microsoft.com/en-us/library/aa313352(v=vs.60).aspx

插入符号放置在由开始(cpMin或nStartChar)和结束(cpMax或nEndChar)索引的较大值所指示的选择的末尾。此函数不滚动 CRichEditCtrl的内容,因此插入符号是可见的.

是否有一种方法可以防止调用SetSel时控件的自动滚动?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-20 18:15:43

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

代码语言:javascript
复制
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();
 }
票数 3
EN

Stack Overflow用户

发布于 2021-09-23 15:26:37

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

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

代码语言:javascript
复制
LRESULT prevOptions = SendMessage(hwnd, EM_GETOPTIONS, 0, 0);
SendMessage(hwnd, EM_SETOPTIONS, ECOOP_SET, prevOptions & ~ECO_AUTOVSCROLL);

并使用以下方法启用它:

代码语言:javascript
复制
SendMessage(hwnd, EM_SETOPTIONS, ECOOP_SET, prevOptions);
票数 0
EN

Stack Overflow用户

发布于 2013-12-06 08:03:30

变到

RedrawWindow(0,0,RDW_NOERASE);

这样好多了。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20097810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档