消息处理函数问题
_ProcWinMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
mov eax,uMsg
.if eax==WM_CREATE
invoke CreateWindowEx,NULL,\
offset szButton,offset szButtonText,\
WS_CHILD or WS_VISIBLE,\
10,10,65,22,\
hWnd,1,hInstance,NULL
.elseif eax==WM_PAINT
invoke BeginPaint,hWnd,addr @stPs
mov @hDc,eax
invoke GetClientRect,hWnd,addr @stRect
invoke DrawText,@hDc,addr szText,-1,addr @stRect,\
DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd,addr @stPs
.elseif eax==WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
_ProcWinMain end
为何要用两个ret?
[解决办法]
这个是 Windows 的要求吧. 自己处理了的消息, 为了保证后续工作的正常进行, 通常需要返回 0 值. 自己没有处理的, 传递给 DefWindowsProc() 函数进行处理, 这时, 当然就是返回该函数的返回值了, 以保证正确地反应 DefWindowProc() 函数的执行结果
[解决办法]
第一个RET应该返回的是DefWindowProc函数的返回值,我记得函数的返回值是存在EAX中.
第二个RET应该返回的是0.
和下面这段程序应该相仿:
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch ( message )
{
...略........
case WM_DESTROY:
{
PostQuitMessage( 0 );
return 0;(相当于第二个RET)
}
}
return DefWindowProc( hwnd, message, wParam, lParam );(相当于第一个RET)
}
初学不对之处请原谅!!