Re[7]: GDI+ быстрый вывод
От: samius Япония http://sams-tricks.blogspot.com
Дата: 14.12.10 07:49
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

S>>Меня — нет. Если я заказал рисовать красную линию, то она должна быть красная, а не контекстно серо-буро-малиновая в крапинку. Такое поведение сегодня — норма. MS Офис так рисует, OpenOffice так рисует, и даже Paint так рисует. Я последний раз видел R2_NOT в действии больше чем 10 лет назад.


PD>Paint.net так не рисует.

А попробуй нарисовать в нем линию, или прямоугольник

PD>Да и нельзя так. Что за выделение у тебя получится, если красным по красному ?

Да, тут соглашусь. Выделять лучше через R2. Но сомневаюсь, что это делается в мышинном событии, когда двойной буфер все-равно используется.

PD>Ну а если тебе уж именно так хочется, могу предложить следующее решение. Снимаем с картинки 4 битмэпа толщиной в одну линию , то есть прямоугольник в виде битмэпов. Рисуем тут же линию твоего цвета. После передвижения мышки рисуем эти битмэпы обратно, снимаем новые. Можно даже и без битмэпов — просто снять значения с помощью GetPixel, сойдет

PD>Главное — никакой перерисовки, никаких WM_PAINT.

Чем так страшен WM_PAINT, если есть двойной буфер? Более того, при интенсивной прорисовке содержимого без двойного буфера сложно обходиться. Я раньше занимался ГИС-ами, потому очень четко себе представляю ситуацию, когда сидишь минуту-другую ждешь окончания прорисовки, потом всплывает аська и все заново (без буфера-то).

PD>Хотя... Еще одна идея.


PD>Пусть Invalidate, пусть WM_PAINT, но только чтобы областей не было, только чтобы линии рисовались. Но если WM_PAINT дать 4 линии , то она объединит их в суммарный прямоугольник и ничего не получится. А вот если скармливать линии одна за одной и делать UpdateWindow каждый раз ?


PD>InvalidateRect(верхняя линия прямоугольника);

PD>UpdateWindow();
PD>InvalidateRect(левая линия прямоугольника);
PD>UpdateWindow();
PD>и т.д.

PD>По идее UpdateWindow заставит немедленно перерисовать именно эту линию и снять флаг инвалидности.


А ради чего собственно выжимать такты на ровном месте? Тебя не устраивает скорость BitBlt?
Более того, я даже не уверен, что посылка нескольких InvalidateRect-ов и UpdateWindow будет быстрее BitBlt.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.