WIN32汇编: 25.位图初步[2]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 goddragon 的 blog

 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 bitmap "tweety78.bmp"
定义整数宏idb_main的值为1,然后把它指向一个与资源文件处于相同目录文件名为“tweety.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

本文关键:asm
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top