Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Награмождения при перерисовке


Автор: MadDog__ 7.9.2012, 21:47
При скролле или при попадании другого окна на окно программы остаеться след окна, а при сворачивании и обратном востановлении окна программы все отрисовываеться по новому по нормальному. предпологаю что надо вот тут обрабатвать?

зарание благодарен))

Код

BOOL CFootPView::OnEraseBkgnd(CDC* pDC)
{

    return TRUE;
}



вот скрин http://savepic.net/3403872.htm

Автор: Earnest 10.9.2012, 08:58
Так ты сам ответ привел - EraseBkgnd ничего не делает. Надо полагать, ты с двойной буферизацией упражнялся?

Автор: MadDog__ 11.9.2012, 13:12
Да использую двойную буфферизацию. Я так понимаю надо стереть весь фон и перерисовать все заново. только как стереть?
И еще вопрос? программа считывает данные из ODBC и выводит данные на экран, я захтел сделать что то типа замедленного проигрывателя просто начал делать Sleep(15); все хорошо идет как надо медленно рисуеться, но вэтот момент когда идет перерисовка меню оказываеться заблокированно т.к процесс и поток заняты рисованием и я не могу прервать этот процесс рисования! читал на форуме что рисовку нежелательно выносить в другой поток(( тогда как можно поступить в такой ситуации?

Автор: Earnest 12.9.2012, 07:06
Цитата(MadDog__ @  11.9.2012,  14:12 Найти цитируемый пост)
Я так понимаю надо стереть весь фон и перерисовать все заново. только как стереть?

Да, только не стереть-перерисовать, а скопировать кусок этого-самого буфера.
Т.е. рисовать в буфер надо не в момент OnPaint\OnErase, а только когда что-то меняется. Например, когда часть окна временно перекрыли, содержимое буфера ведь никак не меняется, так зачем его перерисовывать, когда достаточно скопировать. Но при этом буфер надо, естественно, постоянно хранить.

Насчет замедленной перерисовки, рисовать в другом потоке на экран - нельзя. Но в буфер можно, конечно. Это стоит делать, если перерисовка буфера занимает заметное время и подтормаживает. А для имитации замедленного вывода не стоит замедлять саму перерисовку, можно делать вывод по кускам на экран: первый раз 1 десятую высоты (например), второй - 2, и т.д. И не через Sleep, конечно, а по таймеру, например. Т.е. как только буфер перерисовывается, ставим таймер, выводим нужную часть буфера и запоминаем эту часть. На каждом таймере делаем себе Invalidate, пока все не выведется, а на каждом Paint копируем все большую и большую часть экрана. Как только выведем все, таймер отключаем. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)