Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Редактирование графических объектов


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

Спасибо

Автор: jonie 19.2.2014, 22:14
обрабатывать события мышки...
Например:
- 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;
            }
        }
    }

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

Еще раз сердечно Вас благодарю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)