我在测试的过程中发现:
如果新建一个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 LongPrivate 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绘制上去的图就没法保持。不知道为何会这样。

解决方案 »

  1.   

    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 
      

  2.   

    晕,好像说错了,你看看这个吧,以前写的
    http://blog.csdn.net/worldy/article/details/7381106