CRichEditCtrl предотвращает автоматическую прокрутку на SetSel

У меня есть 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?

2

Решение

Это было нелегко, но я наконец нашел обходной путь.

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();
}
2

Другие решения

Изменить на

RedrawWindow (0,0, RDW_NOERASE);

Лучше.

-2

По вопросам рекламы [email protected]