elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Mostrar menú al hacer clic en un listview
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Mostrar menú al hacer clic en un listview  (Leído 4,127 veces)
.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
Mostrar menú al hacer clic en un listview
« en: 12 Mayo 2013, 22:20 pm »

cómo al hacer clic en un item de listview podría visualizar un menú despegable?

Gracias y saludos


En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
Danyfirex


Desconectado Desconectado

Mensajes: 493


My Dear Mizuho


Ver Perfil
Re: Mostrar menú al hacer clic en un listview
« Respuesta #1 en: 12 Mayo 2013, 23:40 pm »

hola.
creo que este tema te ayudara.

http://foro.elhacker.net/asm/gui_y_eventos-t385648.0.html

saludos


En línea

.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
Re: Mostrar menú al hacer clic en un listview
« Respuesta #2 en: 13 Mayo 2013, 01:18 am »

Muchas gracias por la información, pero más bien el problema es mostrar el menú despegable o context menu (creo que así se llama), ya que logro detectar el doble clic, solo que me gustaría mostrar un menú al momento de hacer los dos clic aquí el código:

(Codigo poco limpio y consistente)

Código
  1. TITLE  listview
  2.  
  3. .386
  4. option casemap:none
  5. .model flat,stdcall
  6. include c:\masm32\include\windows.inc
  7. include c:\masm32\include\kernel32.inc
  8. include c:\masm32\include\user32.inc
  9. include c:\masm32\include\comctl32.inc
  10.  
  11. includelib c:\masm32\lib\kernel32.lib
  12. includelib c:\masm32\lib\user32.lib
  13. includelib c:\masm32\lib\comctl32.lib
  14.  
  15. DlgProc PROTO,
  16. hWnd:HWND,
  17. uMsg:UINT,
  18. wParam:WPARAM,
  19. lParam:LPARAM
  20.  
  21. .const
  22. IDC_LSV1 equ 1001
  23. IDC_BTN1 equ 1002
  24. M1 equ 1003
  25. .data
  26. DlgName byte "Hola",0
  27. Heading1 byte "Test1",0
  28. Heading2 byte "Test2",0
  29.  
  30. .data?
  31. hInstance HINSTANCE ?
  32. CommandLine LPSTR ?
  33. hlsv HANDLE ?
  34. fila DWORD 0
  35.  
  36. .code
  37. ShowOption proc
  38. invoke SendMessage,hlsv,LVM_GETNEXTITEM,-1,LVNI_FOCUSED
  39. ; aquí obteniendo el item del listview me gustaría que se mostrara un MENU EMERGENTE
  40. ;invoke SendMessage,hlsv,LVM_DELETEITEM,eax,0
  41. ret
  42. ShowOption endp
  43.  
  44. InsertColumn proc,
  45. hWnd:HWND
  46. LOCAL lvc:LV_COLUMN
  47. mov lvc.imask,LVCF_TEXT+LVCF_WIDTH
  48. mov lvc.pszText,offset Heading1
  49. mov lvc.lx,150
  50. invoke SendMessage,hWnd, LVM_INSERTCOLUMN,0,addr lvc
  51.  
  52. or lvc.imask,LVCF_FMT
  53. mov lvc.fmt,LVCFMT_RIGHT
  54. mov lvc.pszText,offset Heading2
  55. mov lvc.lx,100
  56. invoke SendMessage,hWnd, LVM_INSERTCOLUMN, 1 ,addr lvc
  57. ret
  58. InsertColumn endp
  59.  
  60. InsertItem proc
  61. LOCAL lvi:LV_ITEM
  62. mov lvi.imask,LVIF_TEXT+LVIF_PARAM
  63.  
  64. push fila
  65. pop lvi.iItem
  66.  
  67. mov lvi.iSubItem,0
  68. mov lvi.pszText,offset Heading1
  69.  
  70. push fila
  71. pop lvi.lParam
  72.  
  73.  
  74.  
  75. invoke SendMessage,hlsv, LVM_INSERTITEM,0, addr lvi
  76. mov lvi.imask,LVIF_TEXT
  77. inc lvi.iSubItem
  78. mov lvi.pszText,offset Heading2
  79. invoke SendMessage,hlsv,LVM_SETITEM, 0,addr lvi
  80. inc Heading2
  81. push eax
  82. push eax
  83. ret
  84. InsertItem endp
  85.  
  86. start:
  87. invoke GetModuleHandle,NULL
  88. mov hInstance,eax
  89. invoke GetCommandLine
  90. mov CommandLine,eax
  91. invoke DialogBoxParam,hInstance,ADDR DlgName,NULL,ADDR DlgProc,NULL
  92. invoke ExitProcess,eax
  93. DlgProc PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
  94. .IF uMsg == WM_INITDIALOG
  95. invoke InitCommonControls
  96. invoke GetDlgItem,hWnd,IDC_LSV1
  97. mov hlsv,eax
  98. invoke InsertColumn,eax
  99.  
  100.  
  101.  
  102. ; invoke GetDlgItem,hWnd,IDC_FOCUS
  103. ; invoke SetFocus,eax
  104. .ELSEIF uMsg == WM_COMMAND
  105. mov eax,wParam
  106. mov edx,wParam
  107. shr edx,16
  108. .if dx==BN_CLICKED
  109. .if ax==IDC_BTN1
  110. invoke InsertItem
  111. .endif
  112. .endif
  113. .ELSEIF uMsg == WM_CLOSE
  114. invoke EndDialog,hWnd,NULL
  115. .ELSEIF uMsg==WM_NOTIFY
  116. push edi
  117. mov edi,lParam
  118. assume edi:ptr NMHDR
  119. mov eax,[edi].hwndFrom
  120. .if eax==hlsv
  121. .if [edi].code==NM_DBLCLK
  122. invoke ShowOption
  123. .endif
  124. .endif
  125. .ELSE
  126. mov eax,FALSE
  127. ret
  128. .ENDIF
  129. mov eax,TRUE
  130. ret
  131. DlgProc ENDP
  132. END start

Gracias y saludos
En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.471


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Mostrar menú al hacer clic en un listview
« Respuesta #3 en: 13 Mayo 2013, 02:10 am »

Con TrackPopupMenu muestras un menú desplegable en cualquier lado: http://msdn.microsoft.com/en-us/library/windows/desktop/ms648002(v=vs.85).aspx
En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
Re: Mostrar menú al hacer clic en un listview
« Respuesta #4 en: 13 Mayo 2013, 02:31 am »

Muchas gracias MCKSys Argentina, algo había encontrado por la Internet, pero me está dando problemas, mira el siguiente código, sospecho que el problema radica en los HANDLER'S:

Código
  1. TITLE  listview
  2.  
  3. .386
  4. option casemap:none
  5. .model flat,stdcall
  6. include c:\masm32\include\windows.inc
  7. include c:\masm32\include\kernel32.inc
  8. include c:\masm32\include\user32.inc
  9. include c:\masm32\include\comctl32.inc
  10.  
  11. includelib c:\masm32\lib\kernel32.lib
  12. includelib c:\masm32\lib\user32.lib
  13. includelib c:\masm32\lib\comctl32.lib
  14.  
  15. DlgProc PROTO,
  16. hWnd:HWND,
  17. uMsg:UINT,
  18. wParam:WPARAM,
  19. lParam:LPARAM
  20.  
  21. .const
  22. IDC_LSV1 equ 1001
  23. IDC_BTN1 equ 1002
  24. M1 equ 1003
  25.  
  26. IDR_MENU1 equ 10000
  27. IDM_Hola2 equ 10002
  28. IDM_HOLA equ 10001
  29.  
  30. .data
  31. DlgName byte "Hola",0
  32. Heading1 byte "Test1",0
  33. Heading2 byte "Test2",0
  34.  
  35. .data?
  36. hInstance HINSTANCE ?
  37. CommandLine LPSTR ?
  38. hlsv HANDLE ?
  39. fila DWORD 0
  40. hMenu HMENU ?
  41. hPopupMenu HMENU ?
  42. pt POINT <>
  43.  
  44. .code
  45. ShowOption proc,
  46. hWnd:HWND
  47. invoke SendMessage,hlsv,LVM_GETNEXTITEM,-1,LVNI_FOCUSED
  48.  
  49. invoke LoadMenu,NULL,IDR_MENU1
  50. mov hMenu,eax
  51.  
  52. invoke GetSubMenu,hMenu,0
  53. mov hPopupMenu,eax
  54.  
  55. invoke SetMenuDefaultItem,hPopupMenu,-1,TRUE
  56. invoke GetCursorPos,addr pt
  57.  
  58. invoke SetForegroundWindow,hWnd
  59. invoke TrackPopupMenu,hPopupMenu,TPM_LEFTALIGN,pt.x,pt.y,0,hWnd,NULL
  60. invoke SetForegroundWindow,hWnd
  61. invoke DestroyMenu,hPopupMenu
  62. invoke DestroyMenu,hMenu
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71. ;invoke SendMessage,hlsv,LVM_DELETEITEM,eax,0
  72. ret
  73. ShowOption endp
  74.  
  75. InsertColumn proc,
  76. hWnd:HWND
  77. LOCAL lvc:LV_COLUMN
  78. mov lvc.imask,LVCF_TEXT+LVCF_WIDTH
  79. mov lvc.pszText,offset Heading1
  80. mov lvc.lx,150
  81. invoke SendMessage,hWnd, LVM_INSERTCOLUMN,0,addr lvc
  82.  
  83. or lvc.imask,LVCF_FMT
  84. mov lvc.fmt,LVCFMT_RIGHT
  85. mov lvc.pszText,offset Heading2
  86. mov lvc.lx,100
  87. invoke SendMessage,hWnd, LVM_INSERTCOLUMN, 1 ,addr lvc
  88. ret
  89. InsertColumn endp
  90.  
  91. InsertItem proc
  92. LOCAL lvi:LV_ITEM
  93. mov lvi.imask,LVIF_TEXT+LVIF_PARAM
  94.  
  95. push fila
  96. pop lvi.iItem
  97.  
  98. mov lvi.iSubItem,0
  99. mov lvi.pszText,offset Heading1
  100.  
  101. push fila
  102. pop lvi.lParam
  103.  
  104.  
  105.  
  106. invoke SendMessage,hlsv, LVM_INSERTITEM,0, addr lvi
  107. mov lvi.imask,LVIF_TEXT
  108. inc lvi.iSubItem
  109. mov lvi.pszText,offset Heading2
  110. invoke SendMessage,hlsv,LVM_SETITEM, 0,addr lvi
  111. inc Heading2
  112. push eax
  113. push eax
  114. ret
  115. InsertItem endp
  116.  
  117. start:
  118. invoke GetModuleHandle,NULL
  119. mov hInstance,eax
  120. invoke GetCommandLine
  121. mov CommandLine,eax
  122. invoke DialogBoxParam,hInstance,ADDR DlgName,NULL,ADDR DlgProc,NULL
  123. invoke ExitProcess,eax
  124. DlgProc PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
  125. .IF uMsg == WM_INITDIALOG
  126. invoke InitCommonControls
  127. invoke GetDlgItem,hWnd,IDC_LSV1
  128. mov hlsv,eax
  129. invoke InsertColumn,eax
  130.  
  131.  
  132.  
  133. ; invoke GetDlgItem,hWnd,IDC_FOCUS
  134. ; invoke SetFocus,eax
  135. .ELSEIF uMsg == WM_COMMAND
  136. mov eax,wParam
  137. mov edx,wParam
  138. shr edx,16
  139. .if dx==BN_CLICKED
  140. .if ax==IDC_BTN1
  141. invoke InsertItem
  142. .endif
  143. .endif
  144. .ELSEIF uMsg == WM_CLOSE
  145. invoke EndDialog,hWnd,NULL
  146. .ELSEIF uMsg==WM_NOTIFY
  147. push edi
  148. mov edi,lParam
  149. assume edi:ptr NMHDR
  150. mov eax,[edi].hwndFrom
  151. .if eax==hlsv
  152. .if [edi].code==NM_DBLCLK
  153. invoke ShowOption,hWnd
  154. .endif
  155. .endif
  156. .ELSE
  157. mov eax,FALSE
  158. ret
  159. .ENDIF
  160. mov eax,TRUE
  161. ret
  162. DlgProc ENDP
  163. END start

