Pregunta

Tengo una aplicación de VB6. Hay un formulario principal. Contiene un control de usuario. Este control de usuario tiene un control de botón. Cuando hago clic en el botón, quiero un menú pop-up modo que la parte superior izquierda del menú es justo debajo de la parte inferior izquierda del botón.

si lo hago:

frm.PopupMenu mnuBlah

del menú aparece donde está el ratón.

si intento de proporcionar las coordenadas

frm.PopupMenu mnuBlah, btn.Left, btn.Top + btn.Height

la matemáticas salga totalmente equivocado y el menú se visualiza camino desviado.

No estoy muy seguro de qué tipo de coordenadas de la llamada PopupMenu requiere y cómo calcular la posición debajo del botón.

¿Fue útil?

Solución

PopupMenu quiere coordenadas X e Y en el ScaleMode del formulario en el que se apareció el menú. En este caso, que probablemente significa que el control de usuario.

Pero realmente depende de dónde se está manejando el evento MouseDown. (No es obtener coordenadas con el evento Click.) Si el controlador de eventos se encuentra en el propio control de usuario, entonces no debería tener ningún problema usando las coordenadas suministradas. Sin embargo, el código que envió falta el parámetro Banderas (debe ser vbPopupMenuLeftAlign ), lo que podría explicar por qué su coordenada matemáticas no está funcionando. Además, usted tiene que definir el menú como una propiedad del propio control de usuario.

Por otro lado, si se eleva el evento MouseDown del control de usuario y maneja de la forma que contiene, el menú emergente tiene que ser una propiedad del formulario que contiene. En este caso, puede ignorar los parámetros x e Y, pero hay que hacer cálculos de coordenadas a sí mismo. El borde izquierdo del botón, en relación con la forma principal, será la suma del borde izquierdo del control de usuario y el desplazamiento del botón en el control. matemáticas parecido funcionará para calcular el borde inferior del botón. En otras palabras:

Private Sub UserControl1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    PopupMenu mnuPopup, vbPopupMenuLeftAlign, _
        UserControl1.Left + UserControl1.Button.Left, _
        UserControl1.Top + UserControl1.Button.Top + UserControl1.Button.Height
End Sub

Tenga en cuenta que esto requerirá que también expone el botón (Button) como una propiedad del control de usuario para que pueda acceder a sus propiedades izquierda, arriba, y la altura. Eso es bastante fácil:

Public Property Get Button() As CommandButton
    Set Button = Command1
End Property

provocar el evento es bastante simple también; sólo hay que poner

Public Event MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

en la parte superior del control de usuario, a continuación, utilizar este:

RaiseEvent MouseDown(Button, Shift, X, Y)

en el evento MouseDown del botón en el control de usuario.

Por último, para cablear el controlador de eventos en el formulario principal, utilice los dos menús desplegables en la parte superior de la ventana de edición de código. Seleccione el control de usuario desde el otro a la izquierda, a continuación, seleccione el evento MouseDown de la uno a la derecha. Esto insertará el controlador de eventos, que se llena con el código de seguridad.

En cuanto a qué camino es mejor, el manejo del menú dentro del propio control de usuario, y el aumento de eventos significativos cuando uno se selecciona mantiene las cosas separadas. El control de usuario se encarga de la interfaz de usuario de trabajo, dejando la aplicación principal para manejar lo que hay que hacer en respuesta a la selección del usuario, sin tener que preocuparse acerca de la colocación del menú.

Por lo que no sería en realidad provocar el evento MouseDown; más bien que le provoca eventos como OptionOneSelected, OptionTwoSelected o OptionThreeSelected. (Nombres más significativos serían mucho mejor, por supuesto.)

De todos modos, espero que esto no es demasiado tarde para ser útil ...

Otros consejos

Es necesario pasar el indicador vbPopupMenuLeftAlign al método PopupMenu. Tenga en cuenta, esto contradice la documentación sobre el método PopupMenu (Microsoft podría en realidad haber cometido un error?), Pero funciona.

frm.PopupMenu mnuBlah, vbPopupMenuLeftAlign, btn.Left, btn.Top + btn.Height

Es necesario incluir los valores de altura y de izquierda para el contenedor primario (esto es por lo general la forma, pero también podría ser un marco, o algún otro recipiente).

Creo que usted está buscando algo como esto:

btn.Parent.PopupMenu mnuBlah, vbPopupMenuLeftAlign , btn.Left, btn.Top + btn.Height
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top