一个汇编写的窗口,对着书敲得,加了些注释。
.386.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
includelib user32.lib
include gdi32.inc
includelib gdi32.lib
include kernel32.inc
includelib kernel32.lib
.data
hInstance dd ? ;实例句柄
hWinMain dd ?;窗体句柄
;rectx dd ?
.const
szClassName db 'ssyclass',0;窗口类名
szCaptionName db 'mywindow',0 ;窗口标题
szText db 'hello world',0 ;客户区显示内容
.code
;窗口过程函数
_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam;.uses ebx edi esi这句是让编译器在
;函数中用push,pop指令保护这三个寄存器的值
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
mov eax,uMsg
.if eax==WM_PAINT
invoke BeginPaint,hWnd,addr @stPs ;BeginPaint函数为指定窗口进行绘图工作的准备,并用将和绘图有关的信息填充到一个
;PAINTSTRUCT结构中。
mov @hDc,eax ;返回设备环境句柄
invoke GetClientRect,hWnd,addr @stRect ;获取客户区的坐标
;invoke DrawText,@hDc,addr szText,-1,\ ;在目标区域绘制 -1自动设置大小
; addr @stRect,\
;invoke DrawText,@hDc,addr @stRect.top,-1,\ ;在目标区域绘制 -1自动设置大小
; addr @stRect,\
invoke TextOut,@hDc,NULL,NULL,addr szText,sizeof szText-1
;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 endp
;注册建立显示 消息循环
_WinMainproc
local @stWndClass:WNDCLASSEX ;声明个 WNDCLASSEX结构体的局部变量@stWndClass
local @stMsg:MSG ;声明 MSG结构体的局部变量 @stMsg 消息结构体
invoke GetModuleHandle,NULL ;获得当前实例句柄
mov hInstance,eax ;返回值在eax hInstance中
invoke RtlZeroMemory,addr @stWndClass,sizeof WNDCLASSEX ;初始化WNDCLASSEX,全置0
;注册窗口类
invoke LoadCursor,0,IDC_WAIT ;装载光标 IDC WAIT 为漏斗光标
mov @stWndClass.hCursor,eax ;函数返回光标句柄
push hInstance
pop @stWndClass.hInstance ;把实例句柄压栈再弹到结构体里
mov @stWndClass.cbSize,sizeof WNDCLASSEX ;把窗口类结构体占的字节放在cbSize中
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW;在水平或垂直方向窗口大小变化时重绘窗口
mov @stWndClass.lpfnWndProc,offset _ProcWinMain;把窗口过程函数地址给lpfnWndProc
mov @stWndClass.hbrBackground,COLOR_WINDOW+10 ;设置背景色
mov @stWndClass.lpszClassName,offset szClassName;把窗口类名地址给lpszClassName
invoke RegisterClassEx,addr @stWndClass;注册窗口
;建立并显示窗口
invoke CreateWindowEx,WS_EX_CLIENTEDGE,\;窗口的扩展风格 指定窗口有一个带阴影的边界。
offset szClassName,\; 指向注册类名的指针
offset szCaptionName,\;指向窗口名称的指针
WS_OVERLAPPEDWINDOW,\;窗口风格
100,100,100,100,\;水平位置 垂直位置 宽度 高度
NULL,NULL,hInstance,NULL;
mov hWinMain,eax ;CreateWindowEx返回窗口句柄
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;消息循环
.while TRUE
invokeGetMessage,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
自顶一下先 辛苦了。。 我好晕,更更把前面三江看完:sweat::sweat: 前三章东西少,第五章开始多了,不过那么多的函数参数真是不好记 支持楼主,win32汇编实现窗口比win32 api简单些 谢谢分享
页:
[1]