Как заставить CEdit правильно прокрутить? - PullRequest
0 голосов
/ 06 октября 2009

У меня есть элемент управления CEdit, который используется для отображения результатов диагностики.
Иногда данные переполняют размер экрана, поэтому, естественно, я установил для свойства Vertical Scroll значение true (редактор диалогов MFC).

Но тогда, когда я попытался прокрутить текст, который был в окне раньше, не очищается, и новый текст пишется поверх него.

В результате получается большой беспорядок всего, что я пролистал.

Я искал свойство фона для рисования или что-то подобное, что будет стирать все в окне при прокрутке (перед перерисовкой новых данных).

Есть предложения?

Ответы [ 3 ]

2 голосов
/ 06 октября 2009

Я думаю, что вы, возможно, захотите установить Авто VScroll и Многострочный на true, а Авто HScroll на false.

1 голос
/ 04 апреля 2015

У нас была похожая проблема.В итоге нам пришлось сделать недействительной область родительского окна, чтобы оно обновлялось при получении 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;
...
}

Конечно, мне пришлось его немного обобщить.Я просто хотел, чтобы вы знали, что да, есть другие люди, которые видят вашу проблему, и мы нашли, как ее исправить.

0 голосов
/ 09 октября 2009

Я проверил это с VS2005, который поставляется с MFC 8.0. Я не мог воспроизвести вашу проблему.

Я добавил один CEdit и один CRichEditCtrl в диалоговое приложение. Изменены свойства Multiline, Auto VSCroll и Vertical Scroll на true. Использовал SetWindowText-метод, чтобы поместить одинаково длинную строку текста в них обоих. Я запустил приложение и текст прокручивался очень хорошо.

Что ты сделал по-другому?

Просто чтобы быть уверенным. Вы не использовали SetCaretPos-метод? Об этом было написано на странице MSDN. Вот статья в базе знаний .

...