Dibujar rectangulos sobre controles

Yamil Magrini
01 de Febrero del 2011
Hola como están!!
Les cuento el problema que tengo a ver si pueden ayudarme.

Tengo un formulario en el cual pongo 3 controles xx.
En el evento MouseDown de cualquiera, envío a una clase creada por mi los Rectangulos de todos los controles (array).
La clase que cree tiene que ser capaz de simular arrastrar los controles involucrados, creando rectangulos de los controles. Digamos que hagamos de cuenta que tengo que arrastrar los controles.

Las 2 cosas importantes que tiene que cumplir es que:
- NO haya parpadeos ni retardos (no pude cumplir lo de los parpadeos)
- Las lineas se dibujen por encima de los demas controles.

Esto puedo simularle o hacerlo, si sobreescribo CreateParams dentro del fomulario, si lo hago desde la clase que cree no puedo.

Todos los controles estan siempre sobre un panel y debe arrastrarse dnetro del mismo.

Segun me dijeron, debo crear otro panel y crear en el una region con los rectangulos.
Lo hago, pero no logro que funcione.
Les paso el codigo que tengo de mi clase:

class cRectangulosArrastre
{
#region

Pen lapiz1;
Pen lapiz2;
Control vControl; //Control de inicio de arrastre
Panel contenedor; //Panel contenedor inmediato o recepcionado de los controles
Rectangle[] rectangulos; //Array de Rectangulos en posición actual
Rectangle[] rectangulosInicial; //Array de rectangulos en posición inicial
Point posicionInicial; //Posición inicial del Mouse
Point posicionActual;// Posición actual del mouse
bool bVisible = true;// habilita o no el dibujo de los recuadros

List lRectangulos = new List(); //Lista de rectangulos temporales

#endregion

#region Propiedades

///
/// Obtiene o establece un indicador sobre si los rectángulos deben de estar o no visibles.
///
public bool Visible
{
get { return bVisible; }
set { bVisible = value; }
}
///
/// Obtiene o establece el control sobre el que se dibujarán los rectángulos.
///
public Control CControl
{
get { return vControl; }
set { vControl = value; }
}

///
/// Establece el punto inicial sobre el que se ha hecho clic.
/// Obtiene la posición actual del ratón en coordenadas cliente del control.
///
public Point PuntoArrastre
{
get { return posicionActual; }
set { posicionInicial = value; }
}

///
/// Obtiene o establece el Panel contenedor de los objetos a arrastrar.
///
public Panel Contenedor
{
get { return contenedor; }
set { contenedor = value; }
}

///
/// Establece o devuelve el array de rectángulos
///
public Rectangle[] Rectangulos
{
get { return rectangulos; }
set
{
rectangulos = value;
if (rectangulosInicial == null) rectangulosInicial = value;
}
}
#endregion


public void setearEventos()
{
//Asignar Eventos y configurar lapices dibujadores
if (CControl != null && Contenedor != null)
{
CControl.MouseDown += new MouseEventHandler(cRectangulosArrastre_MouseDown);
CControl.MouseMove += new MouseEventHandler(cRectangulosArrastre_MouseMove);
CControl.MouseUp += new MouseEventHandler(cRectangulosArrastre_MouseUp);

Contenedor.MouseUp += new MouseEventHandler(cRectangulosArrastre_MouseUp);
Contenedor.Paint += new PaintEventHandler(cRectangulosArrastre_Paint);
}
}
///
/// Instancia la clase de forma vacía.
/// Invoque a setearEventos luego de especificar los valores necesarios.
///
public cRectangulosArrastre()
{

}
///
/// Recibe el contenedor de tipo Panel especificado en donde se desplazarán los controles
///
///
///
///
///
Panel panel3;
public cRectangulosArrastre(Control vControl, Panel pContenedor, Panel panel2, Point pPuntoInicial, Rectangle[] aRectangulos)
{
Contenedor = pContenedor;
panel3 = panel2;

CControl = vControl;
Rectangulos = aRectangulos;
//rectangulosInicial = aRectangulos;
PuntoArrastre = pPuntoInicial;


setearEventos();

}

///
/// Busca el Panel contenedor de los controles de forma automática
///
///
///
///
public cRectangulosArrastre(Control vControl, Point pPuntoInicial, Rectangle[] aRectangulos)
{
CControl = vControl;

//Se busca el panel contenedor mas proximo del control recibido
if (typeof(Panel) == CControl.Parent.GetType())
{
Contenedor = (Panel)CControl.Parent;
}

Rectangulos = aRectangulos;
PuntoArrastre = pPuntoInicial;

setearEventos();
}


private void cRectangulosArrastre_MouseDown(object sender, MouseEventArgs e)
{
if (MouseButtons.Left == e.Button)
{
lRectangulos.Clear();
}
}

private void cRectangulosArrastre_MouseMove(object sender, MouseEventArgs e)
{
if (bVisible && MouseButtons.Left == e.Button)
{
lRectangulos.Clear();

posicionActual = e.Location;

foreach (Rectangle cuadro in rectangulosInicial)
{
lRectangulos.Add(new Rectangle(cuadro.X + e.X - posicionInicial.X,
cuadro.Y + e.Y - posicionInicial.Y,
cuadro.Width,
cuadro.Height));
}
Rectangulos = lRectangulos.ToArray();
Contenedor.Invalidate();
}
}

private void cRectangulosArrastre_MouseUp(object sender, MouseEventArgs e)
{
if (bVisible)
{
bVisible = false;
Contenedor.Invalidate();
Dispose();

}
}


private void cRectangulosArrastre_Paint(object sender, PaintEventArgs e)
{
if (Rectangulos.Length > 0 && bVisible)
{
//Configuro lapices
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

lapiz1 = new Pen(Color.Gray, 3);
lapiz2 = new Pen(Color.Gray, 1);
lapiz1.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;//linea de puntos

//Dibujar

e.Graphics.DrawRectangles(lapiz1, Rectangulos.ToArray());
e.Graphics.DrawRectangles(lapiz2, Rectangulos.ToArray());

//Liberación de recursos
e.Dispose();
lapiz1.Dispose();
lapiz2.Dispose();


}



GRACIAS!!!!!!