Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2013, 10:20   #1
AlexSirk
 
Регистрация: 12.06.2011
Сообщений: 3
По умолчанию Перемещение нарисованных фигур

Добрый день!
Нарисовал элипс
Код:
g.DrawEllipse(New Pen(Brushes.Black, 2), New Rectangle(e.X - 1, e.Y - 1, 2, 2))
Теперь возникла потребность переместить элипс, как это можно реализовать? То есть надо нажать на элипс и начать перемещение движением мышки. Я понимаю, что нужно думать в плане MouseMove, MouseClick. Но как взаимодействовать их вместе? И как определить, какую именно перемещать фигуру.
Благодарю!
Работаю в Visual Basic .NET
AlexSirk вне форума Ответить с цитированием
Старый 19.03.2013, 11:38   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
Но как взаимодействовать их вместе?
Событие MouseLeftButtonDown => перейти в состояние перемещения (для этого завести у себя переменную типа Boolean), запомнить положение курсора мыши
Событие MouseMove => если в состоянии перемещения, то определить на сколько пикселей переместился курсор мыши (координаты мы же запомнили, да?) и изменить координаты эллипса на такую же величину. Запомнить новые координаты курсора (заменить ими старые)
Событие MouseLeftButtonUp => покинуть состояние перемещения

Цитата:
как определить, какую именно перемещать фигуру
Координаты нарисованного эллипса следует где-то хранить. При наступлении события MouseLeftButtonDown определить, какой эллипс по данным координатам находится (сравнить координаты, ширину-высоту эллипса и координаты курсора мыши во время клика)

Идея понятна?
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 20.03.2013, 10:14   #3
AlexSirk
 
Регистрация: 12.06.2011
Сообщений: 3
По умолчанию

А как можно запретить рисовать, если мышь направлена на ту фигуру, которая уже нарисовано.
AlexSirk вне форума Ответить с цитированием
Старый 20.03.2013, 11:20   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Теперь возникла потребность переместить элипс, как это можно реализовать?
Вообще-то задача решается несколько сложнее, чем здесь сказано.
1. Координаты отрисованной фигуру, нужно хранить в специальном списке структур.
2. На канве, определяются координаты курсора и сравниваются с координатами в этом массиве.
3. Пре перемещении структуры, часть канвы будет затёрта, значит структура фигуры, должна содержать участок перекрываемой канвы и восстанавливать тот участок, который открывается при её перемещении. Заслоняемую часть, она должна перезаписывать в эту структуру.
Можно пойти и другим путём. Создать три буфера отображения. Один, будет содержать изначальную канву, два других, для перерисовки изображений и переключения буферов. Такие режимы обеспечивает 2D графика в DirectX или в OpenGL.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 20.03.2013, 11:20   #5
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Аналогично: сравнить координаты будущей фигуры (той, которую мы собираемся нарисовать) с координатами всех ранее нарисованных фигур. Если есть пересечения - запрещать рисование
Smitt&Wesson: согласен, я описывал только принцип Также можно пойти по пути WPF/Silverlight, где рисуемые эллипсы будут производными от класса Shape. Тогда все задачи по определению "кликнутой" фигуры и деталей отрисовки будут переложены на плечи фреймворка
Благодарить в репутацию. Проклинать — туда же

Последний раз редактировалось Luuzuk; 20.03.2013 в 11:25.
Luuzuk вне форума Ответить с цитированием
Старый 20.03.2013, 16:32   #6
AlexSirk
 
Регистрация: 12.06.2011
Сообщений: 3
По умолчанию

Знаете хорошую литературу о WPF?
AlexSirk вне форума Ответить с цитированием
Старый 24.03.2013, 11:02   #7
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Также можно пойти по пути WPF/Silverlight
Если бы работал исключительно с Windows, то сказал бы также. Примерно год работал только с WPF, всем его рекомендовал, познал много ее вкусностей, но когда встала задача разработки под другие системы пришлось вновь вспоминать WindowsForm!
Под Linux/GNOME есть очень хорошая, opensource-библиотека, аналог .NET Framework - Gtk#, в которой нет реализации WPF, т.к. WPF - это Windows Presentation Foundation, где Windows не переводится как "Окно", а представляет ОС Windows. Вообще, использование элементов управления, заточеных под конкретную ОС - это очень плохо для C#, который разрабатывался как кроссплатформенный!
Цитата:
Сообщение от AlexSirk Посмотреть сообщение
Знаете хорошую литературу о WPF?
По указаным причинам, советую ни начинать изучать WPF, а посмотреть в сторону готовых примеров, например Chess Program in C# или воспользоваться поиском по ключу Moving на том же самом CodeProject.
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 14.04.2013, 15:20   #8
AlexSSS3
 
Регистрация: 08.04.2013
Сообщений: 9
По умолчанию

Благодарю вас, нашел очень хорошую библиотеку.
AlexSSS3 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение фигур ILanor Помощь студентам 2 02.05.2012 12:25
Движение фигур N.i.k.o.l.a.y. Общие вопросы Delphi 1 13.03.2012 09:12
Растягивание фигур. KOPC1886 C# (си шарп) 4 03.05.2011 13:04
Площадь фигур Вор Паскаль, Turbo Pascal, PascalABC.NET 3 18.05.2009 22:44