Bueno estuve probando, grafico con GDI sobre el mismo formulario para probar.
Uso tres puntos e hice que el del medio se mueva con el mouse con el evento MouseDown.
Funciona, pero ahora quiero partir de dos puntos, uno al inicio y otro al final.
Y luego al hacer clic, que se agreguen puntos y luego los pueda mover si me acerco a ellos.
Lo que hago es graficar un círculo en cada punto, y lo que haría para mover un punto es comparar la posición x,y del mouse si es que está dentro de este círculo cambiarlo de color para indicar que se está en condiciones de mover ese punto.
Primero lo probé con un arreglo de tres pares de puntos siendo el del medio dinámico y funcionó.
Como según creo, un arreglo es fijo, no puedo usarlo para lo que quiero, no se como agregarle puntos a un arreglo, entonces usé una lista y para pasarsela al DrawLines lo convierto a arreglo con ToArray(), pero no me une el primer punto con el segundo, y no se tampoco si es lo mejor, ojalá puedan aportar alguna idea, gracias.
Pongo el código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace PruebaDeGraficos
{
public partial class Form1 : Form
{
int x, y;
int finx, finy;
int ox, oy;
int maxescx, maxescy;
int rpunto;
bool clicdowncurva = false;
private List
<Point
> mispuntos
= new List
<Point
>();
public Form1()
{
InitializeComponent();
x = 150;
y = 40;
mispuntos
.Add(new Point
(0,
1)); mispuntos
.Add(new Point
(1,
1)); mispuntos
.Add(new Point
(2,
1)); }
private void Form1_Paint(object sender, PaintEventArgs e)
{
rpunto = 4;
ox = 30;
oy = 30;
finx = this.Width - 85;
finy = this.Height - 95;
maxescx = finx - ox;
maxescy = finy - oy;
mispuntos
[0]=new Point
(ox, finy
); mispuntos
[1]=new Point
(finx, finy
); System.Drawing.Pen myPen
= new System.Drawing.Pen(System.Drawing.Color.Red); System.Drawing.Graphics formGraphics;
formGraphics = this.CreateGraphics();
formGraphics.DrawRectangle(myPen, ox,oy,maxescx,maxescy);
mispuntos
[2]=new Point
(x, y
); formGraphics.DrawEllipse(myPen, x-rpunto, y-rpunto, 2*rpunto, 2*rpunto);
Font pruebaFont
= new Font
("Haettenschweiler",
10); Brush blackBrush = Brushes.Black;
formGraphics.DrawString(x.ToString()+" , "+y.ToString(), pruebaFont, blackBrush, x, y-20);
myPen.Color = Color.Blue;
formGraphics.DrawLines(myPen, mispuntos.ToArray());
myPen.Dispose();
formGraphics.Dispose();
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
if (clicdowncurva)
{
x = e.X;
y = e.Y;
Invalidate();
}
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
clicdowncurva = true;
x = e.X;
y = e.Y;
Invalidate();
}
private void Form1_MouseUp(object sender, MouseEventArgs e)
{
clicdowncurva = false;
}
}
}
Edito: creo que el problema es esa lista, me cambia el orden de los puntos cuando lo paso a array me parece...
UPDATE: El problema era que asigno el punto incial y final seguidos, ahora lo cambie a:
mispuntos
[0]=new Point
(ox, finy
);mispuntos
[2]=new Point
(finx, finy
);mispuntos
[1]=new Point
(x, y
);
Y funciona, prueben si quieren, pero todavía falta para lo que quiero.
La idea es poder agregar puntos, moverlos y tambien quitarlos.
Todavía no se como.