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:
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: _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 ::)
Hola!
Fíjate por aqui: http://win32assembly.online.fr/tut31.html
Quizás te ayude :)
Saludos!
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
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:
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:
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
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
Tuyo
inc lvi.iSubItem
Iczelion
mov [lvi.iSubItem], 0
¿ No será por eso ? (Mucho de ASM no manejo :))
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
¿Ambos mensajes devuelven -1? Teniendo el codigo lo mejor que podes hacer es depurar el programa con el WinDbg.
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:
(http://img85.imageshack.us/img85/7398/1503100103.jpg) (http://img85.imageshack.us/i/1503100103.jpg/)
saludos
Es dificil saber sin el codigo pero en teoria esos mensajes funcionaron bien ...
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.
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 ;)
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 ::)
Cita de: Eternal Idol en 15 Marzo 2010, 22:53 PM
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 ::)
Bien, agregue el initcommoncontrols y initcommoncontrolsex con el parametro ICC_LISTVIEW_CLASSES, pero no me va. Ah, tambien cambie de [lvi] a lvi. Tambien saque la linea de SetWindowLong,[dlglvhwnd], GWL_WNDPROC, WindowProc2,pero igual. Que rayos pasa?
Saludos !
(http://r.i.elhacker.net/cache?url=http://img691.imageshack.us/img691/7922/ventanita2.jpg)
start:
[b] invoke InitCommonControls [/b]
invoke GetModuleHandle,0
mov [wc.hInstance],eax
invoke LoadIcon,0,IDI_APPLICATION
.......
.......
No me va, no es una explicacion. mira justo en el call que devuelve la funcion. si actualizaste el codigo lo mejor es que lo pongas aqui y podemos ser mas concretos.
(http://r.i.elhacker.net/cache?url=http://img169.imageshack.us/img169/4883/ventanita.jpg)
No te voy a dar el codigo, pero fijate bien en tu codigo. ¿que va primero el huevo o la gallina?
En pocas palabras intentas meter un item cuando aun no existe la columna que lo contiene.
Columna1 Columna2 ColumnaX
Elemento1 sub sub
PD ya no se cuantas veces edite, ese "problema" te viene pq usas LVS_REPORT ¿quieres ese estilo para tu lv?
Cita de: el_c0c0 en 16 Marzo 2010, 04:14 AMBien, agregue el initcommoncontrols y initcommoncontrolsex con el parametro ICC_LISTVIEW_CLASSES, pero no me va. Ah, tambien cambie de [lvi] a lvi. Tambien saque la linea de SetWindowLong,[dlglvhwnd], GWL_WNDPROC, WindowProc2,pero igual. Que rayos pasa?
Saludos !
¿Y esta parte?: "Lo mismo para la columna (lvc no [lvc])", tenes que agregar la columna, usa elcodigo que tenias antes para eso pero con lvc (yo lo copie del primer mensaje del hilo).
Cita de: Eternal Idol en 16 Marzo 2010, 07:56 AM
Cita de: el_c0c0 en 16 Marzo 2010, 04:14 AMBien, agregue el initcommoncontrols y initcommoncontrolsex con el parametro ICC_LISTVIEW_CLASSES, pero no me va. Ah, tambien cambie de [lvi] a lvi. Tambien saque la linea de SetWindowLong,[dlglvhwnd], GWL_WNDPROC, WindowProc2,pero igual. Que rayos pasa?
Saludos !
¿Y esta parte?: "Lo mismo para la columna (lvc no [lvc])", tenes que agregar la columna, usa elcodigo que tenias antes para eso pero con lvc (yo lo copie del primer mensaje del hilo).
Bien, no habia posteado resultados porque no estuve en casa. Si, quiero LVS_REPORT. Ya lo solucione, habia que usar Initcommoncontrols sin el Ex. Ahora lo que no entiendo es porque solo toma la letra L de la variable LV32, imagino que es por el tema de Wide o Ansi. No?
Muchisimas gracias gente :D
De nadas ::)
Seguramente; yo lo habia cambiado asi: include 'win32a.inc' probando otras cosas por eso me olvide y no lo mencione (a mi me sale LV32).
Cita de: Eternal Idol en 18 Marzo 2010, 18:43 PM
De nadas ::)
Seguramente; yo lo habia cambiado asi: include 'win32a.inc' probando otras cosas por eso me olvide y no lo mencione (a mi me sale LV32).
Claro yo habia usado eso mismo. Pero bueno, para sacarme la duda, como seria el asunto en Wide? yo tengo declarado _cap1 TCHAR 'LV32',0 sera otro tipo en vez de TCHAR? podria usar db para eso?. Saludos!
TCHAR suena correcto pero es algo de FASM (en cuanto a ASM), mejor consulta su documentacion.
si, puedes usar db perfectamente. realmente tchar lo que haces es declarar como db (multibyte) o du para unicode que es el caso de la cabecera que estas usando.
Si usas db tenes que llamar a SendMessageA y usar la estructura LV_ITEMA (si incluis la cabecera correcta eso se hace automaticamente en teoria).