Código
  1. IDR_MENU1 MENU
  2. BEGIN
  3.  MENUITEM "Hola1",IDM_HOLA1
  4.  MENUITEM "Hola2",IDM_HOLA2
  5. END

Modificando hMenuPopup por hMenu en la API:
- SetMenuDefaultItem
- TrackPopupMenu

Me muestra un menú despegable pero muy pequeño, como una barra rectangular
¿A que se debe ese problema?, saludos
Saludos
En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
.:UND3R:.
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.118


Ingeniería inversa / MASM


Ver Perfil WWW
Re: Mostrar menú al hacer clic en un listview
« Respuesta #5 en: 13 Mayo 2013, 03:27 am »

Lo he solucionado de la siguiente forma:

Código
  1. invoke CreatePopupMenu
  2. mov hPopupMenu,eax
  3.  
  4. invoke AppendMenu,hPopupMenu,MF_STRING,IDM_HOLA2,addr Heading1
  5. invoke AppendMenu,hPopupMenu,MF_STRING,IDM_HOLA,addr Heading2
  6.  
  7. invoke SetMenuDefaultItem,hPopupMenu,-1,TRUE
  8. invoke GetCursorPos,addr pt
  9.  
  10. invoke SetForegroundWindow,hWnd
  11. invoke TrackPopupMenu,hPopupMenu,TPM_LEFTALIGN,pt.x,pt.y,0,hWnd,NULL
  12. invoke SetForegroundWindow,hWnd
  13. invoke DestroyMenu,hPopupMenu


Aun así, sería ideal que se pudiera crear los menú en el resource, saludos
En línea


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines