none
Como evitar que un control se coloque encima de otro ¿? RRS feed

  • Pregunta

  • Saludos.

    El problema que tengo es el siguiente:

    Yo creo dinamicamente picturebox sin ningún problema.

    Los puedo mover dentro de un panel sin ningún problema.

    Ahora lo que no se como hacer es lo siguiente:

    Evitar colocar un picture box encima de otro.

    Como hago para que cuando suelte el picture box encima de otro, automáticamente el primero regrese a su antigua posición.

    Como hago para que un picturebox se de cuenta de que tiene encima el otro picturebox. (ESTE SERÍA EL GRAN PROBLEMA)

    Nota:
    Yo guardo los valores de la posición del picturebox cuando le doy click. Se crean Xinicial, Yinicial.

     

    GRACIAS DE ANTEMANO.

    viernes, 17 de diciembre de 2010 0:39

Respuestas

  • Logré hacerlo con esto:

     

    private void EvitarQueChoquen()
            {
                Rectangle myRectangle_A = new Rectangle();
                Rectangle myRectangle_B = new Rectangle();

                myRectangle_A.X = this.pictureBox2.Left;
                myRectangle_A.Y = this.pictureBox2.Top;
                myRectangle_A.Width = this.pictureBox2.Width;
                myRectangle_A.Height = this.pictureBox2.Height;

                myRectangle_B.X = this.pictureBox3.Left;
                myRectangle_B.Y = this.pictureBox3.Top;
                myRectangle_B.Width = this.pictureBox3.Width;
                myRectangle_B.Height = this.pictureBox3.Height;
                if (myRectangle_A.IntersectsWith(myRectangle_B))
                {
                       ////Colisionaron
                       MessageBox.Show("Colisionaron");
                }
                else
               {
                       ////No pasó nada
               }
            }

     

    Lo hice de esa forma. Creando un objeto tipo Rectangle.

    Ahí meto todos los parámetros que le mando a la funcion que me dijistes que usara

    Ahora solo a implementarlo.

     

    Sin embargo, si se puede solucionar lo del problema que te indique, sin tener que utilizar un objeto tipo Rectangle sería mejor. Gracias

     

    viernes, 17 de diciembre de 2010 3:48

