BitBlt,StretchBlt,CreateCompatibleDC函数学习

2893 人浏览 | 时间: 2015-10-20 21:48:15 | 作者: 145742784

之前,我学习MFC时,碰到了这三个函数,之前学的有点蒙,现在,结合window程序设计“圣经”的学习,还有自己的理解,写下这篇文章。

windows程序中,存储图像信息有两种方法,位图,图元文件。

BitBlt(hdcDst, xDst, yDst, cx, cy, hdcSrc, xSrc, ySrc, dwROP);
例子:
BItBlt(hdcClient, 0, 0, cxSource, cySource, hdcWindow, 0, 0, SRCCOPY);
BitBlt(读作“bit blit")表示”位块传输。
BitBlt函数 是像素移动者,或者,更生动的说,点阵撞击者。整个·视频显示当成一个大的位图。你在屏幕上看到的像素被表示为位,存在视频显示适配板卡的内存中。视频显示的任何矩形区域也是一个位图,它的尺寸是它所包含的行数和列数。当我们把图像从视频显示的一个区域复制到另一个区域,我们就需要这个函数。
BitBlt函数把像素从一个设备环境(叫做“源”)的矩形区域,传输给另一个设备环境(也就是“目标”)中的同样大小的矩形区域。
xSrc和ySrc参数指定源图像的左上角的坐标位置,在BitBlt中,这两个参数被设为0,标示图像从原设备哈U南京的左上角开始(也就是整个窗口)。
cx和cy参数指定图像的宽和高,BITBLT使用从GetSystemMetrics函数中获得的信息来计算这些值。
xDst和yDst参数指定图像要被复制到的区域的左上角的坐标位置。在BITBLT中,这两个参数被设成不同的值,以多次复制图像。对第一次的BITBLT调用,这两个参数被设为0,将图像复制到客户区得左上角。
StretchBlt(hdcDst, xDst, yDst, cxDst, cyDst, hdcSrc, xSrc, ySrc, cxSrc, cySrc, dwROP);
例子:
StretchBlt(hdcClient, 0 , 0 , cxClient, cyClieny, hdcWindow, 0, 0, cxSource, cySource, MERGECOPY);
在BitBlt函数中,目标图像跟源图像的大小一样,是因为函数只有两个参数来指定宽和高。如果我们想在复制时拉伸或压缩图像的大小,就可以用StretchBlt函数
这个函数加了两个参数,她现在包括目标和源各自的宽和高。你可以自己对比例子理解看看
接着我们看看这两个函数参数的最后一个参数dwROP,这是光栅操作。

在这表里,ROP代码栏的值是我们传给BItBlt或StretchBlt的最后一个参数的数值。在名称栏中的名称在WINGDI.H中被定义为这些值。ROP代码的低位字的数值帮助设备驱动来完成光栅操作。高位字则是一个结余0和255的数值。这个值跟在第二栏中显示的位样式一样,她在图案,源,目标的位之间的位操作的结果。具体的我就不详述了。
我就简述下,当我们只需要简单的把源位图复制到目标位图,我们就只需在BitBlt和StretchBlt函数指定最后一个参数为SRCCOPY。

内存设备环境---当我们使用GDI位图对象时,需要用到内存设备环境。通常,设备环境对应于特定的图形输出设备(比如视频显示或打印机)和设备驱动。内存设备环境只存在于内存。他不是一个真实的图形输出设备,但是用大家的话说,他和特定的真实设备“兼容”。
要创建一个内存设备环境,必须有一个对应于真是设备的设备句柄。假设句柄是hdc,则可以像下面这样创建一个内存设备环境:

hdcMen = CreateCompatibleDC(hdc);

通常这个函数调用比这条语句简单。如果把参数设成NULL,windows将创建与视频显示兼容的内存设备环境。应用程序创建任何内存设备环境后,最终都应该调用DeleteDC销毁它。