Que tal su ayuda por favor. Estoy tratando de hacer un menu contextual dando click con el boton derecho en la cabecera del control listview pero no tengo este evento. Alguien sabe como???.
Gracias de antemano
| |||
Cabecera Listview Que tal su ayuda por favor. Estoy tratando de hacer un menu contextual dando click con el boton derecho en la cabecera del control listview pero no tengo este evento. Alguien sabe como???. Gracias de antemano |
| ||||
![]() Antes que nada. Bienvenido al foro, parboli. Gracias a este código descubrí que podemos interceptar los mensajes del sistema enviados a una ventana: http://www.recursosvisualbasic.com.a...de-ventana.htm Así que en este caso lo único que necesitamos es adaptarlo al encabezado del ListView para que recibamos el mensaje de click con el botón derecho. Coloca este código en un módulo: Código PHP: Código PHP: ![]()
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
Respuesta: Cabecera Listview David probé el código tal como me indicaste,lo adapté a mi aplicación y no logré que apareciera el menú. Corre todo normal pero al hacer el click derecho en la cabecera del listview no produce nada, no aparece el menú. Ayuda por favor |
| ||||
![]() Intenta colocar dentro del Sub RClickEvent() un MsgBox para ver si realmente se está ejecutando el código, o sea, si realmente está interceptando el click con el botón derecho del mouse...
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
Respuesta: Cabecera Listview Eso es lo que pasa, no intercepta el click...he estado depurando intrución por instrucción y cuando hago click con el botón derecho no produce nada, no se ejecuta ningún código |
| ||||
![]() ¿Estás colocando esto en el evento Load del Form?: Código PHP:
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| ||||
![]() Ahí está el problema, debería devolver el hWnd del encabezado del ListView, ¿cuál versión de Microsoft Windows Common Controls estás usando para insertar el ListView? Yo probé ese código usando la versión 5.0... no probé con la versión 6.0.
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
Respuesta: Cabecera Listview Ahí si corrió excelente ![]() ![]() |
| ||||
![]() Sí, puedes trabajar con la versión 6.0. Solo debes cambiar donde dice SysHeader32 por msvb_lib_header. Saludos ![]()
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| ||||
![]() Cita: No sé si eso sea posible, al menos yo no conozco ninguna forma de hacerlo. Pero trataré de investigar un poco más a ver qué sale, pero no te prometo que logre hacerlo...Saludos ![]()
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| ||||
![]() Una forma no tan elegante que se me ocurrió es que al recibir el mensaje WM_RBUTTONDOWN enviemos el mensaje WM_CLICK, entonces lo que sucede es que se producirá el evento ColumnClick del ListView, con lo cual podremos saber en qué columna se produjo el evento.
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
![]() David el Grande creo que estaría bien, yo a través de una variable podría identificar cuando es de uno uno o del otro y operaria en distinta forma cuando se produsca el evento ColumnClick. Pero por favor indicane donde es que debería modificar, donde pongo para enviar el mensaje WM_CLICK,no soy bueno en eso. Gracias |
| ||||
![]() Lo siento, pero ahora mismo no podré ponerte el código. Y es que estoy sin Visual Basic, pero investiga sobre la API (SendMessage) y la constante WM_CLICK, seguro que encuentras algo. Saludos ![]()
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
Respuesta: Cabecera Listview hola fijate de este modo
Código:
Saludos Option Explicit Public Type POINTAPI x As Long y As Long End Type Private Type HD_HITTESTINFO pt As POINTAPI flags As Long iItem As Long End Type Private Type TLoHiLong Lo As Integer Hi As Integer End Type Private Type TAllLong All As Long End Type Private Const HDM_HITTEST As Long = &H1206 Private Const LVM_FIRST = &H1000 Private Const LVM_GETHEADER As Long = (LVM_FIRST + 31) Private Const WM_LBUTTONUP As Long = &H202 Private Const WM_RBUTTONUP As Long = &H205 Private Const GWL_WNDPROC = (-4) Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long Dim PrevProc As Long Public Sub HookListView(hwnd As Long) Dim HandleHEADER As Long HandleHEADER = SendMessage(hwnd, LVM_GETHEADER, 0, 0) PrevProc = SetWindowLong(HandleHEADER, GWL_WNDPROC, AddressOf WindowProc) End Sub Public Sub UnHookListView(hwnd As Long) Dim HandleHEADER As Long HandleHEADER = SendMessage(hwnd, LVM_GETHEADER, 0, 0) SetWindowLong HandleHEADER, GWL_WNDPROC, PrevProc End Sub Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam) Dim hti As HD_HITTESTINFO Dim mLH As TLoHiLong, mAL As TAllLong If uMsg = WM_LBUTTONUP Or uMsg = WM_RBUTTONUP Then mAL.All = lParam LSet mLH = mAL hti.pt.x = mLH.Lo hti.pt.y = mLH.Hi SendMessage hwnd, HDM_HITTEST, 0&, hti If hti.iItem > -1 Then Select Case uMsg Case WM_LBUTTONUP: EnventLeftButtonUp hti.iItem + 1 Case WM_RBUTTONUP: EnventRightButtonUp hti.iItem + 1 End Select End If End If End Function 'aca lo que queres Private Sub EnventLeftButtonUp(ByVal Columna As Long) Debug.Print Columna 'Form1.PopupMenu Form1.archivo End Sub 'aca lo que queres Private Sub EnventRightButtonUp(ByVal Columna As Long) Debug.Print Columna End Sub |
| ||||
![]() Excelente solución LeandroA. ![]() P.S.: Para hacer como te comenté, tenemos dos opciones, enviar no WM_CLICK sino WM_LBUTTONDOWN y WM_LBUTTONDOWN con lo que decimos a la ventana que se ha pulsado y soltado el botón izquierdo del mouse. O también podemos simular un click usando mouse_event...
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |