Скролл и OnPaint - ну просто ЖУТКИЙ тормоз.
От: avanti  
Дата: 12.09.02 20:36
Оценка:
Уважаемые корифеи!!!
Может кто снисходительно просветит несведущего?
Есть окно со скроллерами( при создании, указаны в стиле окна).
Я делаю следующее: создаю контекст памяти, привязываю к нему битмап, по размеру больший,
чем окно. На него отрисовываю что-нить. На события ON_WM_VSCROLL(),ON_WM_HSCROLL() я выставляю позицию скроллера и делаю InvalidateRect(&aWndClientRect). На OnPaint() я выполняю
this->GetDC()->BitBlt(0,0,aWndClientRect.right,aWndClientRect.bottom, &memDC,GetScrollPos(SB_HORZ),
GetScrollPos(SB_VERT),SRCCOPY ); Все это работает, но только ЖУТКО ТОРМОЗНО!!! И глядя на иные приклады,
я подобного тормоза не вижу. Еще я заметил, что у меня просто не переставая засылается PAINT. Ради теста
я вписал в OnPaint простейщую строку типа TextOut(x,y, число репейнтов), открыл окно и замер. Выводимый в
окне счетчик тут же устремился к пределам LongInt, хотя я окно не трогаю. Но репейнт прет не переставая.
Подскажите плиз, как все сделать грамотно??? Я пока также по букам полезу.
Заранее спасибо!
Re: Скролл и OnPaint - ну просто ЖУТКИЙ тормоз.
От: bnk СССР http://unmanagedvisio.com/
Дата: 13.09.02 05:27
Оценка:
Здравствуйте avanti, Вы писали:

this->GetDC()->BitBlt(0,0,aWndClientRect.right,aWndClientRect.bottom, &memDC,GetScrollPos(SB_HORZ), [skip]


Почему GetDC() ?
Скорее всего, ты не чистишь Invalidate Region в OnPaint() , т.е. не вызывашь BeginPain()/EndPaint(). Чтобы заработало, надо скорее всего заменить GetDC() в OnPaint() на CPaintDC, т.е. вот так:
CPaintDC dc(this);
dc.BitBlt(0,0,aWndClientRect.right, ....
Re: Скролл и OnPaint - ну просто ЖУТКИЙ тормоз.
От: Аноним  
Дата: 13.09.02 05:34
Оценка:
Здравствуйте avanti, Вы писали:

Хотелось бы полностью посмотреть на тела обработчиков скрола и
WM_PAINT.
Возможно, ты делаешь в функции OnPaint,что-то, что приводит
к посылке сообщения WM_PAINT. Т.е. функция OnPaint шлет сообщение
сама себе, и таким образом у тебя происходит зацикливание.
Re: Скролл и OnPaint - ну просто ЖУТКИЙ тормоз.
От: Patalog Россия  
Дата: 13.09.02 06:00
Оценка:
Здравствуйте avanti, Вы писали:

[skip]

this->>GetDC()->BitBlt(0,0,aWndClientRect.right,aWndClientRect.bottom, &memDC,GetScrollPos(SB_HORZ),


А опосля такой конструкции ReleaseDC хто делать будет?
Юзай лучше CPaintDC
Почетный кавалер ордена Совка.
Re: Скролл и OnPaint - ну просто ЖУТКИЙ тормоз.
От: Михаил  
Дата: 17.09.02 06:30
Оценка:
Здравствуйте avanti, Вы писали:

И глядя на иные приклады,
A>я подобного тормоза не вижу.

Другие в такой ситуации пользуются ScrollDC() + InvalidateRect().
И UpdateWindow(), хотя можно и без него.
...А отсюда наливаем, когда рецепт написан совсем неразборчиво...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.