Re[6]: GDI+ быстрый вывод
От: Pavel Dvorkin Россия  
Дата: 14.12.10 07:13
Оценка:
Здравствуйте, samius, Вы писали:

PD>>Принять меры на случай WM_PAINT — перерисовать все

S>Без двойного буфера это будет заметно

Да, но только при уходе всплывающего окна. Не беда.

S>>>Инвертированные контуры — прошлый век. Навскидку не назову ни одну современную программу, что так делает. Ну и опять таки, что бы избежать грязи на рабочем столе, нужен double buffer. А раз он нужен, то нет смысла в инвертированных контурах, кроме как если они в ТЗ обозначены.


PD>>Что за инвертированный контур ? Тебя не устраивает вид линии, что ли, что она будет не одного цвета ?


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


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




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

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

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

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

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

По идее UpdateWindow заставит немедленно перерисовать именно эту линию и снять флаг инвалидности.
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.