|
Вопрос # 2 888/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Пишу прогу вроде редактора блок схем
и возникли след вопросы:
1)рисую с помощью Canvas и его функций: Rectangle,Poligon ....
но рисунки получаются страшными, в плане линии не плавные
а какие то шероховатые, как их сгладить
2) как ускорить работу с выводом а то у меня тормоза, без использования ОpenGL, DirectX, ... станд стредствами так сказать
О проге использую Bitmap, в памяти как буфер на котором
рисую и затем копирую содержимое на форму
но тормоза большие особенно при изменении размеров
элементов или скажем рисовании линии так как необходима постоянная перерисовка
как вариант еще перехватываю сообщения виндоуз, не использую станд обработчики ...
3) может кто нибудь знает где скачать книгу
Графика в проектах на делфи (Осипов Дмитрий) 2008 г
 |
Вопрос задал: Anderson N.N (статус: 2-ой класс)
Вопрос отправлен: 6 июня 2009, 23:38
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 7 июня 2009, 22:48; участников в обсуждении: 2.
|
Вадим К (статус: Академик), 7 июня 2009, 11:55 [#1]:
Для более плавных линий наверно стоит попробовать использовать GDI+. Для делфи уже даже сделали обертки.
По второму вопросу - использование буфера - это не достаточно для хорошего быстрого рисования. Надо рисовать тогда, когда этого ожидает ОС. А именно в событии OnPaint. А если надо рисовать припустим 10 кадров в секунду - для это с помощью таймера генерируем собыите WM_PAINT (или можно через методы Invalidate, RePaint)
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Anderson N.N (статус: 2-ой класс), 7 июня 2009, 22:08 [#2]:
например я рисую линию
у меня реализовано так в onMouseMove проверяю если нажата
кнопка, и выбран элемент линия то рисую ее и затем вызываю onPaint
т.е мне эти действия лучше вынести в OnPaint?
|
|
Вадим К (статус: Академик), 7 июня 2009, 22:48 [#3]:
не надо вызывать OnPaint напрямую! надо вызывать через Windows. Попробуйте через посылку сообщения SendMessage(Handle, WM_PAINT, 0, 0);
Идея такая. в коде нажатия/перемещения мышки - рисуем битмап. делаем все подготовки (мало чего там может быть) и в конце концов посылаем указанное выше сообщение. а в обработчике OnPaint просто производим копирование битмапа на канву.
Но вообще подобная проблема решается гораздо проще. если надо просто линию рисовать, которая "тянется за мышкой", то тут применяется метод рисования по канве в xor режиме.
Делается это так. Для карандаша (pen) выставляется новый режим - Canvas.pen.mode := pmXor; и рисуется линия. Когда линию надо нарисовать на новом месте, то вначале она снова рисуется на старом месте (при этом благодаря этому режиму она стирается) и потом рисуется по новых координатах.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|