| 
			
				|  | 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.
 |  |  
		| Вернуться к началу |  |  
		|  |  
		|  |  
  
	| 
 
 | Вы не можете начинать темы Вы не можете отвечать на сообщения
 Вы не можете редактировать свои сообщения
 Вы не можете удалять свои сообщения
 Вы не можете голосовать в опросах
 Вы не можете добавлять приложения в этом форуме
 Вы можете скачивать файлы в этом форуме
 
 |  |