Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отрисовка своих контролов, Работа с графикой 
V
    Опции темы
Wilko
Дата 1.3.2011, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Здравствуйте. Извините за, может быть, туповатый вопрос. Но в графике не силен.
Необходимо создать класс описывающий линию с дополнительным функционалом(аналог Ручки в фотошопе, только без кривых). Т.е. с добавлением, удалением, перемещением узловых точек линии. Вопрос, как организовать отрисовку всего этого дела? При этом нужно, чтобы не терялась связность линии. Т.е. при удалении средней точки линия просто меняла направление на следующую точку(не знаю как яснее выразиться). И соответственно возможность привязаться на эвенты мыши. Никак сдвинуться с мертвой точки не могу. Мб у кого-нибудь есть ссылки на статьи, или свой опыт в этом деле  smile  Основная проблема в том, что когда переопределяю onPaint у  своих классов(Line и Dot), то ничего не происходит, как форма была пустая, так и остается. Это можно как нибудь реализовать без хардкодинга в методе onPaint формы? Не хочется все отображение писать в самой форме.



Это сообщение отредактировал(а) Wilko - 1.3.2011, 19:06
PM MAIL   Вверх
diadiavova
Дата 1.3.2011, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 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. 

Если хочешь свою реализацию, то в принципе она должна быть устроена примерно так же как и там, так что этот пакет изучить в любом случае будет неплохо.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Wilko
Дата 1.3.2011, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



А почему это легче реализовать на WPF? Просто до этого особо не сталкивался с WPF, а на формсах уже много чего написано для это программы. Вот только в графике траблы, не охото все переводить на WPF рельсы)
Задача программы состоит в анализе графической информации. Т.е. как таковой отрисовки там минимальное количество, но даже ее не удалось реализовать "с наскока".

p.s. что посоветуете для быстрого перехода на WPF: петцольд, макдональд? Или просто начать писать на WPF?)

Это сообщение отредактировал(а) Wilko - 1.3.2011, 22:45
PM MAIL   Вверх
diadiavova
Дата 1.3.2011, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Цитата(Wilko @  1.3.2011,  22:32 Найти цитируемый пост)
А почему это легче реализовать на WPF?

Потому что там используется векторная графика, а в винформах - растровая. Тебе надо, чтобы линия была объектом, чтобы она реагировала на действия пользователя, видоизменялась и прочее. Это все делается посредством векторной графики. То есть тебе придется либо создать свою упрощенную векторную модель на базе растра, либо воспользоваться готовой навороченной. 
Цитата(Wilko @  1.3.2011,  22:32 Найти цитируемый пост)
Просто до этого особо не сталкивался с WPF, а на формсах уже много чего написано для это программы.

Если все просто, воспользуйся пакетом, о котором я написал, там заложено много чего, и реализовать все совсем не сложно (по крайней мере легче, чем осваивать впф с нуля). 


Цитата(Wilko @  1.3.2011,  22:32 Найти цитируемый пост)
 Т.е. как таковой отрисовки там минимальное количество, но даже ее не удалось реализовать "с наскока".

Решение достаточно просто: тебе надо создать абстрактный класс для всех фигур, в нем реализуй абстрактный метод, сигнатура которого будет такой же, как OnPaint контрола. В этом методе все производные классы будут отрисовывать сами себя в соответствии с заданными параметрами. Далее создаешь контрол, в котором будет выполняться прорисовка, в этом контроле создаешь свойство, которое будет содержать коллекцию фигур. Метод OnPaint этого конторола будет сводиться к тому, что тебе надо будет перебрать всю коллекцию фигур в цикле и вызвать у них перерисовку, передав их методу прорисовки PainEventArgs, полученный из параметров. Ничего изощренного. Это, конечно упрощенно, но смысл такой. В упомянутом мной пакете все реализовано по такой схеме.

Цитата(Wilko @  1.3.2011,  22:32 Найти цитируемый пост)
p.s. что посоветуете для быстрого перехода на WPF: петцольд, макдональд? Или просто начать писать на WPF?)


Макдональд неплох, Петцольда не читал. Лучше спроси в соответствующем разделе, или в литературе.

Это сообщение отредактировал(а) diadiavova - 1.3.2011, 23:32


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Wilko
Дата 1.3.2011, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Пугают слова Visual Basic )) Т.к. я пишу на шарпе. Надо будет поискать библиотеку векторной графики для шарпа. Насчет отрисовки. Как передавать объект Graphics нашим объектам? В данный момент мне нужно отрисовывать только линию с опорными точками, так что создавать общий класс не вижу смысла.
Даже если мы создадим контрол в котором у нас будет коллекция наших объектов, как в этой коллекции привязать к каждому объекту свой обработчик?
PM MAIL   Вверх
diadiavova
Дата 1.3.2011, 23:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Цитата(Wilko @  1.3.2011,  23:33 Найти цитируемый пост)
Пугают слова Visual Basic )) Т.к. я пишу на шарпе.

Хоть на шарпе, хоть на шмарпе - это обычная .Net сборка, которая будет совершенно одинаково работать независимо от языка. 
Цитата(Wilko @  1.3.2011,  23:33 Найти цитируемый пост)
Как передавать объект Graphics нашим объектам?

Я же объяснил, что метод отрисовки должен иметь такую же сигнатуру, как и онпэйнт. То есть у него есть параметр PaintEventArgs, который в свою очередь содержит свойство Graphics. Учитывая, что отрисовку контрола ты будешь выполнять в методе OnPaint, ты получишь этот объект в виде параметра. Его и передавай всем фигурам.
Цитата(Wilko @  1.3.2011,  23:33 Найти цитируемый пост)
Даже если мы создадим контрол в котором у нас будет коллекция наших объектов

Не даже, а так и надо сделать
Цитата(Wilko @  1.3.2011,  23:33 Найти цитируемый пост)
 как в этой коллекции привязать к каждому объекту свой обработчик? 

Какой обработчик? Каждая фигура наследует метод прорисовки от базового для всех фигур класса, этот метод тебе и надо будет вызвать при обходе коллекции во время отрисовки контрола. 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Wilko
Дата 2.3.2011, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Просто я не понимаю как при этом на каждую опорную точку на линии нам еще повесить события на перетаскивание, удаление и т.п. smile 
Или  всю эту логику нужно реализовать в абстрактном родительском классе?

Это сообщение отредактировал(а) Wilko - 2.3.2011, 00:01
PM MAIL   Вверх
diadiavova
Дата 2.3.2011, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 16
Всего: 142



Цитата(Wilko @  2.3.2011,  00:00 Найти цитируемый пост)
Просто я не понимаю как при этом на каждую опорную точку на линии нам еще повесить события на перетаскивание, удаление и т.п.

Это уже отдельный вопрос. Тебе в каждой фигуре надо будет иметь ссылку на контрол, в котором будет происходить прорисовка. В этом контроле тебе придется отлавливать некоторые события во всех фигурах. Фигуры будут иметь информацию о том, где находятся точки и все остальное. и если в конроле к примеру мышка клацнула по тому месту, где точка, то фигура должна инициировать событие клика по точке. Если начать думать о деталях, то все окажется не так элементарно, поэтому я и говорю о том, что готовое решение предпочтительнее.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Wilko
Дата 2.3.2011, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Вот подкинули интересную статейку, мб кому понадобится
http://habrahabr.ru/blogs/net/105306/
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0693 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.