Как заставить CEdit правильно прокрутить?
У меня есть элемент управления CEdit, который используется для отображения результатов диагностики.
Иногда данные переполняют размер экрана, поэтому, естественно, я установил для свойства Vertical Scroll значение true (редактор диалогов MFC).
Но затем, когда я попытался прокрутить текст, который был в окне раньше, не очищается, и новый текст пишется поверх него.
Результатом является большой беспорядок всего, что я прокрутил мимо.
Я искал свойство фона рисования или что-то подобное, что будет стирать все в окне во время прокрутки (перед перерисовкой новых данных).
Какие-либо предложения?
3 ответа
Я думаю, что вы можете установить Auto VScroll и Multiline на true, а Auto HScroll на false.
У нас была похожая проблема. Мы закончили тем, что сделали недействительной область родительского окна, чтобы заставить его обновляться, когда мы получили WM_VSCROLL. Я попытался сделать так, как говорит пользователь demorge:
SetBkMode (hdc, TRANSPARENT) не работает
Но наш код не использует дескрипторы, мы фактически используем класс CWnd, поэтому мы в итоге сделали это в WindowProc:
switch(message)
{
...
case WM_VSCROLL:
case WM_HSCROLL:
LRESULT answer;
PAINTSTRUCT ps;
CDC* pdc;
CWnd* MyParentHWnd;
// We want the scroll to work the same way it has always worked for our
// ancestor class. Let them handle the scrolling and save off their
// return.
answer = AncestorClass::WindowProc(message, wParam, lParam);
pdc = BeginPaint(&ps);
// DO NOT change the assignement operator in the conditional below to an
// equality operator. We are actually trying to get the parent window and
// and storing locally, and then verifying that we didn't get back null.
// This is a purposeful design decision.
if (MyParentHWnd = GetParent()){
RECT MyRect;
GetClientRect(&MyRect);
ClientToScreen(&MyRect);
MyParentHWnd->ScreenToClient(&MyRect);
MyParentHWnd->InvalidateRect(&MyRect);
}
EndPaint(&ps);
return answer;
break;
...
}
Конечно, я должен был немного обобщить это. Я просто хотел, чтобы вы знали, что да, есть другие люди, которые видят вашу проблему, и мы нашли, как ее исправить.
Я проверил это с VS2005, который поставляется с MFC 8.0. Я не мог повторить твою проблему.
Я добавил один CEdit и один CRichEditCtrl в диалоговое приложение. Изменены свойства Multiline, Auto VSCroll и Vertical Scroll на true. Использовал SetWindowText-метод, чтобы поместить обоюдную строку текста. Я запустил приложение и текст прокручивался просто отлично.
Что ты сделал по-другому?
Просто чтобы убедиться. Вы не использовали SetCaretPos-метод? Об этом было написано на странице MSDN. Вот статья базы знаний.