Consulta sobre como crear un ListView32 (solucionado)

Iniciado por el_c0c0, 15 Marzo 2010, 01:02 AM

0 Miembros y 2 Visitantes están viendo este tema.

el_c0c0

Hola que tal, bueno me decidi a meterme en el tema de ASM. Hasta el momento va todo bien, pero me surgio una duda. Quiero crear un control ListView32, lo creo, perfecto. Ahora quiero agregar una columna, para ello me estoy basando en el codigo fuente del ucListView en VB6 de Carles P.V. Bueno, el tema es que no consigo meter el item del header, o algo asi. Aca adjunto el pedazo de codigo:
Código (asm) [Seleccionar]
 createlv:
        invoke CreateWindowEx,0,_dlgLV,NULL,WS_CHILD + WS_TABSTOP + LVS_REPORT + WS_VISIBLE,5,5,240,155,[dlghwnd],0,[wc.hInstance],NULL
       mov    [dlglvhwnd],eax
       invoke ShowWindow,eax,SW_SHOW
       invoke  SetWindowLong,[dlglvhwnd], GWL_WNDPROC, WindowProc2                

       ; poner el lv en modo list
       invoke GetWindowLong,[dlglvhwnd],GWL_STYLE
       mov    [tmp], eax
       mov    [tmp], tmp+LVS_LIST-LVS_ICON-LVS_SMALLICON-LVS_REPORT
       invoke SetWindowLong,[dlglvhwnd],GWL_STYLE,[tmp]

       ; agregar columna
       invoke lstrlen,_cap1           ; len del caption
       mov    [hdi.cchTextMax], eax   ; len
       mov    [hdi.pszText], _cap1    ; caption
       mov    [hdi.cxy], 100          ; width
       mov    [hdi.fmt], HDF_STRING+HDF_CENTER ; formato
       mov    [hdi.mask], HDI_TEXT+HDI_WIDTH+HDI_FORMAT  ; mask

       invoke SendMessage,[dlglvhwnd],LVM_INSERTCOLUMN,0,[lvc] ;
       invoke SendMessage,[dlglvhwnd],4127,0,0                 ; buscar header dentro del lview
       mov    [dlglvheader], eax                               ; guardo resultado
       invoke SendMessage,eax,HDM_SETITEM,0,[hdi]              ; seteo el item en el header
y tengo declarado asi:
Código (asm) [Seleccionar]
 _dlgLV TCHAR 'SysListView32',0
 _cap1 TCHAR 'LV32',0

 dlglvheader dd ?
 dlglvhwnd dd ?

 tmp dd ?

 lvc LV_COLUMN
 hdi HD_ITEM

estoy usando FASM. wc.hInstance viene de WNDCLASSEX que uso para crear la ventana. WndProc2 es un procedimiento que llama al DefProcWnd. Ah y probe con y sin [] en hdi y lvc.

PD: si quito la parte de 'cambiar el estilo' se ve el recuadro blanco del LV. Pero, con el codigo ese, queda del color de fondo de la ventana.

alguna sugerencia?

desde ya muchas gracias  ::)
'-     coco
"Te voy a romper el orto"- Las hemorroides

MCKSys Argentina

MCKSys Argentina

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


el_c0c0

Cita de: MCKSys Argentina en 15 Marzo 2010, 02:40 AM
Hola!

Fíjate por aqui: http://win32assembly.online.fr/tut31.html

Quizás te ayude :)

Saludos!
Che gracias por responder. Mientras tanto estvue indagando por mi cuenta. Lo que me pusiste vos
Código (asm) [Seleccionar]
  LOCAL lvc:LV_COLUMN
  mov lvc.imask,LVCF_TEXT+LVCF_WIDTH
  mov lvc.pszText,offset Heading1
  mov lvc.lx,150
  invoke SendMessage,hList, LVM_INSERTCOLUMN,0,addr lvc
yo lo tengo asi:
Código (asm) [Seleccionar]
       mov     [lvc.mask], LVCF_TEXT or LVCF_WIDTH
       mov     [lvc.pszText], _cap1 ; aca tengo duda de que esto sea asi
       mov     [lvc.cx], 50
       invoke  SendMessage, [dlglvhwnd], LVM_INSERTCOLUMN, 0, [lvc]


y para el tema de agregar un item en ese codigo esta asi:
Código (asm) [Seleccionar]
 mov lvi.imask,LVIF_TEXT
 inc lvi.iSubItem
 invoke wsprintf,addr buffer, addr template,[edi].nFileSizeLow
 lea eax,buffer
 mov lvi.pszText,eax
 invoke SendMessage,hList, LVM_INSERTITEM,0, addr lvi

y yo por mi parte lo tengo como
Código (asm) [Seleccionar]
       mov     [lvi.iItem], 0
       mov     [lvi.iSubItem], 0
       mov     [lvi.mask], LVIF_TEXT
       mov     [lvi.pszText], _cap1
       invoke  SendMessage,[dlglvhwnd], LVM_INSERTITEM,0,[lvi]


misteriosamente sigue sin funcionar. sorry que sea duro con esto, recien empiezo :D

saludos
'-     coco
"Te voy a romper el orto"- Las hemorroides

MCKSys Argentina

Tuyo
inc lvi.iSubItem

Iczelion
mov     [lvi.iSubItem], 0

¿ No será por eso ? (Mucho de ASM no manejo :))
MCKSys Argentina

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


el_c0c0

Cita de: MCKSys Argentina en 15 Marzo 2010, 03:14 AM
Tuyo
inc lvi.iSubItem

Iczelion
mov     [lvi.iSubItem], 0

¿ No será por eso ? (Mucho de ASM no manejo :))
Al revez, el que uso yo usa los []. Esto es porque le estoy pasando como puntero. (de todas formas sin [] no funciona :D). Estoy casi seguro que es un problema al pasar el string; aun sigo viendo que carajos pasa.

Gracias por contestar, ademas espero otras respuestas.

saludos
'-     coco
"Te voy a romper el orto"- Las hemorroides

Eternal Idol

¿Ambos mensajes devuelven -1? Teniendo el codigo lo mejor que podes hacer es depurar el programa con el WinDbg.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

el_c0c0

#6
Cita de: Eternal Idol en 15 Marzo 2010, 12:06 PM
¿Ambos mensajes devuelven -1? Teniendo el codigo lo mejor que podes hacer es depurar el programa con el WinDbg.

Recien lo probe con Olly, me devuelven 0. A su vez agregue un CMP para no tener que andar debugueando. cual sera el problema?

edit, dejo foto del Olly:


saludos
'-     coco
"Te voy a romper el orto"- Las hemorroides

Eternal Idol

Es dificil saber sin el codigo pero en teoria esos mensajes funcionaron bien ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

el_c0c0

Cita de: Eternal Idol en 15 Marzo 2010, 18:16 PM
Es dificil saber sin el codigo pero en teoria esos mensajes funcionaron bien ...

te dejo el codigo completo, espero que sea una pelotudez.
Código (asm) [Seleccionar]
format PE GUI 4.0
entry start

include 'win32w.inc'

section '.data' data readable writeable

  _class TCHAR 'CocusUI®',0
  _title TCHAR 'Window de prueba',0
  _error TCHAR 'Startup failed.',0
  _dlgLV TCHAR 'SysListView32',0
  _cap1 TCHAR 'LV32',0

  dlglvheader dd ?
  dlglvhwnd dd ?
  dlghwnd dd ?
  dlghdc dd ?
  tmp dd ?

  wc WNDCLASS 0,WindowProc,0,0,NULL,NULL,NULL,COLOR_BTNFACE+1,NULL,_class

  msg MSG
  lvi LV_ITEM
  lvc LV_COLUMN
  hdi HD_ITEM

section '.text' code readable executable

  start:

        invoke  GetModuleHandle,0
        mov     [wc.hInstance],eax
        invoke  LoadIcon,0,IDI_APPLICATION
        mov     [wc.hIcon],eax
        invoke  LoadCursor,0,IDC_ARROW
        mov     [wc.hCursor],eax
        invoke  RegisterClass,wc
        test    eax,eax
        jz      error

        invoke  CreateWindowEx,0,_class,_title,WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU,128,128,256,192,NULL,NULL,[wc.hInstance],NULL
        test    eax,eax
        jz      error

        mov     [dlghwnd],eax
        invoke  GetDC,eax
        mov     [dlghdc],eax

        jmp     createlv


  createlv:
        invoke CreateWindowEx,0,_dlgLV,NULL,WS_CHILD + WS_TABSTOP + WS_VISIBLE + LVS_REPORT,5,5,240,155,[dlghwnd],0,[wc.hInstance],NULL
        mov    [dlglvhwnd],eax
        invoke SetWindowLong,[dlglvhwnd], GWL_WNDPROC, WindowProc2
        invoke ShowWindow,[dlglvhwnd],SW_SHOW

        mov     [lvi.mask], LVIF_TEXT ;or LVIF_STATE
        mov     [lvi.iItem], 0
        mov     [lvi.iSubItem], 0
        mov     [lvi.pszText], _cap1

        invoke  SendMessage,[dlglvhwnd], LVM_INSERTITEM,0,[lvi]

        cmp     eax,-1
        ja      msg_loop
        invoke  MessageBeep, MB_OK

  msg_loop:
        invoke  GetMessage,msg,NULL,0,0
        cmp     eax,1
        jb      end_loop
        jne     msg_loop
        invoke  TranslateMessage,msg
        invoke  DispatchMessage,msg
        jmp     msg_loop

  error:
        invoke  MessageBox,NULL,_error,NULL,MB_ICONERROR+MB_OK

  end_loop:
        invoke  ExitProcess,[msg.wParam]

proc WindowProc2 uses ebx esi edi, hwnd,umsg,wparam,lparam
     invoke  DefWindowProc,[hwnd],[umsg],[wparam],[lparam]

     cmp     [umsg], LVM_INSERTITEM
     je      .beep
     ret

     .beep:
     invoke     MessageBeep, MB_OK
     ret
endp

proc WindowProc uses ebx esi edi, hwnd,wmsg,wparam,lparam
        cmp     [wmsg],WM_DESTROY
        je      .wmdestroy

  .defwndproc:
        invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]

        jmp     .finish
  .wmdestroy:
        invoke  DestroyWindow,[dlglvhwnd]
        invoke  PostQuitMessage,0
        xor     eax,eax
  .finish:
        ret
endp



section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
          user32,'USER32.DLL',\
          shell32,'SHELL32.DLL'

  include 'api\kernel32.inc'
  include 'api\user32.inc'
  include 'api\shell32.inc' 
Saludos y gracias por las respuestas ;)
'-     coco
"Te voy a romper el orto"- Las hemorroides

Eternal Idol

#9
Detesto FASM ... al menos tenes que llamar a InitCommonControls/InitCommonControlsEx (fue en lo primero que pense al leer el hilo pero la explicacion me confundio, no se creaba el control ...), CreateWindowEx en createlv devuelve 0.

Sigo viendo, esto tambien esta mal:
invoke  SendMessage,[dlglvhwnd], LVM_INSERTITEM,0,[lvi]
invoke  SendMessage,[dlglvhwnd], LVM_INSERTITEM,0, lvi

Lo mismo para la columna (lvc no [lvc]) y sacando WindowProc2 ya podes seguir  ::)
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón