2011-08-04 14 views
7

Estoy usando Windows Forms en C#.¿Activar un clic de botón de formulario y proceso al mismo tiempo?

Tengo un formulario principal con un par de barras de herramientas que contienen ToolStripButtons. Después de trabajar con otro formulario que contiene datos, el formulario principal pierde el foco y al hacer clic en una herramienta StripButton no desencadena el evento OnClick: el primer clic activa el formulario principal y solo el segundo clic presiona el botón. Necesito que el usuario haga clic en un botón solo una vez para activar un evento Click, ¿alguna idea sobre cómo hacerlo? Gracias.

Notas:

  • que estaba usando MDI y no había problemas que hacen clic en botones de formulario de los padres. Pero ahora lo más importante es tener formas flotando libremente en múltiples pantallas.
  • Los formularios de trabajador tienen la forma principal como propiedad Propietario, de esta forma permanecen en la parte superior del formulario principal.
  • Cuando hago clic en el botón de un formulario inactivo, ninguno de MouseHover, MouseEnter, MouseDown ni MouseUp se activan. Es solo el evento Activar de la forma principal que dispara.
  • Hay una treeView (dentro de tabControl, dentro de un splitContainer, dentro de un panel), en el formulario principal. Sus elementos se seleccionan con un primer clic del mouse, incluso si el formulario principal está inactivo. ¡Supongo que no todos los controles son iguales!

Respuesta

6

Lo que necesita hacer es crear una clase que herede ToolStrip y maneje el WndProc. Esta es una manera de hacerlo. Hay otros.

private class MyToolStrip : ToolStrip 
{ 
    private const uint WM_LBUTTONDOWN = 0x201; 
    private const uint WM_LBUTTONUP = 0x202; 

    private static bool down = false; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_LBUTTONUP && !down) 
     { 
      m.Msg = (int)WM_LBUTTONDOWN; 
      base.WndProc(ref m); 
      m.Msg = (int)WM_LBUTTONUP; 
     } 

     if (m.Msg == WM_LBUTTONDOWN) down = true; 
     if (m.Msg == WM_LBUTTONUP) down = false; 
     base.WndProc(ref m); 
    } 
} 

También he visto esta solución:

protected override void WndProc(ref Message m) 
{ 
    // WM_MOUSEACTIVATE = 0x21 
    if (m.Msg == WM_MOUSEACTIVATE && this.CanFocus && !this.Focused) 
     this.Focus(); 
    base.WndProc(ref m); 
} 

me encontré con este en el último lugar en el que trabajaba, creo que la solución que se me ocurrió trabajó más como éste, pero Don No tengo acceso al código exacto que utilicé.

+2

estoy usando la segunda solución y funciona muy bien. ¡Gracias! –

+0

Solo una nota, debe ser base.WndProc (ref m); –

+0

Lo siento, lo reconvirtí automáticamente de VB. Lo arreglaré. – dwidel

-4

si tienes Formulario sin fronteras, por lo que esta lógica estaba trabajando para usted construyó en :)

form.FormBorderStyle = FormBorderStyle.None 
+4

Su respuesta no parece tener nada que ver con la pregunta. – LarsTech

Cuestiones relacionadas