invoke loadcursor,null,idc_arrow
mov wc.hcursor,eax
invoke registerclassex, addr wc
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,sw_shownormal
invoke updatewindow, hwnd
.while true
invoke getmessage, addr msg,null,0,0
.break .if (!eax)
invoke translatemessage, addr msg
invoke dispatchmessage, addr msg
.endw
mov eax,msg.wparam
ret
winmain endp
wndproc proc hwnd:hwnd, umsg:uint, wparam:wparam, lparam:lparam
local ps:paintstruct
local hdc:hdc
local hmemdc:hdc
local rect:rect
.if umsg==wm_create
invoke loadbitmap,hinstance,idb_main
mov hbitmap,eax
.elseif umsg==wm_paint
invoke beginpaint,hwnd,addr ps
mov hdc,eax
invoke createcompatibledc,hdc
mov hmemdc,eax
invoke selectobject,hmemdc,hbitmap
invoke getclientrect,hwnd,addr rect
invoke bitblt,hdc,0,0,rect.right,rect.bottom,hmemdc,0,0,srccopy
invoke deletedc,hmemdc
invoke endpaint,hwnd,addr ps
.elseif umsg==wm_destroy
invoke deleteobject,hbitmap
invoke postquitmessage,null
.else
invoke defwindowproc,hwnd,umsg,wparam,lparam
ret
.endif
xor eax,eax
ret
wndproc endp
end start
;---------------------------------------------------------------------
; 资源定义
;---------------------------------------------------------------------
#define idb_main 1
idb_main bitmap "tweety78.bmp"
分析:
#define idb_main 1定义整数宏idb_main的值为1,然后把它指向一个与资源文件处于相同目录文件名为“tweety.bmp"的位图。
idb_main bitmap "tweety78.bmp"
.if umsg==wm_create
invoke loadbitmap,hinstance,idb_main
mov hbitmap,eax
在处理 wm_create 消息时, 我们通过api函数 loadbitmap 载入位图资源,并通过函数返回值取得位图句柄。
然后,我们就可以把位图画在窗口客户区上。
.elseif umsg==wm_paint
invoke beginpaint,hwnd,addr ps
mov hdc,eax
invoke createcompatibledc,hdc
mov hmemdc,eax
invoke selectobject,hmemdc,hbitmap
invoke getclientrect,hwnd,addr rect
invoke bitblt,hdc,0,0,rect.right,rect.bottom,hmemdc,0,0,srccopy
invoke deletedc,hmemdc
invoke endpaint,hwnd,addr ps
在本例中,我们选用在响应wm_paint消息时画出位图。首先我们通过api函数l beginpaint 获得窗口客户区的dc句柄。 接着我们通过api函数 createcompatibledc 创建该dc 的内存映像,并通过api函数 selectobject 把位图放进内存映像中。下一步,我们通过api函数 getclientrect 取得窗口客户区的大小。最后,我们通过api函数 bitblt 把位图从dc内存映像复制到真正的客户区dc中。 完成显示工作后,我们通过api函数 deletedc 释放dc内存映像,并用api函数 endpaint 释放客户区dc, 结束画图工作。
.elseif umsg==wm_destroy
invoke deleteobject,hbitmap