Test Foro de elhacker.net SMF 2.1

Programación => Programación General => ASM => Mensaje iniciado por: .:UND3R:. en 12 Mayo 2013, 22:20 PM

Título: Mostrar menú al hacer clic en un listview
Publicado por: .:UND3R:. 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
Título: Re: Mostrar menú al hacer clic en un listview
Publicado por: Danyfirex 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
Título: Re: Mostrar menú al hacer clic en un listview
Publicado por: .:UND3R:. 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 (asm) [Seleccionar]
TITLE  listview

.386
option casemap:none
.model flat,stdcall
include c:\masm32\include\windows.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\comctl32.inc

includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\comctl32.lib

DlgProc PROTO,
hWnd:HWND,
uMsg:UINT,
wParam:WPARAM,
lParam:LPARAM

.const
IDC_LSV1 equ 1001
IDC_BTN1 equ 1002
M1 equ 1003
.data
DlgName byte "Hola",0
Heading1 byte "Test1",0
Heading2 byte "Test2",0

.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hlsv HANDLE ?
fila DWORD 0

.code
ShowOption proc
invoke SendMessage,hlsv,LVM_GETNEXTITEM,-1,LVNI_FOCUSED
; aquí obteniendo el item del listview me gustaría que se mostrara un MENU EMERGENTE
;invoke SendMessage,hlsv,LVM_DELETEITEM,eax,0
ret
ShowOption endp

InsertColumn proc,
hWnd:HWND
LOCAL lvc:LV_COLUMN
mov lvc.imask,LVCF_TEXT+LVCF_WIDTH
mov lvc.pszText,offset Heading1
mov lvc.lx,150
invoke SendMessage,hWnd, LVM_INSERTCOLUMN,0,addr lvc

or lvc.imask,LVCF_FMT
mov lvc.fmt,LVCFMT_RIGHT
mov lvc.pszText,offset Heading2
mov lvc.lx,100
invoke SendMessage,hWnd, LVM_INSERTCOLUMN, 1 ,addr lvc
ret
InsertColumn endp

InsertItem proc
LOCAL lvi:LV_ITEM
mov lvi.imask,LVIF_TEXT+LVIF_PARAM

push fila
pop lvi.iItem

mov lvi.iSubItem,0
mov lvi.pszText,offset Heading1

push fila
pop lvi.lParam



invoke SendMessage,hlsv, LVM_INSERTITEM,0, addr lvi
mov lvi.imask,LVIF_TEXT
inc lvi.iSubItem
mov lvi.pszText,offset Heading2
invoke SendMessage,hlsv,LVM_SETITEM, 0,addr lvi
inc Heading2
push eax
push eax
ret
InsertItem endp

start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke DialogBoxParam,hInstance,ADDR DlgName,NULL,ADDR DlgProc,NULL
invoke ExitProcess,eax
DlgProc PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IF uMsg == WM_INITDIALOG
invoke InitCommonControls
invoke GetDlgItem,hWnd,IDC_LSV1
mov hlsv,eax
invoke InsertColumn,eax



; invoke GetDlgItem,hWnd,IDC_FOCUS
; invoke SetFocus,eax
.ELSEIF uMsg == WM_COMMAND
mov eax,wParam
mov edx,wParam
shr edx,16
.if dx==BN_CLICKED
.if ax==IDC_BTN1
invoke InsertItem
.endif
.endif
.ELSEIF uMsg == WM_CLOSE
invoke EndDialog,hWnd,NULL
.ELSEIF uMsg==WM_NOTIFY
push edi
mov edi,lParam
assume edi:ptr NMHDR
mov eax,[edi].hwndFrom
.if eax==hlsv
.if [edi].code==NM_DBLCLK
invoke ShowOption
.endif
.endif
.ELSE
mov eax,FALSE
ret
.ENDIF
mov eax,TRUE
ret
DlgProc ENDP
END start


Gracias y saludos
Título: Re: Mostrar menú al hacer clic en un listview
Publicado por: MCKSys Argentina 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 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms648002(v=vs.85).aspx)
Título: Re: Mostrar menú al hacer clic en un listview
Publicado por: .:UND3R:. 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 (asm) [Seleccionar]
TITLE  listview

.386
option casemap:none
.model flat,stdcall
include c:\masm32\include\windows.inc
include c:\masm32\include\kernel32.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\comctl32.inc

includelib c:\masm32\lib\kernel32.lib
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\comctl32.lib

DlgProc PROTO,
hWnd:HWND,
uMsg:UINT,
wParam:WPARAM,
lParam:LPARAM

.const
IDC_LSV1 equ 1001
IDC_BTN1 equ 1002
M1 equ 1003

IDR_MENU1 equ 10000
IDM_Hola2 equ 10002
IDM_HOLA equ 10001

