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