Principales respuestas
Evento ProcessCmdKey alterna el foco de los UserControl

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:
Saludosprivate void pictureBox_MouseUp(object sender, MouseEventArgs e) { if (this.MouseUp != null) this.MouseUp(this, e); }
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- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 22 de septiembre de 2010 15:27
- Marcado como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator lunes, 4 de octubre de 2010 18:40
-
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- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 22 de septiembre de 2010 15:27
- Marcado como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator lunes, 4 de octubre de 2010 18:40
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- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 22 de septiembre de 2010 15:27
- Marcado como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator lunes, 4 de octubre de 2010 18:40
-
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- Propuesto como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator miércoles, 22 de septiembre de 2010 15:27
- Marcado como respuesta Juan Carlos Ruiz PachecoMicrosoft employee, Moderator lunes, 4 de octubre de 2010 18:40