Private Sub Command1_Click()
  Picture2.AutoRedraw = True
  BitBlt Picture2.hdc, 0, 0, Picture1.Width, Picture1.Height, Picture1.hdc, 0, 0, SRCCOPY
  Picture2.AutoRedraw = False
End Sub真是奇怪啊,以前没发现去掉 Picture2.AutoRedraw = True 却能画出来

解决方案 »

  1.   

    还有 加上这一句 picture2 会被清空Picture2.Picture = Picture2.Image
      

  2.   

    AutoRedraw = True 后采用双缓冲绘图,不调用 VB 的绘图方法就不会刷新到界面。
    加上用 Refresh 强制刷新试试
    BitBlt Picture2.hdc, 0, 0, Picture1.Width, Picture1.Height, Picture1.hdc, 0, 0, SRCCOPY 
    Picture2.Refresh
      

  3.   

    又:既然最终 AutoRedraw = False,那么就失去双缓冲的意义了。
      

  4.   

    双缓冲绘图是啥意思……我的代码是这样的  BitBlt Picture2.hdc, 0, 0, Picture1.Width, Picture1.Height, Picture1.hdc, 0, 0, SRCCOPY
      For N = 1 To Picture1.Width
        For M = 1 To Picture1.Height
          P1 = GetPixel(Picture1.hdc, N, M)
          If P1 = RGB(0, 0, 0) Then
            P2 = SetPixel(Picture2.hdc, N + Picture1.Width, M, RGB(255, 255, 255))
          Else
            P2 = SetPixel(Picture2.hdc, N + Picture1.Width, M, RGB(0, 0, 0))
          End If
        Next M
      Next N  SavePicture Picture2.Image, App.Path + "\2.bmp"
    图可以画出来,但保存的是一张白图试了Picture2.Refresh,也给清空了
      

  5.   

    1.如果你要用 SrcCopy 则需加上常量宣告 Const SRCCOPY = &HCC0020
      直接使用VbSrcCopy即可.2.Bitblt来源如果为不可见(在窗体外或被遮盖),必需将AutoRedraw设为True3.BitBlt这个API使用的座标与图片尺寸都是用象素的,如果你的Picture1或Picture2的ScaleMode没有设定为3 则你必需将座标与图片尺寸都要除上15(Screen.TwipsPerPixelX 或Screen.TwipsPerPixelY)
    Private Sub Command1_Click()
       Picture2.AutoRedraw = True
       BitBlt Picture2.hDC, 0, 0, 250, 350, Picture1.hDC, 0, 0, vbSrcCopy
       Picture2.Refresh
       SavePicture Picture2.Image, AppDisk & "tt.bmp"
       MsgBox "保存完成!"
    End Sub
      

  6.   

    谢谢cbm666了,问题解决,原来  Picture2.AutoRedraw = True 要和 Picture2.Refresh 一起用啊话说你能猜到我是VB吧里的谁吗?