.data
DlgName byte "Hola",0
Heading1 byte "Test1",0
Heading2 byte "Test2",0

.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hlsv HANDLE ?
fila DWORD 0
hMenu HMENU ?
hPopupMenu HMENU ?
pt POINT <>

.code
ShowOption proc,
hWnd:HWND
invoke SendMessage,hlsv,LVM_GETNEXTITEM,-1,LVNI_FOCUSED

invoke LoadMenu,NULL,IDR_MENU1
mov hMenu,eax

invoke GetSubMenu,hMenu,0
mov hPopupMenu,eax

invoke SetMenuDefaultItem,hPopupMenu,-1,TRUE
invoke GetCursorPos,addr pt

invoke SetForegroundWindow,hWnd
invoke TrackPopupMenu,hPopupMenu,TPM_LEFTALIGN,pt.x,pt.y,0,hWnd,NULL
invoke SetForegroundWindow,hWnd
invoke DestroyMenu,hPopupMenu
invoke DestroyMenu,hMenu








;invoke SendMessage,hlsv,LVM_DELETEITEM,eax,0
ret
ShowOption endp

InsertColumn proc,
hWnd:HWND
LOCAL lvc:LV_COLUMN
mov lvc.imask,LVCF_TEXT+LVCF_WIDTH
mov lvc.pszText,offset Heading1
mov lvc.lx,150
invoke SendMessage,hWnd, LVM_INSERTCOLUMN,0,addr lvc

or lvc.imask,LVCF_FMT
mov lvc.fmt,LVCFMT_RIGHT
mov lvc.pszText,offset Heading2
mov lvc.lx,100
invoke SendMessage,hWnd, LVM_INSERTCOLUMN, 1 ,addr lvc
ret
InsertColumn endp

InsertItem proc
LOCAL lvi:LV_ITEM
mov lvi.imask,LVIF_TEXT+LVIF_PARAM

push fila
pop lvi.iItem

mov lvi.iSubItem,0
mov lvi.pszText,offset Heading1

push fila
pop lvi.lParam



invoke SendMessage,hlsv, LVM_INSERTITEM,0, addr lvi
mov lvi.imask,LVIF_TEXT
inc lvi.iSubItem
mov lvi.pszText,offset Heading2
invoke SendMessage,hlsv,LVM_SETITEM, 0,addr lvi
inc Heading2
push eax
push eax
ret
InsertItem endp

start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke DialogBoxParam,hInstance,ADDR DlgName,NULL,ADDR DlgProc,NULL
invoke ExitProcess,eax
DlgProc PROC hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
.IF uMsg == WM_INITDIALOG
invoke InitCommonControls
invoke GetDlgItem,hWnd,IDC_LSV1
mov hlsv,eax
invoke InsertColumn,eax



; invoke GetDlgItem,hWnd,IDC_FOCUS
; invoke SetFocus,eax
.ELSEIF uMsg == WM_COMMAND
mov eax,wParam
mov edx,wParam
shr edx,16
.if dx==BN_CLICKED
.if ax==IDC_BTN1
invoke InsertItem
.endif
.endif
.ELSEIF uMsg == WM_CLOSE
invoke EndDialog,hWnd,NULL
.ELSEIF uMsg==WM_NOTIFY
push edi
mov edi,lParam
assume edi:ptr NMHDR
mov eax,[edi].hwndFrom
.if eax==hlsv
.if [edi].code==NM_DBLCLK
invoke ShowOption,hWnd
.endif
.endif
.ELSE
mov eax,FALSE
ret
.ENDIF
mov eax,TRUE
ret
DlgProc ENDP
END start


Código (asm) [Seleccionar]
IDR_MENU1 MENU
BEGIN
 MENUITEM "Hola1",IDM_HOLA1
 MENUITEM "Hola2",IDM_HOLA2
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
Título: Re: Mostrar menú al hacer clic en un listview
Publicado por: .:UND3R:. en 13 Mayo 2013, 03:27 AM
Lo he solucionado de la siguiente forma:

Código (asm) [Seleccionar]
invoke CreatePopupMenu
mov hPopupMenu,eax

invoke AppendMenu,hPopupMenu,MF_STRING,IDM_HOLA2,addr Heading1
invoke AppendMenu,hPopupMenu,MF_STRING,IDM_HOLA,addr Heading2

invoke SetMenuDefaultItem,hPopupMenu,-1,TRUE
invoke GetCursorPos,addr pt

invoke SetForegroundWindow,hWnd
invoke TrackPopupMenu,hPopupMenu,TPM_LEFTALIGN,pt.x,pt.y,0,hWnd,NULL
invoke SetForegroundWindow,hWnd
invoke DestroyMenu,hPopupMenu



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