.386 ;告诉编译器程序所用指令集,(.386P)带P表示使用特权级指令。 .model flat,stdcall;内存模式平坦的4G空间 ;参数传递方式C从右往左,调用者恢复堆栈指针。 ;PSCAL从左往右,被调用者恢复堆栈指针。 ;stdcall从右往左传递,但是堆栈指针由被调用者恢复。 option casemap:none;区分标志的大小写 include windows.inc;各种常量,宏的定义 include user32.inc includelib user32.lib ; calls to functions in user32.lib and kernel32.lib include kernel32.inc includelib kernel32.lib include gdi32.inc includelib gdi32.lib
RGB macro Red,Green,Blue xor eax,eax mov ah,Blue shl eax,8 mov ah,Green mov al,Red endm
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
.DATA ; initialized data ClassName db "SimpleWinClass",0 ; the name of our window class AppName db "Our First Window",0 ; the name of our window OurText db "彭小虎是个SB!",0 ; the text of our client FontName db "script",0 MouseClick db 0
.DATA? ; Uninitialized data hInstance HINSTANCE ? ; Instance handle of our program CommandLine LPSTR ? hitpoint POINT <> .CODE ; Here begins our code start: invoke GetModuleHandle, NULL ; 获取一个应用程序或动态链接库的模块句柄,返回值存储在eax ; Under Win32, hmodule==hinstance mov hInstance,eax mov hInstance,eax invoke GetCommandLine ; 获得指向当前命令行缓冲区的一个指针 mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT ; call the main function,第三个参数表示窗口初始状态 invoke ExitProcess, eax ; quit our program. The exit code is returned in eax from WinMain. ;--------------------------------------------------------------------------- WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX ; create local variables on stack LOCAL msg:MSG LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX ; fill values in members of wc 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_WINDOW+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 ; register our window class 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,CmdShow ; display our window on desktop invoke UpdateWindow, hwnd ; refresh the client area
.WHILE TRUE ; Enter message loop invoke GetMessage, ADDR msg,NULL,0,0 .BREAK.IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ; return exit code in eax ret WinMain endp ;--------------------------------------------------------------------------- WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM LOCAL hdc:HDC LOCAL ps:PAINTSTRUCT LOCAL hfont:HFONT
.IF uMsg==WM_DESTROY ; if the user closes our window invoke PostQuitMessage,NULL ; quit our application
.ELSEIF uMsg==WM_LBUTTONDOWN mov eax,lParam and eax,0FFFFh mov hitpoint.x,eax mov eax,lParam shr eax,16 mov hitpoint.y,eax mov MouseClick,TRUE invoke InvalidateRect,hWnd,NULL,TRUE
.ELSEIF uMsg==WM_PAINT invoke BeginPaint,hWnd,ADDR ps ;返回设备句柄 mov hdc,eax ;取得设备句柄 invoke CreateFont,50,16,270,0,FW_DEMIBOLD,0,0,0,GB2312_CHARSET,\ OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,\ DEFAULT_QUALITY,DEFAULT_PITCH or FF_SCRIPT,\ ADDR FontName invoke SelectObject,hdc,eax mov hfont,eax;保存 RGB 8,80,8 invoke SetBkColor,hdc,eax invoke TextOut,hdc,80,120,ADDR OurText,SIZEOF OurText invoke SelectObject,hdc, hfont;恢复
.IF MouseClick invoke lstrlen,ADDR OurText invoke TextOut,hdc,hitpoint.x,hitpoint.y,ADDR OurText,eax .ENDIF
invoke EndPaint,hWnd, ADDR ps .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Default message processing ret .ENDIF xor eax,eax ret WndProc endp ;--------------------------------------------------------------------------- end start
|