【控件】PictureBox属性的疑问
我在测试的过程中发现:如果新建一个PictureBox,直接使用
Bitblt API函数将图绘制在他上面:
如下:
Public Declare Function BitBlt Lib "gdi32" (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
Private Sub Command1_Click()
Picture2.AutoRedraw = True '这里将autoredraw设置为true,可以打开一个内存绘图缓冲区
BitBlt Picture2.hDC, 0, 0, 300, 300, Picture1.hDC, 0, 0, vbSrcCopy ' 将图像绘制到缓冲区中,并没有写入PictureBox
Picture2.Refresh '将缓冲区中的内容沉淀到PictureBox中
Picture2.AutoRedraw = False '重新禁止图片框中的数据被覆写。
End Sub
则图片框在被其他窗口遮住后,可以正常重绘。保持住我使用Bitblt绘制的图。
而。如果我使用的Picture1.Picture=LoadPicture(文件路径) 这种方式为PictureBox设置图片的话
使用Bitblt绘制上去的图就没法保持。不知道为何会这样。 --------------------编程问答-------------------- autoredraw设置为true,实际上是为窗口创建一个内存缓存区,之所以能保存背景是因为内存缓存区随时拷贝到窗口的缓存区,但bitblt是复制到真正视频的hdc中,因此不能保存
你可以尝试一下:
Private Sub Command1_Click()
Picture2.AutoRedraw = false'这里将autoredraw设置为true,可以打开一个内存绘图缓冲区 BitBlt Picture2.hDC, 0, 0, 300, 300, Picture1.hDC, 0, 0, vbSrcCopy ' 将图像绘制到缓冲区中,并没有写入PictureBox Picture2.Refresh '将缓冲区中的内容沉淀到PictureBox中 Picture2.AutoRedraw = true '按照ms说,这样处理会将物理的hdc内容拷贝到内存hdc
End Sub
--------------------编程问答-------------------- 晕,好像说错了,你看看这个吧,以前写的
http://blog.csdn.net/worldy/article/details/7381106 --------------------编程问答-------------------- 这个问题我会过一段时间彻底测试下!
补充:VB , 基础类