📄 nonddddme1.asm
字号:
;----------------
;编译模式="EXE"
;----------------
.386
.Model Flat, StdCall
Option Casemap :None
;---------------------------------------------------------------------------
;引用INC与LIB请不要包含路径
Include windows.inc
Include user32.inc
Include kernel32.inc
include gdi32.inc
includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
include macro.asm
;---------------------------------------------------------------------------
;使用INVOKE方式调用过程需要声明
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
;---------------------------------------------------------------------------
;全局变量
.DATA
szWindowsName DB "http://aogo.yeah.net",0
szClassName db "WinASM_Class",0
.DATA?
hInstance DD ?
hBit1 dd ?
hBit2 dd ?
hMemdc dd ?
;===========================================================================
;代码开始
.CODE
START:
invoke GetModuleHandle,NULL
mov hInstance, eax
invoke GetCommandLine
invoke WinMain,hInstance,NULL,eax,SW_SHOWDEFAULT
invoke ExitProcess,0
;---------------------------------------------------------------------------
WinMain proc hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
; 声明过程变量(局部)
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
local hWnd :HWND
;---------------------
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc,offset WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,offset szClassName
invoke LoadIcon,hInst,100 ;这一行是在资源文件中加载ID为100的图标做为窗体的图标
mov wc.hIcon,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor, eax
mov wc.hIconSm, 0
invoke RegisterClassEx, ADDR wc
invoke CreateWindowEx,NULL,ADDR szClassName,ADDR szWindowsName,WS_OVERLAPPEDWINDOW,200,200,500,200,NULL,NULL,hInst,NULL
mov hWnd,eax
;invoke LoadMenu,hInst,600 ;读取菜单(如果有ID为600的菜单)
;invoke SetMenu,hWnd,eax ;显示菜单
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov eax,msg.wParam
ret
WinMain endp
;---------------------------------------------------------------------------
WndProc proc hWin:DWORD,uMsg:DWORD,wParam :DWORD,lParam :DWORD
local ps:PAINTSTRUCT,buffer[100]:BYTE
.if uMsg==WM_CREATE
invoke GetDC,hWin
mov ps.hdc,eax
invoke CreateCompatibleDC,ps.hdc
mov hMemdc,eax
invoke ReleaseDC,hWin,ps.hdc
;接着,如果游戏中的一个图形不是图片是画的,创建N个图片画出图形.分别保存
;图形1,大小自己去考虑
invoke CreateCompatibleBitmap,hMemdc,100,100
mov hBit1,eax
invoke SelectObject,hMemdc,hBit1
;画图形的代码:
invoke Rectangle,hMemdc,0,0,100,100
invoke GetSysColorBrush,COLOR_BTNFACE
invoke SelectObject,hMemdc,eax
invoke Rectangle,hMemdc,20,20,80,80
;画完后,图形会自动保存在图片上
;创建第二个图片
invoke CreateCompatibleBitmap,hMemdc,100,100
mov hBit2,eax
invoke SelectObject,hMemdc,hBit2
;画图形的代码:
invoke GetSysColorBrush,COLOR_BTNFACE
invoke SelectObject,hMemdc,eax
invoke Rectangle,hMemdc,0,0,100,100
invoke GetStockObject,WHITE_BRUSH
invoke SelectObject,hMemdc,eax
invoke Rectangle,hMemdc,20,20,80,80
;画完后,图形会自动保存在图片上
;循环创建所需要的图片.如果本身就是图片,只需要加载
;... ...
;窗体创建
.elseif uMsg==WM_PAINT
invoke BeginPaint,hWin,addr ps
mov ps.hdc,eax
;根据游戏的信息画上这些图片,获得图片高宽可以使用GetObject
invoke SelectObject,hMemdc,hBit1
invoke BitBlt,ps.hdc,0,0,100,100,hMemdc,0,0,SRCCOPY
invoke SelectObject,hMemdc,hBit2
invoke BitBlt,ps.hdc,101,0,100,100,hMemdc,0,0,SRCCOPY
invoke EndPaint,hWin,addr ps
mov eax,0
ret
.elseif uMsg == WM_COMMAND
ret
.elseif uMsg == WM_DESTROY
invoke DeleteDC,hMemdc
;程序销毁
invoke PostQuitMessage,NULL
ret
.else
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
;---------------------------------------------------------------------------
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -