Как заставить 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. Вот статья базы знаний.

Другие вопросы по тегам