Categorías destacadas
programacion php    
Lista de foros

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!!!!!!

 
BBDD
Entornos de desarrollo
Entretenimiento
Herramientas
Internet
Lenguajes de script
Lenguajes imperativos
Lenguajes orientados a objeto
Otros lenguajes
Plataformas
Teoría
Varios
Copyright © 1998-2011 Programación en Castellano. Todos los derechos reservados
Datos legales | Politica de privacidad | Contacte con nosotros | Publicidad

Diseño web y desarrollo web. Un proyecto de los hermanos Carrero.

Red internet:
Juegos gratis | Servidores dedicados
Más internet: Password | Directorio de weblogs | Favicon