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

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

本文简介:选择自 goddragon 的 blog

第二十五课:位图初步


在这一课,我们将学习怎样在程序中使用位图。 更准确地说,我们要学习的是怎样在一个窗口的客户区中显示位图。

理论

位图就是存贮于电脑中的图片。位图文件有相当多的格式(译者:如.bmp.jpg.gif.pic 等)但windows仅支持 windows bitmap graphics 格式,即bmp文件。 本课所指的位图也是bmp文件。 使用位图最简单的方法就是把它定义在资源文件(.rc)中。 定义的方法有两种。第一种方法是把它定义为整数宏,具体如下:
 
#define idb_mybitmap   100
idb_mybitmap  bitmap  "c:\project\example.bmp"
第一行我们定义了一个值为100的整数宏。 第二行我们把这个整数宏指向所要定义的位图, 这样,编译器就能知道位图所在的路径。
另一种方法是给它起一个名字,也就是把它定义为字符串,具体如下:
mybitmap  bitmap "c:\project\example.bmp"
两种方法效果是一样的。选择哪一种方法,视乎在程序中你喜欢用整数宏还是用字符串来指向位图。
现在我们已经把位图定义在资源文件中,下一步就是把它显示在窗口的客户区上。
  1. 在程序中,我们使用api函数 loadbitmap 取得位图句柄。 下面是 loadbitmap 函数的 完型:
      loadbitmap proto hinstance:hinstance, lpbitmapname:lpstr


    该函数返回一个位图句柄。函数有两个参数,其中 hinstance 是程序句柄。 lpbitmapname 是位图名字的指针(适用于第二种定义方法)。如果你使用了第一种 定义方法,你可以填入指向位图的值或整数宏 (对应上例这个值就是100,整数宏是idb_mybitmap)。下面是简单的例子:


      第一种方法:

      .386
      .model flat, stdcall
      ................
      .const
      idb_mybitmap    equ 100
      ...............
      .data?
      hinstance  dd ?
      ..............
      .code
      .............
          invoke getmodulehandle,null
          mov hinstance,eax
      ............
          invoke loadbitmap,hinstance,idb_mybitmap
      ...........

      第二种方法:

      .386
      .model flat, stdcall
      ................
      .data
      bitmapname  db "mybitmap",0
      ...............
      .data?
      hinstance  dd ?
      ..............
      .code
      .............
          invoke getmodulehandle,null
          mov hinstance,eax
      ............
          invoke loadbitmap,hinstance,addr bitmapname
      ...........

  1. 获得一个设备文本(dc)句柄。你可以在响应wm_paint消息时通过api函数beginpaint获得。 如果在其它消息中则可以用api函数getdc获得。
  2. 创建这个dc的内存映像。这样做的目的是建立一张“隐藏的画纸”,把位图 “画”在上面,作缓冲之用。完成这项工作后,我们就通过一个函数把“画纸”上的位图复制 到真正的dc中。这就是在屏幕上快速显示图象的双缓冲技术。(译者:可以减少图象抖动) 这张“画纸”用api函数 createcompatibledc 建立,下面是它的完型:
      createcompatibledc  proto  hdc:hdc


    如果函数执行成功,将返回dc内存映像也即“画纸”的句柄。

  1. 现在我们已经有了“画纸”,可以把位图画在上面了。这可以通过api函数 selectobject 完成, 其中第一个参数是“画纸”的句柄,第二个参数则是位图的句柄,下面是函数的完型:
      selectobject   proto  hdc:hdc, hgdiobject:dword
  1. 现在位图已经画在“画纸”上了。下一步我们要把位图复制到真正的dc中。 有很多api函数都能完成这项工作,例如 bitblt 和 stretchblt。 函数 bitblt 仅仅将一个dc的内容简单地复制到另一个dc中,而函数 stretchblt 则能够自动调整源dc复制内容的大小已适应目的dc的输出区域大小,因此前者比后者速度更快。 在这里我们只使用函数 bitblt ,下面是它的完型:
      bitblt  proto  hdcdest:dword, nxdest:dword, nydest:dword, nwidth:dword, nheight:dword, hdcsrc:dword, nxsrc:dword, nysrc:dword, dwrop:dword
       
    hdcdest 目的dc的句柄。
    nxdest, nydest 目的dc输出区域的左上角坐标。
    nwidth, nheight 目的dc输出区域的长和宽。
    hdcsrc 源dc的句柄。
    nxsrc, nysrc 源dc中所要复制区域的左上角坐标。
    dwrop 屏面运算码(rop)。该参数用以确定复制内容的颜色与输出区域原来的颜色按哪种运算 方式处理。通常,只需要简单地用复制内容把输出区域覆盖掉。
  1. 一切办妥后,就用api函数 deleteobject 释放位图对象,也就是把位图“抹掉”。
大功告成! 现在再来回顾一下整个过程:首先,你需要把位图定义在资源文件中。 然后,你需要在程序中载入位图资源,并取得位图句柄。随后,你需要获得位图输出区域的dc,以及创建这个dc的内存映像,并把位图放进这个dc内存映像中。最后把位图从dc内存映像复制到真正的dc中。

例子:

.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib

winmain proto :dword,:dword,:dword,:dword
idb_main   equ 1

.data
classname db "simplewin32asmbitmapclass",0
appname  db "win32asm simple bitmap example",0

.data?
hinstance hinstance ?
commandline lpstr ?
hbitmap dd ?

.code
start:
 invoke getmodulehandle, null
 mov    hinstance,eax
 invoke getcommandline
 mov    commandline,eax
 invoke winmain, hinstance,null,commandline, sw_showdefault
 invoke exitprocess,eax

winmain proc hinst:hinstance,hprevinst:hinstance,cmdline:lpstr,cmdshow:dword
 local wc:wndclassex
 local msg:msg
 local hwnd:hwnd
 mov   wc.cbsize,sizeof wndclassex
 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

本文关键:asm
 

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

go top