Hola! muchas gracias por el ejemplo de codigo. Realmente me sirvio muchisimo, implemente lo que vos me pasaste y realmente funciona
El problema ahora es en algun punto de mi codigo. Tiene un comportamiento medio raro, aca cito una parte donde esta el problema (creo...), espero que si tenes un tiempo (o alguna otra alma caritativa) me puedas dar una mano
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
namespace Dibujin
{
class AreaDeDibujo: Control
{
private Panel areaDeDibujo;
private Linea linea;
private Grafico grafico;
private Pen lapiz;
private bool previsualizacion = false;
private bool esBotonIzquierdo = false;
public AreaDeDibujo(Panel panelDibujo) {
this.areaDeDibujo = panelDibujo;
this.grafico = new Grafico (panelDibujo.Size.Width, panelDibujo.Size.Height, panelDibujo);
//crea una instancia de una linea donde se guardaran las coordenadas
//de la linea que se va a dibujar
this.linea = new Linea();
//subscribe a los eventos del mouse y al que provoca que el
//control se dibuje en la pantalla.
this.areaDeDibujo.MouseDown += new MouseEventHandler(comenzarLinea);
this.areaDeDibujo.MouseMove += new MouseEventHandler(previsualizarLinea);
this.areaDeDibujo.MouseUp += new MouseEventHandler(finalizarLinea);
this.areaDeDibujo.Paint += new PaintEventHandler(areaDeDibujo_Paint);
}
public void comenzarLinea(Object sender, MouseEventArgs me)
{
if (MouseButtons == MouseButtons.Left)
{
//se comienza a dibujar la linea solamente cuando se sabe
//que se trata del boton izquierdo del mouse
if (this.linea == null)
this.linea = new Linea();
this.esBotonIzquierdo = true;
this.linea.setComienzo(this.areaDeDibujo.PointToClient (MousePosition));
}
else
this.esBotonIzquierdo = false;
}
//este metodo es llamado cada vez que el puntero del mouse
//se mueva. Con esto se logra que cada vez que se mueva,
//se dibuja una nueva linea de previsualizacion
public void previsualizarLinea(Object sender, MouseEventArgs me)
{
//con esta llamada se invalida toda la superficie del control
//areaDeDibujo (que es un panel) y hace que se vuelva a dibujar el mismo
if (MouseButtons == MouseButtons.Left)
{
this.esBotonIzquierdo = true;
this.previsualizacion = true;
//crea el tipo de lapiz que se utilizara para dibujar
//la linea de previsualizacion
this.lapiz = new Pen(Color.DarkSeaGreen, 1);
lapiz.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
this.linea.setFinal(this.areaDeDibujo.PointToClient(MousePosition));
this.areaDeDibujo.Invalidate();
}
else
this.esBotonIzquierdo = false;
}
//esta metodo es llamado cuando se produce el evento MouseUp
//que significa que es boton del mouse ha sido liberado.
public void finalizarLinea(Object sender, MouseEventArgs me)
{
if (this.esBotonIzquierdo == true)
{
this.previsualizacion = false;
lapiz = new Pen(Color.Red, 2);
this.linea.setFinal(this.areaDeDibujo.PointToClient(MousePosition));
this.areaDeDibujo.Invalidate();
}
}
void areaDeDibujo_Paint(Object sender, PaintEventArgs e)
{
if (this.esBotonIzquierdo == true)
{
if (previsualizacion == true)
{
//restaura el estado del grafico antes de volver a dibujar otra linea
this.grafico.restaurarEstado();
this.grafico.dibujarLinea(this.linea, lapiz);
}
else
{
//Como se dibujo una linea definitiva (no es una previsualizacion)
//entonces guarda el estado del dibujo.
this.grafico.dibujarLinea(this.linea, lapiz);
this.grafico.guardarEstadoDelGrafico();
}
}
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
e.Graphics.DrawImage(this.grafico.obtenerMapaDeBits(), 0, 0);
}
}
}
La idea de lo que quiero hacer es que me muestre una linea punteada que me sirva para ver donde quedara mi linea dibujada definitivamente. Mientras mantenga presionado el boton izquierdo del mouse, se dibuja la linea punteada. Cuando se libera el boton izquierdo se dibuja en un color rojo. Pero nunca se pinta de color rojo, excepto, cuando al cursor del mouse, antes de ser liberado, es posicionado sobre el formulario y fuera del panel. Mientras se encuentra dentro del panel el cursor, la linea roja no se dibuja. Alguna idea de lo que puede estar pasando? porque yo observo el codigo y me parece que al menos la logica, esta bien. Sera un tema de algo que pasa en un nivel mas bajo? Muchas gracias.
Saludos!!!