汇编-窗口基本过程
.386 .model flat,stdcall option casemap:none .stack 4096 ExitProcess PROTO,dwExitCode:DWORD include windows.inc include gdi32.inc includelib gdi32.lib include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib .data? hInstance dd ? hWinMain dd ? .const szClassName db 'MyClass',0 szCaptionMain db '窗口标题',0 szText db '窗口文本',0 .code ;窗口过程-消息处理过程 _ProcWinMain proc uses ebx edi esi ,hWnd,uMsg,wParam,lParam local @stPs:PAINTSTRUCT local @stRect:RECT local @hDc mov eax,uMsg ;******************************************************************** .if 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 ;如果是WM_CLOSE消息 invoke DestroyWindow,hWinMain invoke PostQuitMessage,NULL ;******************************************************************** .else invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .endif ;******************************************************************** xor eax,eax ret _ProcWinMain endp _WinMain proc local @stWndClass:WNDCLASSEX local @stMsg:MSG invoke GetModuleHandle,NULL mov hInstance,eax invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass ; 注册窗口类 invoke LoadCursor,0,IDC_ARROW mov @stWndClass.hCursor,eax push hInstance pop @stWndClass.hInstance mov @stWndClass.cbSize,sizeof WNDCLASSEX mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW mov @stWndClass.lpfnWndProc,offset _ProcWinMain mov @stWndClass.hbrBackground,COLOR_WINDOW + 1 mov @stWndClass.lpszClassName,offset szClassName invoke RegisterClassEx,addr @stWndClass ; 建立并显示窗口 invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,offset szCaptionMain,WS_OVERLAPPEDWINDOW,100,100,600,400,NULL,NULL,hInstance,NULL ;创建窗口 mov hWinMain,eax invoke ShowWindow,hWinMain,SW_SHOWNORMAL ;显示窗口 invoke UpdateWindow,hWinMain ;刷新窗口客户区 ;消息循环 .while TRUE ;进入无限的消息获取和处理的循环 invoke GetMessage,addr @stMsg,NULL,0,0 ;获取消息 .break .if eax == 0 invoke TranslateMessage,addr @stMsg ;消息转换 invoke DispatchMessage,addr @stMsg ;消息分派 .endw ret _WinMain endp start: ;程序入口 call _WinMain invoke ExitProcess,NULL end start
示例工程下载:
链接:https://pan.baidu.com/s/1jRjcRwAu0Ib_G6kSRgBwzw
提取码:6666