У меня есть CMyRichEditCtrl, полученный из CRichEditCtrl. Когда я вызываю 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?
Это было нелегко, но я наконец нашел обходной путь.
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();
}
Изменить на
RedrawWindow (0,0, RDW_NOERASE);
Лучше.