函数说明来自:http://www.programfan.com/vbapi.asp 最新发现: 1 使用这些函数的时候,必须在form_load前面加一句ScaleMode = 3,然后所有使用到的长度单位,都应该是"像素(Pixel)",不能是原来的"堤(Twip)"了. 2 写在form_load里面的BitBlt函数没用,无法从内存中,将图像复制到PictureBox中. 有个解决办法是,设置PictureBox的AutoRedraw属性为False,然后BitBlt写在Form_Paint或者Form_Resize这两个事件中.不过这样会引起另一个问题,参见下面一点 3 PictureBox的AutoRedraw属性会跟BitBlt冲突,要用BitBlt复制图片的话,AutoRedraw属性要设置成False. 不过好像有个办法,可以在调用BitBlt函数后,用Picture1.Refresh,这样就可以显示了.而且也没有闪烁的现象,不过相对来说就麻烦了点 又发现个问题,这样弄的话,AutoRedraw属性就相当于False了 4 BitBlt跟源图像有关的三个参数,如果源图像是一个控件,那么这三个参数其实只是在桌面上圈定了一个范围,然后获取范围内的图像,而不管这个控件是否在这个位置. 这样说起来很不好理解.可以这样尝试,防止p1,p2两个图像框,然后在p1_paint里面写BitBlt p1.hdc, 0, 0, p1.Width, p1.Height, p2.hdc, 0, 0, vbSrcCopy 本来我以为这个就是复制p2图像到p1,可是将窗口最小化后再恢复,或者窗口被盖住,p1的图像并不是p2的图像,而是相当于用QQ截图截取p2这一部分的图像. CreateCompatibleDC |
VB声明 | |
Declare Function CreateCompatibleDC Lib "gdi32" Alias "CreateCompatibleDC" (ByVal hdc As Long) As Long | |
说明 | |
创建一个与特定设备场景一致的内存设备场景 | |
返回值 | |
Long,新设备场景句柄,若出错则为零 | |
参数表 | |
参数 | 类型及说明 |
hdc | Long,设备场景句柄。新的设备场景将与它一致。也可能为0以创建一个与屏幕一致的设备场景 |
注解 | |
在绘制之前,先要为该设备场景选定一个位图。不再需要时,该设备场景可用DeleteDC函数删除。删除前,其所有对象应回复初始状态 |
SelectObject |
VB声明 | |
Declare Function SelectObject Lib "gdi32" Alias "SelectObject" (ByVal hdc As Long, ByVal hObject As Long) As Long | |
说明 | |
每个设备场景都可能有选入其中的图形对象。其中包括位图、刷子、字体、画笔以及区域等等。一次选入设备场景的只能有一个对象。选定的对象会在设备场景的绘图操作中使用。例如,当前选定的画笔决定了在设备场景中描绘的线段颜色及样式 | |
返回值 | |
Long,与以前选入设备场景的相同hObject类型的一个对象的句柄,零表示出错。如选定的对象是一个区域(Region),结果就是下列常数之一:SIMPLEREGION, COMPLEXREGION 或 NULLREGION 对区域进行描述, GDI_ERROR 表示出错 | |
参数表 | |
参数 | 类型及说明 |
hdc | Long,一个设备场景的句柄 |
hObject | Long,一个画笔、位图、刷子、字体或区域的句柄 |
注解 | |
返回值通常用于获得选入DC的对象的原始值。绘图操作完成后,原始的对象通常选回设备场景。在清除一个设备场景前,务必注意恢复原始的对象 |
个人理解:
就比如一个画图板,每一个时刻,只能画一种颜色的线,如果要画别的颜色的线,就先要用这个函数,选中那种颜色的画笔,然后再画.hdc就是这个画图板的句柄,hObject是选择的东西,可以是画笔,位图,刷子等东西.
因为每个画图板只能用一个画笔,所以设置了画笔之后,原来的画笔就被覆盖掉了.这个函数会返回被覆盖掉的东西的句柄,一般是用一个long型的变量,把这个句柄保存起来.
程序运行完毕之后,必须将整个画图板恢复成原始状态,所以上面保存的句柄就有用了,再调用一次这个函数,就可以恢复了.而这次调用的返回值,是我们设置进去的画笔,最后用DeleteObject删除掉,干干净净
BitBlt |
VB声明 | |
Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long | |
说明 | |
将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容 | |
返回值 | |
Long,非零表示成功,零表示失败。会设置GetLastError | |
参数表 | |
参数 | 类型及说明 |
hDestDC | Long,目标设备场景 |
x,y | Long,对目标DC中目标矩形左上角位置进行描述的那个点。用目标DC的逻辑坐标表示 |
nWidth,nHeight | Long,欲传输图象的宽度和高度 |
hSrcDC | Long,源设备场景。如光栅运算未指定源,则应设为0 |
xSrc,ySrc | Long,对源DC中源矩形左上角位置进行描述的那个点。用源DC的逻辑坐标表示 |
dwRop | Long,传输过程要执行的光栅运算 |
注解 | |
在NT环境下,如在一次世界传输中要求在源设备场景中进行剪切或旋转处理,这个函数的执行会失败 |
deRop的可选参数:
vbDstInvert:目标位图取反
vbSrcCopy:源位图直接覆盖目标位图
vbSrcAnd:源位图与目标位图进行“与”操作
bSrcInvert:源位图与目标位图进行“异或”操作
vbSrcPaint:源位图与目标位图进行“或”操作
vbNotSrcCopy:源位图取反
vbSrcErase:目标位图取反,再与源位图进行“与”操作
vbNotSrcErase:源位图与目标位图进行“或非”操作
vbMergePaint:源位图取反,再与目标位图进行“或”操作
个人理解:
这个函数就是把图片逐个像素在两个互相兼容的DC中互相拷贝的,速度比较快.估计就是从一段内存的直接复制到另一段内存
最后一个参数,一般用vbSrcCopy,这个是整个区域拷贝