Todas las respuestas

  • hola

    http://social.msdn.microsoft.com/Forums/es/vcses/thread/116fea70-2f50-4652-a2bd-3cea4b550903

    como veras en la otra pregunta, podrias evaluar cuando dos controles colisionan y si esta se cumple, als coordenas originales de los controles deberias conservarlas, para aplciarlas cuando se detecte la superposicion

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 17 de diciembre de 2010 1:41
  • mmmm

    Ok. Eso para cuando ya tengo los picture box creados desde el inicio.

    Pero yo los creo dinamicamente.

    No se como podría implementar eso. Ya que todos los pictureBox se crean bajo la misma variable.

    La forma en que manipulo cada PictureBox es con la instrucción PictureBox myPicBox = (PictureBox)sender. Esto en cualquiera de los eventos de un picturebox.

    Voy a investigar con eso a ver como me va.

    Si conocen alguna forma me dicen xfa.

    Mil gracias por la información Leandro.

    Si es posible ayúdame un poco más a fondo. Si logro resultados los posteo.

    viernes, 17 de diciembre de 2010 2:11
  • No se como podría implementar eso. Ya que todos los pictureBox se crean bajo la misma variable

    pero imagino que estos los agregas en alguna coleccion que los contiene, en ese caso podrias recorrerla y validar si este nuevo que creas se superpone con algun existente

    podrias hacer un foreach para esto

    foreach(Control ctr in this.Controls){

        if(ctrl Is PictureBox){

             PictureBox pic = ctrl as PictureBox;

             //aqui comparas

        }

    }

     

    aunque si puede usar el

    foreach(PictureBox pic in this.Controls.OfType<PictureBox>()){

    }

    pero para esto requieres VS2008 o mejor .net 3.5

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 17 de diciembre de 2010 2:16
  • private void Choque(PictureBox pcbMesa)
            {
                PictureBox otroPB = new PictureBox();
                for (int x = 0; x < myPictureBox.Count; x++)
                {
                    otroPB = (PictureBox)myPictureBox[x];
                    if (pcbMesa.Name != otroPB.Name)
                    {
                        if (pcbMesa.DisplayRectangle.IntersectsWith(otroPB .DisplayRectangle))
                           {
                               //Colisionaron
                               MessageBox.Show("Colisionaron");
                           }
                           else
                           {
                               //No pasó nada
                           }
                    }
                }
            }

     

    Lo estoy haciendo así. Pero resulta que la localización queda en cero. Es decir, X=0, Y=0. Width y Height si tienen valores, pero X y Y las trae con valores 0.

    Estoy perdiendo algo, algún atributo o variable para corregir eso?

    viernes, 17 de diciembre de 2010 2:46
  • se me olvidó indicar que "myPictureBox" es de tipo ArrayList
    viernes, 17 de diciembre de 2010 3:27
  • hola

    pero cuando creas el nuevo PictureBox

    PictureBox otroPB = new PictureBox();

    dodne indicas la localizacion del mismo, osea haces el new y lo trabas pero no asigans el resto de als propeidades del control, si creas solo la instancia este no tiene un lugar donde ubicarse dentro del formulario sino se lo indicas

    luego de crear el array de picturebox, que ahces con estos ? los ubica en un formulario o no ahces nada?

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 17 de diciembre de 2010 3:48
  • Logré hacerlo con esto:

     

    private void EvitarQueChoquen()
            {
                Rectangle myRectangle_A = new Rectangle();
                Rectangle myRectangle_B = new Rectangle();

                myRectangle_A.X = this.pictureBox2.Left;
                myRectangle_A.Y = this.pictureBox2.Top;
                myRectangle_A.Width = this.pictureBox2.Width;
                myRectangle_A.Height = this.pictureBox2.Height;

                myRectangle_B.X = this.pictureBox3.Left;
                myRectangle_B.Y = this.pictureBox3.Top;
                myRectangle_B.Width = this.pictureBox3.Width;
                myRectangle_B.Height = this.pictureBox3.Height;
                if (myRectangle_A.IntersectsWith(myRectangle_B))
                {
                       ////Colisionaron
                       MessageBox.Show("Colisionaron");
                }
                else
               {
                       ////No pasó nada
               }
            }

     

    Lo hice de esa forma. Creando un objeto tipo Rectangle.

    Ahí meto todos los parámetros que le mando a la funcion que me dijistes que usara

    Ahora solo a implementarlo.

     

    Sin embargo, si se puede solucionar lo del problema que te indique, sin tener que utilizar un objeto tipo Rectangle sería mejor. Gracias

     

    viernes, 17 de diciembre de 2010 3:48
  • Esta bien la manera de Daracot solo evitarias codigo en vez de usar esto

    myRectangle_A.X = this.pictureBox2.Left;
    myRectangle_A.Y = this.pictureBox2.Top;
    myRectangle_A.Width = this.pictureBox2.Width;
    myRectangle_A.Height = this.pictureBox2.Height;

    myRectangle_B.X = this.pictureBox3.Left;
    myRectangle_B.Y = this.pictureBox3.Top;
    myRectangle_B.Width = this.pictureBox3.Width;
    myRectangle_B.Height = this.pictureBox3.Height;

     

    simplemente utilizas la propiedad Bound del pictureBox

      myRectangle_A =     pictureBox2.Bounds;

      myRectangle_B = pictureBox3.Bounds;

     

    Saludos; ...  y si tienes varios controles que no quieren que se choquen, los guardas en una List<Rectangle> y luego los recorres mediante tu metodo =D

    jueves, 19 de mayo de 2011 21:17