欢迎来到天天文库
浏览记录
ID:40771840
大小:53.67 KB
页数:6页
时间:2019-08-07
《黑客手册第二十五课 位图初步》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、黑客手册第二十五课位图初步在这课,我们将学习怎样在程序中使用位图。更准确地说,我们要学习的是怎样在个窗口的客户区中显示位图。例子理论位图就是存贮于电脑中的图片。位图文件有相当多的格式(译者:如BMP.]PG.GIF.PIC等)但Windows仅支持WindowsBitmapGraphics格式,即BMP文件。本课所指的位图也是BMP文件。使用位图最简单的方法就是把它定义在资源文件(.rc)中。定义的方法有两种。第种方法是把它定义为整数宏,具体如下:#defineIDBMYBITMAP100IDBMYBITMAPBITMAP"c:projectexamp1e.bmp"第一行我们定义了一个值
2、为100的整数宏。第二行我们把这个整数宏指向所要定义的位图,这样,编译器就能知道位图所在的路径。另一种方法是给它起一个名字,也就是把它定义为字符串,具体如下.MyBitMapBITMAP"c:projectexamp1e.bmp"两种方法效果是一样的。选择哪一种方法,视乎在程序中你喜欢用整数宏还是用字符串来指向位图。现在我们已经把位图定义在资源文件中,下一步就是把它显示在窗口的客户区上。1.在程序中,我们使用API函数LoadBitmap取得位图句柄。下面是LoadBitmap函数的完型:LoadBitmapprotohlnstance:HINSTANCE,1pBitmapName:LP
3、STR该函数返回个位图句柄。函数有两个参数,其中hlnstance是程序句柄。1pBitmapName是位图名字的指针(适用于第二种定义方法)。如果你使用了第种定义方法,你可以填入指向位图的值或整数宏(对应上例这个值就是100,整数宏是IDBMYBITMAP)。下面是简单的例子:第种方法:386mode1f1at,stdca11.constIDBMYBITMAPequ100.data?hlnstancedd?.codeinvokeGetModu1eHand1e,NULLmovhlnstance,eaxinvokeLoadBitmap,hlnstance,IDBMYBITMAP第二种方法:38
4、6modelflat,stdcall.dataBitrr阻pNamedb"MyBitMap",。.data?hlnstancedd?.codeinvokeGetModuleHandle,NULLmovhlnstance,eaxinvokeLoadBitmap,hlnstance,addrBitmapName1.获得个设备文本(DC)句柄。你可以在晌应阳PAINT消息时通过API函数BeginPaint获得。如果在其它消息中则可以用API函数GetDC获得。2.创建这个DC的内存映像。这样做的目的是建立一张"隐藏的画纸"把位图"画"在上面,作缓冲之用。完成这项工作后,我们就通过个函数把"画纸"
5、上的位图复制到真正的DC中。这就是在屏幕上快速显示图象的双缓冲技术。(译者:可以减少图象抖动)这张"画纸"用API函数CreateCompatibleDC建立,下面是它的完型:CreateCompatibleDCprotohdc:HDC如果函数执行成功,将返回DC内存映像也即"画纸"的句柄。1.现在我们已经有了"画纸"可以把位图画在上面了。这可以通过API函数SelectObject完成,其中第一个参数是"画纸"的句柄,第二个参数则是位图的句柄,下面是函数的完型.SelectObjectprotohdc:HDC,hGdiObject:DWORD1.现在位图已经画在"画纸"上了。下步我们要把位
6、图复制到真正的DC中。有很多API函数都能完成这项工作,例如BitBlt和StretchBlto函数目tBlt仅仅:每个DC的内容简单地复制到另个DC中,而函数StretchBlt则能够自动调整源DC复制内容的大小己适应目的DC的输出区域大小,因此前者比后者速度更快。在这里我们只使用函数BitBlt,下面是它的完型:BitBltprotohdcDest:DWORD,nxDest:DWORD,nyDest:DWORD,nWidth:DWORD,nHeight:DWORD,hdcSrc:DWORD,nxSrc:DWORD,nySrc:DWORD,dwROP:DWORDhdcDest目的I己的句柄
7、。皿Dest,nyDest目的DC输出区域的左上角坐标。nWidth,nHeight目的DC输出区域的长和宽。hdcSrc源DC的句柄。-nbet-m1m11oanononntdrvvvvvvetoooo皿Src,nySrc源DC中所要复制区域的左上角坐标。dwROP屏面运算码CROP)。该参数用以确定复制内容的颜色与输出区域原来的颜色按movwc.cbWndExtra,NULL--LKLKLKLK哪e
此文档下载收益归作者所有