我有一个从CMyRichEditCtrl派生的CRichEditCtrl。当我调用SetSel时,它会自动滚动CRichEditCtrl的内容,以便插入符号是可见的。我想避免这种行为。
困扰我的是,这种行为似乎在6.0和其他版本之间发生了变化。
Visual 2010:http://msdn.microsoft.com/en-us/library/4zek9k1f(v=vs.100).aspx
插入符号放置在由开始(cpMin或nStartChar)和结束(cpMax或nEndChar)索引的较大值所指示的选择的末尾。此函数滚动 CRichEditCtrl的内容,以便插入符号是可见的。
VisualStudio6.0:http://msdn.microsoft.com/en-us/library/aa313352(v=vs.60).aspx
插入符号放置在由开始(cpMin或nStartChar)和结束(cpMax或nEndChar)索引的较大值所指示的选择的末尾。此函数不滚动 CRichEditCtrl的内容,因此插入符号是可见的.。
是否有一种方法可以防止调用SetSel时控件的自动滚动?
发布于 2013-11-20 18:15:43
这不是一件容易的事,但我终于找到了解决办法。
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();
}发布于 2021-09-23 15:26:37
使用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);发布于 2013-12-06 08:03:30
变到
RedrawWindow(0,0,RDW_NOERASE);
这样好多了。
https://stackoverflow.com/questions/20097810
复制相似问题