2012-02-14 16 views
6

Estoy tratando de modelar el comportamiento de un menú desplegable de ComboBox (u otras listas desplegables, incluidos los menús contextuales) donde el menú desplegable se cierra cuando hace clic en cualquier otro lugar, incluso en algo que no se puede enfocar.¿Cómo captura un mouse de captura ComboBox cuando está desplegado?

He intentado suscribir eventos como MouseCaptureChanged, LostFocus y Leave. Tengo un UserControl personalizado que actúa como un menú desplegable y solo quiero cerrarlo cuando el usuario haga clic en cualquier otro lugar.

Esto parece algo que se hace en muchos controles, así que me sorprendería si no hubiera una forma sencilla de hacerlo.

Hasta ahora los métodos sobrecomplicados que puedo encontrar para hacer esto son usar pinvoke y la función SetCapture(), o crear un MessageFilter. Si estas son las únicas opciones, no estoy seguro de cuál es mejor.

+2

Una manera fácil de poner en práctica un menú desplegable como el control es utilizar un ToolStripControlHost y una ToolStripDropDown. Funciona como un ComboBox. Consulte [¿Cómo aparecen los cuadros combinados, al mostrar elementos de la lista, interceptar los eventos del mouse a cualquier lugar en el formulario para ocultar la lista?] (Http://stackoverflow.com/a/8611382/719186) – LarsTech

+0

Estoy probando el ToolStripControlHost. No puedo deshacerme de un borde feo en la parte superior de la ventana emergente o el parpadeo de ComboBox cada vez que abres el menú desplegable. –

+2

Asegúrese de establecer los márgenes de ToolStripContorlHost y el relleno de ToolStripDropDown en 0. El parpadeo de su control es un problema diferente: ¿está tratando de usar un ComboBox con un menú desplegable personalizado? – LarsTech

Respuesta

1

El ComboBox está construido con 2 controles.

  • Base - visible cuando no está activo (Control)
  • DropDownList - visible durante el modo de edición o el modo de lista de selección (Ventana o el Formulario)

Normalmente la base es visible. Cuando el usuario hace clic en ComboBox, el control Base se oculta y aparece el control DropDownList. Este cambio se realiza en segundo plano, por lo que para el usuario parece que el control simplemente se expandió.

El evento que desea capturar se realiza a través de la ventana DropDownList. Si hace clic en algún lugar de su área de cliente, la ventana DropDownList recibe el evento WM_KILLFOCUS a través de su método WndProc (Mensaje% m). Entonces envía a la ventana padre (el control de la base) un mensaje WM_COMMAND ( OCM_COMMAND) con WPARAM = 526318 ( HIWORD (WPARAM) = 8) y el control de la base sabe que debe ocultar la ventana DropDownList.

Por lo tanto, lo que tiene que hacer es implementar la ventana adicional DropDown y atrapar el evento WM_KILLFOCUS.

0

Las plantillas de los controles que ha mencionado están utilizando para el menú desplegable enumera una ventana emergente como un contenedor con la propiedad StaysOpen establecida en falso (que es el valor predeterminado, creo).

ComboBox template example

Cuestiones relacionadas