2009-10-06 7 views
0

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

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

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

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

Любые предложения?

ответ

2

Я думаю, вы можете захотеть установить Auto VScroll и Multiline к истинным, и Auto HScroll к ложным.

+0

Все уже настроено, как вы предлагали, кроме автоматического HScroll, который не имел никакого эффекта. – CodeFusionMobile

0

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

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

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

Просто, чтобы быть уверенным. Вы не использовали метод SetCaretPos, не так ли? Об этом было сообщено на странице MSDN. Вот Knowledge Base article.

+0

Кажется, мне кажется, что когда-нибудь увижу метод SetCaretPos в коде, я проверю, когда вернусь к работе. Спасибо за совет. – CodeFusionMobile

+0

Кроме того, я работаю с 2003, потому что это старый код, так что это может повлиять и на него. – CodeFusionMobile

+0

Добавлена ​​прямая ссылка на статью базы знаний о SetCaretPos. К сожалению, он не описывает возможные симптомы использования SetCaretPos в CEdit. Статья была написана для MFC 4.2, которая была использована в Visual C++ 4.2, поэтому, возможно, она была исправлена ​​с тех пор. Попробуйте и дайте нам знать. – Rope

1

У нас была аналогичная проблема. В результате нам пришлось недействить регион родительского окна, чтобы он обновлялся, когда мы получили WM_VSCROLL. Я пытался сделать, как пользователь demorge говорит здесь:

SetBkMode(hdc, TRANSPARENT) doesn't work

Но наш код не использует ручки, мы на самом деле использовать класс 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; 
... 
} 

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