Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Aporte: Crear PopupMenu por API Facilísimo

Estas en el tema de Aporte: Crear PopupMenu por API Facilísimo en el foro de Visual Basic clásico en Foros del Web. Para no repetirme os dejo en enlace a un post que he dejado en otro foro por si a alguien de este le sirve de ...
  #1 (permalink)  
Antiguo 27/03/2010, 10:25
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Aporte: Crear PopupMenu por API Facilísimo

Para no repetirme os dejo en enlace a un post que he dejado en otro foro por si a alguien de este le sirve de ayuda.

PopupMenu Superfacil
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #2 (permalink)  
Antiguo 27/03/2010, 17:47
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 8 meses
Puntos: 29
Respuesta: Aporte: Crear PopupMenu por API Facilísimo

Muy fácil de usar y seguramente muy útil para más de uno. Se agradece la info.

Un saludo.
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #3 (permalink)  
Antiguo 27/08/2010, 16:45
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Aporte: Crear PopupMenu por API Facilísimo

Esta es una mejora al PopUpMenu que considero muy importante, por tanto aqui os dejo todo el código y el ejemplo.

Código para pegar en un Modulo

Código vb:
Ver original
  1. Option Explicit
  2.  
  3. Private Type POINTAPI
  4.   X As Long
  5.   Y As Long
  6. End Type
  7.    
  8. Private Declare Function CreatePopupMenu Lib "User32" () As Long
  9. Private Declare Function DestroyMenu Lib "User32" (ByVal hMenu&) As Long
  10. Private Declare Function AppendMenu Lib "User32" Alias "AppendMenuA" (ByVal hMenu&, ByVal wFlags&, ByVal wIDNewItem&, ByVal lpNewItem$) As Long
  11. Private Declare Function TrackPopupMenu Lib "User32" (ByVal hMenu&, ByVal wFlags&, ByVal X&, ByVal Y&, ByVal nReserved&, ByVal Hwnd&, ByVal lpRect&) As Long
  12. Private Declare Sub GetCursorPos Lib "User32" (lpPoint As POINTAPI)
  13.  
  14.  
  15. Public Function ElegirMenu(Hwnd As Long, MiMenu As String, Optional Numero As Boolean = False) As String
  16.   Dim HwMenus(25) As Long, HwMenu As Integer
  17.   Dim Menus() As String, SubMenus() As String, Elemento As Integer, Linea As Integer
  18.   Dim Valor As Long
  19.   Dim Titulos(1000) As String
  20.   HwMenus(0) = CreatePopupMenu()
  21.   Menus() = Split(MiMenu, "/")
  22.   For Elemento = 0 To UBound(Menus)
  23.     Valor = Valor + 1
  24.     If InStr(Menus(Elemento), ";") Then
  25.       ' Es un SubMenu
  26.      SubMenus() = Split(Menus(Elemento), ";")
  27.       HwMenu = HwMenu + 1
  28.       HwMenus(HwMenu) = CreatePopupMenu()
  29.       For Linea = 1 To UBound(SubMenus)
  30.         Call CrearItemMenu(HwMenus(HwMenu), SubMenus(Linea), CLng(100 * HwMenu + Linea))
  31.         Titulos(100 * HwMenu + Linea) = SubMenus(0) & SubMenus(Linea)
  32.       Next
  33.       If Left$(SubMenus(0), 1) = "#" Then
  34.         Call AppendMenu(HwMenus(0), &H0& Or &H10& Or &H1&, HwMenus(HwMenu), ByVal Mid$(SubMenus(0), 2))
  35.       Else
  36.         Call AppendMenu(HwMenus(0), &H0& Or &H10&, HwMenus(HwMenu), ByVal SubMenus(0))
  37.       End If
  38.     ElseIf Menus(Elemento) = "-" Then
  39.       Call CrearItemMenu(HwMenus(0), Menus(Elemento), 999)
  40.     Else
  41.       Call CrearItemMenu(HwMenus(0), Menus(Elemento), Valor)
  42.       Titulos(Valor) = Menus(Elemento)
  43.     End If
  44.   Next
  45.   Dim Donde As POINTAPI
  46.   GetCursorPos Donde
  47.   Valor = TrackPopupMenu(HwMenus(0), &H100&, Donde.X, Donde.Y, 0&, Hwnd, 0&)
  48.   If Numero Then
  49.     ElegirMenu = Trim$(Str$(Valor))
  50.   Else
  51.     ElegirMenu = Titulos(Valor)
  52.   End If
  53.   For Linea = 0 To HwMenu
  54.     DestroyMenu HwMenus(Linea)
  55.   Next
  56. End Function
  57.  
  58. Private Sub CrearItemMenu(HWndMenu As Long, Texto As String, Valor As Long)
  59.   ' Crea en el Menu indicado el Item. Controlando diversas opciones del mismo.
  60.  If Texto = "-" Then
  61.     Call AppendMenu(HWndMenu, &H0& Or &H800&, 999&, ByVal vbNullString)
  62.   Else
  63.     If Left$(Texto, 1) = "'" Then
  64.       Texto = Mid$(Texto, 2)
  65.       Call AppendMenu(HWndMenu, &H0& Or &H8&, Valor, ByVal Texto)
  66.     ElseIf Left$(Texto, 1) = "#" Then
  67.       Texto = Mid$(Texto, 2)
  68.       Call AppendMenu(HWndMenu, &H0& Or &H1&, Valor, ByVal Texto)
  69.     Else
  70.       Call AppendMenu(HWndMenu, &H0&, Valor, ByVal Texto)
  71.     End If
  72.   End If
  73. End Sub

Para probar su funcionamiento, simplemente basta con pegar este código en un Formulario.

Código vb:
Ver original
  1. Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  2. If Button = vbRightButton Then
  3.   MsgBox ElegirMenu(Me.Hwnd, "Leer/-/#Editar;Copiar;'Pegar;Cortar/Grabar/Color;Verde;Rojo;#Azul/'Salir")
  4. End If
  5. End Sub


Como veis su uso no puede ser mas simple:

Las barras / separan los Elementos del Menu, un elemento puede estar Bloqueado si indicamos # delante del mismo o Seleccionado si indicamos apostrofe ' delante de éste Además un elemento de menú puede ser un SubMenu si contiene elementos separados por punto y coma ;

En el ejemplo estan todas las posibilidades:
"Leer/-/#Editar;Copiar;'Pegar;Cortar/Grabar/Color;Verde;Rojo;#Azul/'Salir"

No obstante cualquier duda comentad.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...

Etiquetas: api, aportes
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:27.