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

Поиск:

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


Новичок



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

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



Привет всем,
может кто-то знает как на графике отредактировать
 например линию. Т.е. сначала выбрать объект,
затем в окне показать все свойства (цвет, толщина
и т.д.) и возможность изменить.После выбора по концам
должны образоваться маркеры. Если потянуть за любой из них 
длина отрезка должна измениться. 

Спасибо

PM   Вверх
jonie
Дата 19.2.2014, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



обрабатывать события мышки...
Например:
- OnMouseDown - проверяем что точка тычка мышки принадлежит линии (можно с некоторым tolerance - иначе слонжо понять).
- "Переводим" объект "линия" в состояние "редактирование" и показываем что надо.

Конечно, объект "линия" или что-то вроде того вы должны запрограммировать .

Вот примерчик набросал (он правда на C#, но не суть):
Код

    public partial class Form1 : Form
    {
        private Canvas c;
        public Form1()
        {
            InitializeComponent();
            c = new Canvas();
            var line1 = new Line(c, new Point(10, 10), new Point(100, 100));
            c.AddVisual(line1);
            c.Dock = DockStyle.Fill;
            Controls.Add(c);
        }
    }

    class AfterDrawEvent : EventArgs
    {
        public Graphics G { get; private set; }

        public AfterDrawEvent(Graphics g)
        {
            G = g;
        }
    }

    class MouseDownEvent : EventArgs
    {
        public MouseEventArgs Data { get; private set; }

        public MouseDownEvent(MouseEventArgs data)
        {
            Data = data;
        }
    }

    internal class Canvas : UserControl
    {
        private readonly List<IVisual> _visuals = new List<IVisual>();

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            BroadcastEvent(new AfterDrawEvent(e.Graphics));
        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            BroadcastEvent(new MouseDownEvent(e));
            base.OnMouseDown(e);
        }

        private void BroadcastEvent(EventArgs e)
        {
            foreach (var visual in _visuals)
            {
                visual.OnCanvasEvent(this, e);
            }
        }

        public void AddVisual(IVisual el)
        {
            _visuals.Add(el);
        }

        public void RemoveVisual(IVisual el)
        {
            _visuals.Remove(el);
        }
    }

    interface IVisual
    {
        void OnCanvasEvent(object sender, EventArgs e);
    }

    class Line : IVisual
    {
        private readonly Canvas _c;
        private Point _p1;
        private Point _p2;
        private readonly Pen _pen = new Pen(System.Drawing.Color.Black);

        public Line(Canvas c, Point p1, Point p2)
        {
            _c = c;
            _p1 = p1;
            _p2 = p2;
        }

        public Color Color
        {
            get { return _pen.Color; }
            set
            {
                _pen.Color = value;
                _c.Invalidate();
            }
        }

        public Point P1
        {
            get { return _p1; }
            set
            {
                _p1 = value;
                _c.Invalidate();
            }
        }

        public Point P2
        {
            get { return _p2; }
            set
            {
                _p2 = value;
                _c.Invalidate();
            }
        }

        public void OnCanvasEvent(object sender, EventArgs e)
        {
            if (e is AfterDrawEvent) OnAfterDrawEvent(sender, (AfterDrawEvent)e);
            else if (e is MouseDownEvent) OnMouseDownEvent(sender, (MouseDownEvent)e);
        }

        private void OnAfterDrawEvent(object sender, AfterDrawEvent e)
        {
            e.G.DrawLine(_pen, _p1, _p2);
        }

        private void OnMouseDownEvent(object sender, MouseDownEvent e)
        {
            const double click_tolerance = 4.0;

            if(Helpers.DistPointToLine(e.Data.Location, _p1, _p2)<click_tolerance && e.Data.Clicks > 1)
            {
                Color = Color == Color.Black ? Color.Red : Color.Black;
            }
        }
    }


Это сообщение отредактировал(а) jonie - 19.2.2014, 22:59


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
BENJ
Дата 20.2.2014, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое Вам спасибо. 
Я когда-то в инете (кажется  coderproject) ,
нашел готовый класс ну и забыл записать. 
Сейчас надо срочно кусок работы сделать, хозяин
стоит над головой, торопит гад. 

Еще раз сердечно Вас благодарю.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

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

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


 




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


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

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