hola gente, bueno hice este codigo y trabaja exactamente como yo quiero que haga, el problema es que
la CPU se sobrecarga, llega al 50% cuando posiciono el cursor sobre un control creado y no encuentro
del PORQUE lo hace : P
por favor ayuda! ya revise la documentacion y devuelvo los valores que pide : P
depurara el programa si supiera que hay un error pero el programa no se cuelga ni nada, al parece esta mal estructurado , gracias!
.386
.model flat,stdcall
option casemap:none
include \masm32\include\masm32rt.inc
myWNDPROC proto :HWND,:UINT,:WPARAM,:LPARAM
WndProc proto :HWND,:UINT,:WPARAM,:LPARAM
WinMain proto :DWORD,:DWORD
.data
ClassName db "mypaint",0
AppName db "paint program",0
myclass db "Static",0
sname db "statictohide",0
sname2 db "statictohide2",0
hstatic dd 0
hstatic2 dd 0
mysubclass dd 0
returnclass dd 0
.data?
hInstance HINSTANCE ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, hInstance,NULL
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
hInst,NULL
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
myWNDPROC proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL LEAVEAREA:TRACKMOUSEEVENT
.if uMsg==WM_MOUSEMOVE
invoke ShowWindow,hWnd,SW_HIDE
mov edx,hWnd
mov LEAVEAREA.cbSize,sizeof(TRACKMOUSEEVENT)
mov LEAVEAREA.dwFlags,TME_HOVER or TME_LEAVE
mov LEAVEAREA.dwHoverTime,1000
mov LEAVEAREA.hwndTrack,edx
invoke TrackMouseEvent,addr LEAVEAREA
.elseif uMsg==WM_MOUSELEAVE
invoke ShowWindow,hWnd,SW_SHOW
.else
invoke CallWindowProc,mysubclass,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
myWNDPROC endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL LEAVEAREA:TRACKMOUSEEVENT
.IF uMsg==WM_DESTROY
invoke SetWindowLong,mysubclass,GWL_WNDPROC,myWNDPROC
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_CREATE
invoke CreateWindowEx,NULL,addr myclass,addr sname,WS_VISIBLE or WS_CHILD or SS_NOTIFY, \
0h,0h,50h,50h,hWnd,NULL,hInstance,NULL
mov hstatic,eax ; save hanlde static control
invoke CreateWindowEx,NULL,addr myclass,addr sname2,WS_VISIBLE or WS_CHILD or SS_NOTIFY, \
60h,0h,50h,50h,hWnd,NULL,hInstance,NULL
mov hstatic2,eax
invoke SetWindowLong,hstatic,GWL_WNDPROC,myWNDPROC
invoke SetWindowLong,hstatic2,GWL_WNDPROC,myWNDPROC
mov mysubclass,eax
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
end start
Citar
.else
invoke CallWindowProc,mysubclass,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
myWNDPROC endp
No estoy seguro, pero ahi por lo visto llamas al WndProc de mysubclass, cuando ya estas dentro del wndProc de mysubclass.
Es decir, RECURSIVIDAD.
Luego creas una Ventana de la clase mysubclass que jamas registras antes.
Creo que estas confundiendo dos conceptos, SUPERCLASING y SUBCLASING aunque en realidad no necesitas de ninguno de los dos.
invoke SetWindowLong,hstatic,GWL_WNDPROC,myWNDPROC
Lo digo mas que nada por esa linea.
Si estas tratando de crear "componentes" personalizados como por ejemplo un selector de colores, te conviene empezar con una clase desde cero.
bueno laverdad e probado de todo :P
usando DefWindowProc, CallwindowProc, diferentes resultados en EAX, y nada lo curioso en que solo cuando llamo a ShoWindow
sucede eso, si te fijas Enko si borras la linea de ShowWindow el programa corre normal : P estuve como 2 dias enteros probando de todo :S
http://win32assembly.online.fr/tut20.html
Fijate como se hace el subclassing, lo estas haciendo mal.
me parece que ya lo habia hecho, y no funciono, y lo e vuelto a hacer y no funciona :@
siempre se sobre carga la CPU
Hablo casi sin saber, pero.. porque no debuggeas para ver si no se convierte en Recursividad como dice _Enko? ahi le encontraras el fallo, tal vez no donde dice _Enko, pero tal vez en otro lado. Debuggeando le encontras la solucion facil, no es mucho codigo.
Cita de: $Edu$ en 21 Abril 2012, 23:40 PM
Hablo casi sin saber, pero.. porque no debuggeas para ver si no se convierte en Recursividad como dice _Enko? ahi le encontraras el fallo, tal vez no donde dice _Enko, pero tal vez en otro lado. Debuggeando le encontras la solucion facil, no es mucho codigo.
no puede ser porque si elimino la linea de ShowWindow como e dicho el código funciona correctamente, seguramente hay algo malo
con los dos ShowWindow :P
Tambien esta mal que no llames los WindowProc originales de las ventanas si haces subclassing.
Lee el ejemplo de subclasing de iczelion, intenta reproducirlo, luego aplicalo a tu problema.
Si haces un componente nuevo, tienes que registrar la clase.
Enko me e leido todos los tutos de iczelion : P
de hecho hasta los codigos de la MSDN esta así muestra como un subclassing
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633570(v=vs.85).aspx
Un amigo logro resolver en problema pero usaba una y mil APIs : P
bueno no es eso en si, a mi lo que no llego a aceptar es porque no funciona como los demas, de hecho si quiero capturar
botones, estatico, listview, etc me funciona correctamente
citas MSDN, pero lo que estas citando es registro de clases nuevas con su windproc propio.
En tu ejemplo solo registras un componente, la ventana principal.
Insisto, no confundas clase de ventana nueva, con un subclassing.