Sobre carga de la CPU, valor incorrecto en EAX?

Iniciado por x64core, 18 Abril 2012, 01:42 AM

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

x64core

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!



Código (asm) [Seleccionar]
.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


_Enko

#1
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.

x64core

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

_Enko


x64core

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

$Edu$

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.

x64core

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

_Enko

#7
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.

x64core

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

_Enko

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.