首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

消息处理函数有关问题

2012-03-09 
消息处理函数问题_ProcWinMainprocusesebxediesi,hWnd,uMsg,wParam,lParamlocal@stPs:PAINTSTRUCTlocal@st

消息处理函数问题
_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)
}


初学不对之处请原谅!!

热点排行