2010-08-29 5 views
3

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

Заранее спасибо


мне удалось сделать это с помощью жесткого закодированного прямоугольника. Но у меня еще нет идеи, как это сделать, используя drawLine() Могу ли я использовать drawPath, чтобы выполнить тест на попадание?

Вот код:

private bool selectGraph = false; 
private Rectangle myrec = new Rectangle(50, 50, 100, 100); 
private Graphics g; 

private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     SolidBrush sb = new SolidBrush(Color.Blue); 
     Pen p = new Pen(Color.Blue, 5); 

     e.Graphics.DrawRectangle(p, myrec); 
     e.Graphics.FillRectangle(sb, myrec); 
    } 

    private void panel1_MouseUp(object sender, MouseEventArgs e) 
    { 
     Point mPT = new Point(e.X, e.Y); 

     if (e.Button == MouseButtons.Left) 
     { 
      if (myrec.Contains(mPT)) 
      { 
       selectGraph = true; 
       button1.Enabled = true; 
      } 
      else 
      { 
       selectGraph = false; 
       button1.Enabled = false; 
      } 
     } 
     Invalidate(); 
    } 
+0

Crap - это инструмент для визуальных инструментов. – Rye

+0

Пожалуйста, о, пожалуйста, избавитесь от этой 'g = panel1.CreateGraphics();' line! Вы уже находитесь в ролике «Paint». «PaintEventArgs» имеет свойство «Graphics», которое вы используете для рисования. Ваше приложение будет медленным и крайне искаженным, если вы используете свой текущий способ. :) – TheCloudlessSky

+0

@TheClodlessSky Да, я уже удалил такой подход! Я новичок в GDI, поэтому LOL. Спасибо TCS :) – Rye

ответ

2

Ну вы могли бы начать с чем-то вроде простого Line класса:

public class Line 
{ 
    public Point Start { get; set; } 
    public Point End { get; set; } 
} 

Тогда вы могли бы иметь свой вид:

private Line Line = new Line(); 

protected override void OnPaint(PaintEventArgs e) 
{ 
    e.Graphics.DrawLine(Pens.Red, this.Line.Start, this.Line.End); 
} 

protected override void OnMouseMove(MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Left) 
    { 
     this.Line.Start = e.Location; 
     this.Refresh(); 
    } 
    else if (e.Button == MouseButtons.Right) 
    { 
     this.Line.End = e.Location; 
     this.Refresh(); 
    } 
} 

Так в основном, они могли бы удалить this.Line, возможно, на клике «MiddleButton» или s omething. Этого должно быть достаточно, чтобы вы начали.

У меня есть created a sample, который показывает, как это можно сделать. Установите некоторые точки останова и посмотрите, как все сделано.

+0

Это событие мыши. Я хочу, чтобы, когда строка уже включена в событие рисования, я могу перетащить, выбрать и удалить ее. Подобно перетаскиванию пользовательского элемента управления визуальной студией. Когда пользователь добавляет, например, кнопку, он может перемещать ее по форме. – Rye

+0

@Rye - Хорошо, но то, что я вам предоставил, - основа для вас, чтобы начать. «Перетаскивание» в основном «MouseMove» при нажатии кнопки. Если вам нужно перетащить, чтобы переместить линию, вам нужно будет компенсировать точки «Старт» и «Конец». Если вы хотите «удалить» его, вы можете установить Line в NULL. – TheCloudlessSky

+0

Да Да, но моя основная проблема заключается в выборе линии. – Rye

0

Для этого нет простого решения для одной линии. Вам придется запрограммировать это самостоятельно.

Вы должны отслеживать каждый объект, который вы нарисовали. В событии onmousedown вам нужно выяснить, нажала ли мышь или рядом с объектом, который вы хотите переместить/удалить, сравнив координаты. Затем вам нужно нарисовать визуальное руководство, чтобы линия была выбрана. Удаление теперь довольно просто, удалив объект из коллекции.

Для перетаскивания вам нужно сделать что-то подобное, изменив координаты объекта в соответствии с перемещением мыши.

+0

Знаете ли вы некоторые ссылки, которые я могу использовать для справки? – Rye

Смежные вопросы