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