Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Как избавиться от шлейфа при рисовании контура?

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
domn2



Зарегистрирован: 17.04.2013
Сообщения: 2

СообщениеДобавлено: Ср 17 Апр 2013 22:41    Заголовок сообщения: Как избавиться от шлейфа при рисовании контура? Ответить с цитатой

Добрый вечер!

Повесил на событие MouseMove отрисовку временного контура:
при перемещении мыши конец контура (прямого отрезка) перемещается за ней.
Код:
  contour[0].SetVertex(1, x, y, 0);
  painter.PaintContour(mySurface, contour, '');

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

Нашёл один способ:
Код:
FIngeoApp.MainWindow.MapWindow.Invalidate;

Но тогда будет перерисовываться всё, поэтому этот вариант не походит. Есть ли какой-нибудь другой способ удалять "старые" контуры с экрана или нужно каким-то образом очищать всю поверхность рисования?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Михаил Власов



Зарегистрирован: 14.02.2005
Сообщения: 580
Откуда: ИНТЕГРО

СообщениеДобавлено: Чт 18 Апр 2013 07:17    Заголовок сообщения: Re: Как избавиться от шлейфа при рисовании контура? Ответить с цитатой

domn2 писал(а):

Нашёл один способ:
Код:
FIngeoApp.MainWindow.MapWindow.Invalidate;

Но тогда будет перерисовываться всё, поэтому этот вариант не походит. Есть ли какой-нибудь другой способ удалять "старые" контуры с экрана или нужно каким-то образом очищать всю поверхность рисования?

В версии 4.6 (которая сейчас на бета тестировании) всё перерисовываться и моргать не будет.

Найденный вами способ - правильный и рекомендованный в версиях 4.6 и выше.

Можно чуть-чуть оптимизировать, если вызывать не Invalidate, а InvalidateRect, в котором указывать прямоугольник, включающий габариты старой линии и новой.

В старых версиях можно применять режим инвертирования при рисовании линии. Для этого в параметрах окантовки Pen.Mode надо задавать inpmXor. Если одну и ту же линию нарисовать два раза, она сотрется.

Но я рекомендую использовать Invalidate. Программная логика упрощается, и в 4.6 визуально приятнее. Кроме того, процесс действий пользователя можно сопровождать богатыми декорациями, не стесняя себя ограничениями инверсных линий.

_________________
С уважением, Михаил Власов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
domn2



Зарегистрирован: 17.04.2013
Сообщения: 2

СообщениеДобавлено: Чт 18 Апр 2013 12:39    Заголовок сообщения: Ответить с цитатой

Большое спасибо за ответ!

Попробовал через режим отрисовки — всё работает. Только одно уточнение: надо ставить inpmNotXor.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB