none
Evento ProcessCmdKey alterna el foco de los UserControl RRS feed

  • Pregunta

  • Hola, tengo en un form el siguiente método para capturar la pulsación de las teclas de dirección:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
          if ((keyData != Keys.Up && keyData != Keys.Down && keyData != Keys.Left && keyData != Keys.Right && keyData != Keys.Delete && keyData != Keys.Back))
            return base.ProcessCmdKey(ref msg, keyData);
    
          //Control que actualmente tiene el foco
          Control ctrl = this.ActiveControl;
    
          if (!(ctrl is PictogramaBox))
            return base.ProcessCmdKey(ref msg, keyData);
          else
          {
            PictogramaBox pict = (PictogramaBox)ctrl;
            
              switch (keyData)
              {
                case Keys.Up: // up 
                  if ((pict.Top - 5) > 25)
                    pict.Top -= 5;
                  else
                    pict.Top = 20;
                  break;
                case Keys.Left: // Left
                  if ((pict.Left - 5) > 20)
                    pict.Left -= 5;
                  else
                    pict.Left = 20;
                  break;
                case Keys.Right: // right
                  if ((pict.Left + pict.Width + 5) < (panelPictogramas.Width - 20))
                    pict.Left += 5;
                  else
                    pict.Left = panelPictogramas.Width - pict.Width - 20;
                  break;
                case Keys.Down: // down
                  if ((pict.Top + pict.Height + 5) < (panelPictogramas.Height - 25))
                    pict.Top += 5;
                  else
                    pict.Top = panelPictogramas.Height - pict.Height - 20;
                  break;
                case Keys.Delete:
                  ((FormPadre)this.ParentForm).btnBorrar.PerformClick();
                  break;
                case Keys.Back:
                  ((FormPadre)this.ParentForm).btnBorrar.PerformClick();
                  break;
              }
            }
          
          return base.ProcessCmdKey(ref msg, keyData);
        }
    

    Lo que mueve es un UserControl, pero si hay mas de 1 y se presiona continuamente la tecla o varias veces seguidas, se empiezan a mover todos los UserControl. He hecho pruebas con el debbuger y he descubierto que sin venir a cuento se pasan el foco de un UserControl a otro. Y no veo en ningún lugar del codigo q haga eso.

    Entonces, me pregunto si este método también hay q hacerlo internamente en el UserControl diseñado para que lo capture de dentro hacia afuera, de ser asi, como seria???

    al igual que para que el UserControl capturase el evento MouseUp era:

    private void pictureBox_MouseUp(object sender, MouseEventArgs e)
        {
          if (this.MouseUp != null)
            this.MouseUp(this, e);
        }
    
    Saludos

    miércoles, 22 de septiembre de 2010 3:08

Respuestas


  • una sugerencia en lugar de usar el this.ActiveControl;

    que veo te esta dando muchos problemas porque ante determinadas accioens no te responde como deberia

    porque no implementas tu propio control del foco

    o sea en una variable provada global al formulario guardas la instancia del control que se pulsa, o activa

    entonces cuando mueves o accioas alguna tecla, lo que encesites, no tomes el Activecontrol, toma el valor d esta variable

    si luego se pulsa en otro control, reemplazas este en la varialbe y ahora el activo sera otro

    podrias hacer que el control devuelva un evento Activate que tu crees, cuando se lo rpesiones, o sea cuando se pulse con el mouse tanto el user control, el picturebox o el label y en este evento envias el control que lo lanza, para dejar registro en esta variable privada y global al form cual es activa

    por supuesto este codigo de movimiento imagino esta puesto en el formulario

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 22 de septiembre de 2010 3:49
  • MMmmmm...

    Teoricamente si en ProcessCmdKey tratas la tecla, debes devolver true. Si no la tecla sigue siendo procesada por winforms.

    Prueba a añadir un return true despues de cada case.

    Un saludo y ya me contarás.


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
    miércoles, 22 de septiembre de 2010 7:24
    Moderador

Todas las respuestas


  • una sugerencia en lugar de usar el this.ActiveControl;

    que veo te esta dando muchos problemas porque ante determinadas accioens no te responde como deberia

    porque no implementas tu propio control del foco

    o sea en una variable provada global al formulario guardas la instancia del control que se pulsa, o activa

    entonces cuando mueves o accioas alguna tecla, lo que encesites, no tomes el Activecontrol, toma el valor d esta variable

    si luego se pulsa en otro control, reemplazas este en la varialbe y ahora el activo sera otro

    podrias hacer que el control devuelva un evento Activate que tu crees, cuando se lo rpesiones, o sea cuando se pulse con el mouse tanto el user control, el picturebox o el label y en este evento envias el control que lo lanza, para dejar registro en esta variable privada y global al form cual es activa

    por supuesto este codigo de movimiento imagino esta puesto en el formulario

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 22 de septiembre de 2010 3:49
  • MMmmmm...

    Teoricamente si en ProcessCmdKey tratas la tecla, debes devolver true. Si no la tecla sigue siendo procesada por winforms.

    Prueba a añadir un return true despues de cada case.

    Un saludo y ya me contarás.


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis
    miércoles, 22 de septiembre de 2010 7:24
    Moderador