[原创]几个绘图有关的API函数的个人理解

作者在 2008-01-09 11:28:03 发布以下内容

函数说明来自: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函数删除。删除前,其所有对象应回复初始状态

 
个人理解:
对绘图区域,在内存中创建一个备份,当画图时,先在内存中把图片画好,然后用BitBlt函数,把整个区域复制到窗体上的PictureBox内.因为如果直接在窗体的PictureBox内画图,会导致PictureBox闪的非常厉害.
其实这个就跟PictureBox控件设置AutoRedraw为True效果一样.
 
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环境下,如在一次世界传输中要求在源设备场景中进行剪切或旋转处理,这个函数的执行会失败
如目标和源DC的映射关系要求矩形中像素的大小必须在传输过程中改变,那么这个函数会根据需要自动伸缩、旋转、折叠、或切断,以便完成最终的传输过程

deRop的可选参数:

vbDstInvert:目标位图取反
vbSrcCopy:源位图直接覆盖目标位图
vbSrcAnd:源位图与目标位图进行“与”操作
bSrcInvert:源位图与目标位图进行“异或”操作
vbSrcPaint:源位图与目标位图进行“或”操作
vbNotSrcCopy:源位图取反
vbSrcErase:目标位图取反,再与源位图进行“与”操作
vbNotSrcErase:源位图与目标位图进行“或非”操作
vbMergePaint:源位图取反,再与目标位图进行“或”操作

个人理解:

这个函数就是把图片逐个像素在两个互相兼容的DC中互相拷贝的,速度比较快.估计就是从一段内存的直接复制到另一段内存

最后一个参数,一般用vbSrcCopy,这个是整个区域拷贝

原创 | 阅读 2696 次
文章评论,共0条
游客请输入验证码