![]() |
|
Модераторы: gambit, Partizan |
![]()
|
|
| Wilko |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Здравствуйте. Извините за, может быть, туповатый вопрос. Но в графике не силен.
Необходимо создать класс описывающий линию с дополнительным функционалом(аналог Ручки в фотошопе, только без кривых). Т.е. с добавлением, удалением, перемещением узловых точек линии. Вопрос, как организовать отрисовку всего этого дела? При этом нужно, чтобы не терялась связность линии. Т.е. при удалении средней точки линия просто меняла направление на следующую точку(не знаю как яснее выразиться). И соответственно возможность привязаться на эвенты мыши. Никак сдвинуться с мертвой точки не могу. Мб у кого-нибудь есть ссылки на статьи, или свой опыт в этом деле Это сообщение отредактировал(а) Wilko - 1.3.2011, 19:06 |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 16 Всего: 142 |
Вообще, подобные вещи проще реализуются на WPF, но если "кровь с носа" надо на винформах сделать то познакомься с пакетом Microsoft.VisualBasic.PowerPacks. Он поставляется со студией и в винфорам-проектах VBNet на панели инструментов имеются элементы из него(линия, овал, прямоугольник).
У меня эта библиотека находится по адресу C:\Program Files\Reference Assemblies\Microsoft\VBPowerPacks\v10.0\Microsoft.VisualBasic.PowerPacks.Vs.dll Там есть небольшой набор фигур, но можно создать свои, унаследовав их он базового класса Shape. Если хочешь свою реализацию, то в принципе она должна быть устроена примерно так же как и там, так что этот пакет изучить в любом случае будет неплохо. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| Wilko |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
А почему это легче реализовать на WPF? Просто до этого особо не сталкивался с WPF, а на формсах уже много чего написано для это программы. Вот только в графике траблы, не охото все переводить на WPF рельсы)
Задача программы состоит в анализе графической информации. Т.е. как таковой отрисовки там минимальное количество, но даже ее не удалось реализовать "с наскока". p.s. что посоветуете для быстрого перехода на WPF: петцольд, макдональд? Или просто начать писать на WPF?) Это сообщение отредактировал(а) Wilko - 1.3.2011, 22:45 |
|||
|
||||
| diadiavova |
|
||||||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 16 Всего: 142 |
Потому что там используется векторная графика, а в винформах - растровая. Тебе надо, чтобы линия была объектом, чтобы она реагировала на действия пользователя, видоизменялась и прочее. Это все делается посредством векторной графики. То есть тебе придется либо создать свою упрощенную векторную модель на базе растра, либо воспользоваться готовой навороченной.
Если все просто, воспользуйся пакетом, о котором я написал, там заложено много чего, и реализовать все совсем не сложно (по крайней мере легче, чем осваивать впф с нуля).
Решение достаточно просто: тебе надо создать абстрактный класс для всех фигур, в нем реализуй абстрактный метод, сигнатура которого будет такой же, как OnPaint контрола. В этом методе все производные классы будут отрисовывать сами себя в соответствии с заданными параметрами. Далее создаешь контрол, в котором будет выполняться прорисовка, в этом контроле создаешь свойство, которое будет содержать коллекцию фигур. Метод OnPaint этого конторола будет сводиться к тому, что тебе надо будет перебрать всю коллекцию фигур в цикле и вызвать у них перерисовку, передав их методу прорисовки PainEventArgs, полученный из параметров. Ничего изощренного. Это, конечно упрощенно, но смысл такой. В упомянутом мной пакете все реализовано по такой схеме.
Макдональд неплох, Петцольда не читал. Лучше спроси в соответствующем разделе, или в литературе. Это сообщение отредактировал(а) diadiavova - 1.3.2011, 23:32 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
||||||
|
|||||||
| Wilko |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Пугают слова Visual Basic )) Т.к. я пишу на шарпе. Надо будет поискать библиотеку векторной графики для шарпа. Насчет отрисовки. Как передавать объект Graphics нашим объектам? В данный момент мне нужно отрисовывать только линию с опорными точками, так что создавать общий класс не вижу смысла.
Даже если мы создадим контрол в котором у нас будет коллекция наших объектов, как в этой коллекции привязать к каждому объекту свой обработчик? |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 16 Всего: 142 |
Хоть на шарпе, хоть на шмарпе - это обычная .Net сборка, которая будет совершенно одинаково работать независимо от языка. Я же объяснил, что метод отрисовки должен иметь такую же сигнатуру, как и онпэйнт. То есть у него есть параметр PaintEventArgs, который в свою очередь содержит свойство Graphics. Учитывая, что отрисовку контрола ты будешь выполнять в методе OnPaint, ты получишь этот объект в виде параметра. Его и передавай всем фигурам.
Не даже, а так и надо сделать Какой обработчик? Каждая фигура наследует метод прорисовки от базового для всех фигур класса, этот метод тебе и надо будет вызвать при обходе коллекции во время отрисовки контрола. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| Wilko |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
Просто я не понимаю как при этом на каждую опорную точку на линии нам еще повесить события на перетаскивание, удаление и т.п.
Или всю эту логику нужно реализовать в абстрактном родительском классе? Это сообщение отредактировал(а) Wilko - 2.3.2011, 00:01 |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 16 Всего: 142 |
Это уже отдельный вопрос. Тебе в каждой фигуре надо будет иметь ссылку на контрол, в котором будет происходить прорисовка. В этом контроле тебе придется отлавливать некоторые события во всех фигурах. Фигуры будут иметь информацию о том, где находятся точки и все остальное. и если в конроле к примеру мышка клацнула по тому месту, где точка, то фигура должна инициировать событие клика по точке. Если начать думать о деталях, то все окажется не так элементарно, поэтому я и говорю о том, что готовое решение предпочтительнее. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| Wilko |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 4.5.2008 Репутация: нет Всего: нет |
||||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Разработка Windows Forms | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |