2013-08-25 7 views
1

Я хотел бы нарисовать линию на панели, когда я перемещаю мышь, удерживая нажатой правую кнопку мыши. Вот что я пробовал до сих пор:Рисование линии при перемещении мыши и нажатие правой кнопки мыши

private void panel1_MouseDown(object sender, MouseEventArgs e) 
{ 
    Point point = panel1.PointToClient(Cursor.Position); 
    Point cordinatedClikedPoint = new Point(xPanelPosition, yPanelPositon); 
    DrawPoint((point.X), (point.Y), Color.Navy);     
} 

public void DrawPoint(int x, int y, Color color) 
{ 
    Graphics g = this.panel1.CreateGraphics(); 
    Pen pen = new Pen(color); 
    g.DrawRectangle(pen, x, y, 3, 3); 
} 
+2

Пожалуйста, отметьте этот вопрос, WinForms, или WPF, или что бы то ни было. Только C# не рисует линии. –

+0

Есть ли причина использовать 'PointToClient (Cursor.Location)', а не 'e.Location', предоставленный' MouseEventArgs'? – dreamlax

ответ

1

Попробуйте это, вам нужно аннулировать панель на каждой ничьей.

private IList<Point> _pointList = new List<Point>(); 
private void panel1_MouseMove(object sender, MouseEventArgs e) 
{  
    _pointList.Add(e.Location); 
    panel1.Invalidate(); //force a repaint 
} 

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    e.Graphics.DrawLines(Pens.Black, _pointList); 
} 
+0

спасибо Mayank, но e.Graphics.DrawLines (Pens.Black, _pointList); не принимает список в качестве второго аргумента и жалуется, что он не может преобразовать system.Collections.Generic.List в System.Drawing.Point [] – user2277918

+0

просто вызовите 'ToArray()', чтобы преобразовать его в массив – Mayank

0

Насколько я знаю, событие MouseDown срабатывает один раз, когда вы нажимаете кнопку. Панель/форма WindowsForms или все, что там есть, перерисовываются каждые несколько мс. Поэтому вам нужно поместить этот код в OnPaint.

Это должно выглядеть примерно так:

//global variable 
bool isDragging = false; 

private void panel1_MouseDown(object sender, MouseEventArgs e) 
{ 
      isDragging = true;    
} 

private void panel1_MouseUp(object sender, MouseEventArgs e) 
{ 
      isDragging = false;    
} 

private void form_Paint(object sender, EventArgs e) 
{ 
      if(isDragging) 
      { 
       Point point = panel1.PointToClient(Cursor.Position); 
       Point cordinatedClikedPoint = new Point(xPanelPosition, yPanelPositon); 
       DrawPoint((point.X), (point.Y), Color.Navy); 
      } 
} 
3

Просто используйте MouseDown и MouseUp события установить переменную BOOL, сделать рисунок в вашем MouseMove EventHandler. Поскольку вы вызываете графический объект напрямую, любая операция аннулирования или перерисовки на панели приведет к ее очистке, остальные два ответа адресованы этому.

public partial class Form1 : Form 
{ 
    bool mouseIsDown; 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void panel1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button== System.Windows.Forms.MouseButtons.Right) 
      mouseIsDown = true; 
    } 

    private void panel1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (mouseIsDown) 
     { 
      Point point = panel1.PointToClient(Cursor.Position); 
      DrawPoint((point.X), (point.Y), Color.Navy); 
     } 
    } 

    private void panel1_MouseUp(object sender, MouseEventArgs e) 
    { 
     mouseIsDown = false; 
    } 

    public void DrawPoint(int x, int y, Color color) 
    { 
     Graphics g = this.panel1.CreateGraphics(); 
     Pen pen = new Pen(color); 
     g.DrawRectangle(pen, x, y, 3, 3); 
    } 
} 
0

Я думаю, что это полное решение, что вы пытаетесь сделать:

public partial class Form1 : Form 
{ 
    private Graphics g; 
    private readonly Pen pen = new Pen(Color.Navy, 7); 
    private Point oldCoords; 
    private readonly GraphicsPath graphicsPaths = new GraphicsPath(); 

    public Form1() 
    { 
     InitializeComponent(); 
     g = panel1.CreateGraphics(); 
    } 

    private void panel1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      if (oldCoords.IsEmpty) 
       graphicsPaths.StartFigure(); 
      else 
      { 
       graphicsPaths.AddLine(oldCoords, new Point(e.X, e.Y)); 
       g.DrawPath(pen, graphicsPaths); 
      } 
      oldCoords= new Point(e.X,e.Y); 
     } 
     else 
      oldCoords = Point.Empty; 
    } 

    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     g.DrawPath(pen, graphicsPaths); 
    } 
} 

Приветствия :)

+0

Btw .. если вы хотите отреагировать на правую кнопку мыши, а не налево, просто измените строку на: if (e.Button == MouseButtons .Правильно) –

2

Еще один ... На этот раз с помощью ControlPaint.DrawReversibleLine():

public partial class Form1 : Form 
{ 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private Point StartPoint, EndPoint; 

    private void panel1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     { 
      Point pt = Cursor.Position; 
      StartPoint = pt; 
      EndPoint = pt; 
      ControlPaint.DrawReversibleLine(StartPoint, EndPoint, Color.Black); 
     } 
    } 

    private void panel1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     { 
      ControlPaint.DrawReversibleLine(StartPoint, EndPoint, Color.Black); // erase previous line 
      EndPoint = Cursor.Position; 
      ControlPaint.DrawReversibleLine(StartPoint, EndPoint, Color.Black); // draw new line 
     } 
    } 

    private void panel1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     { 
      ControlPaint.DrawReversibleLine(StartPoint, EndPoint, Color.Black); // erase previous line 

      // ... do something with StartPont and EndPoint in here ... 

      // possibly add them to a class level structure to use in the Paint() event to make it persistent? 

     } 
    } 

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