Private 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 Const SRCCOPY = &HCC0010Private Sub Timer1_Timer()
    BitBlt Picture1.hdc, 126, 0, 16, 28, Picture2.hdc, 16 * Int(Mid$(Time, 8, 1)), 0, SRCCOPY 
End Sub上面的代码是从图片框2截取图片到图片框1的,如何修改让他可以从图像框2截取图片到图像框1呢?

解决方案 »

  1.   

        上面的代码是从图片框2截取图片到图片框1的,
    如何修改让他可以从图像框2截取图片到图像框1呢?很矛盾,都不知你要问什么?
    是不是想问
    如何修改让他可以从图像框1截取图片到图像框2呢?
    如果是这样,那么就这么写
    BitBlt Picture2.hdc, 126, 0, 16, 28, Picture1.hdc, 16 * Int(Mid$(Time, 8, 1)), 0, SRCCOPY 当然你的处理目的我不清楚,所以坐标我没换,只换了对象
      

  2.   


    图片框控件和图像框控件不一样的吧?图片框是Picture1,图像框是Image1,把Picture1.hdc换成Image1.hdc就不可以,所以才问如何实现Image2里的图片截取并放到Image1?
      

  3.   


    楼主只要稍微查看一下BITBLT这个API的参数说明就会明白了, 一个HDC是SOURCE即图像源,另一个HDC是DESTINATION即目标, 其它几个参数无非是截取的位置和大小,自己改一下参数就可以随心所欲调用了,这不是什么很难的事吧
      

  4.   

    3楼说只要稍微查看一下BITBLT这个API的参数说明就会明白了, 一个HDC是SOURCE即图像源,另一个HDC是DESTINATION即目标, 其它几个参数无非是截取的位置和大小,自己改一下参数就可以随心所欲调用了,这不是什么很难的事吧
    那3楼的兄弟,你把代码里的Picture1.hdc和Picture2.hdc换成Image1.hdc和Image2.hdc看会不会出错?
      

  5.   

    Image1有hDC属性?你自己做的吗?呵呵
      

  6.   

    如果你使用的是 VB 标准控件中的 Image 控件,那么它是没有 hDC 和 hWnd 属性的,
    你这么个用法,不出错才怪
      

  7.   

    我当然知道Image没有hDC和hWnd属性,但是通过代码可以实现,但是不知道代码怎么写而已
      

  8.   

    既然知道没有 hDC 和 hWnd 属性,那和来 Image1.hdc 的写法?
    都不知道你想表达什么意思,是要更改Image1里的图像还是什么。
    如果你的想法是更改Image里的图像,直接设置Picture属性就可以了。
    如果你想找个位置处理图像然后让Image显示处理好的图像,可以有几种
    方法:
    1、通过一个PictureBox来处理图像,然后取PictureBox的Image属性
    赋值给Image对象的Picture属性。
    2、通过GDI创建一个设备,然后通过内存设备处理好图像将设备图像转换
    成Picture类型再赋值给Image对象的Picture属性。
    3、通过Image对象Picture属性的位图句柄,然后更改其数据,然后刷新
    Image对象。还有,Image设计出来的目的不是为了让人处理图形的,而是实现简单的
    图形显示,所以也就没有 hDC 和 hWnd 这样的属性。就像一把裁纸刀,
    本来设计出来是为了裁纸,但如果你想用它来坎骨头或坎材,不是不行,
    但会非常累,你想用Image控件处理设备图像的想法也是一样的。
      

  9.   


    Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
    Private 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 Const SRCCOPY = &HCC0020 ' (DWORD) dest = sourcePrivate Sub Command1_Click()
        Dim lMemDC  As Long
        Dim lBitmap As Long
        Dim lMode   As Long
        
        lMode = Picture1.ScaleMode
        Picture1.ScaleMode = 3
         
        lMemDC = CreateCompatibleDC(Picture1.hdc)
        lBitmap = SelectObject(lMemDC, Image1.Picture.Handle)
        BitBlt Picture1.hdc, 0, 0, Picture1.Width, Picture1.Height, lMemDC, 0, 0, SRCCOPY
        SelectObject lMemDC, lBitmap
        DeleteDC lMemDC
        
        Picture1.ScaleMode = lMode
    End Sub
      

  10.   

    一定要用image控件吗??把这个image放到picture控件里,可以截取的,这样做影响效果吗??
      

  11.   

    如果你的目的只是处理显示透明图像,那么没必要去考虑Image对象,用PictureBox对象也可以的
    http://blog.csdn.net/SupermanKing/archive/2008/12/16/3526090.aspx
    即使你真的要用Image对象显示处理后透明的效果,也不是按你的想法实现的,需要用到GDI+来处理,
    最后还是我上面说的方法,将处理好的图像转成 Picture 类型再赋值给 Image 对象的 Picture 属性。
    自己有想法是好的,但是要有技术基础后再订下研究方向,不然方向错了就会走进死胡同。
    所以当你没有确定方向是否正确的时候,最好问一下方向性的问题再问实质的技术问题。
    比如先问:“有什么方法可以实现透明图像的显示?”,然后再问具体的技术问题。
      

  12.   

    自己改了一下图片的autoredraw属性为true就好了,过这样做好麻烦,并且源图和掩码图做不好的话,那不是显示很糟糕,特别是显示很复杂图片的时候.
      

  13.   

    如果处理透明位图的话 建议你使用TransparentBlt API,不用创建掩码位图,直接处理就可以了
      

  14.   

    TransparentBlt API 功能很强大,支持透明处理、缩放、局部放大等, 
    Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
    Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As LongPrivate Declare Function TransparentBlt Lib "Msimg32.dll" _
        ( _
            ByVal hdcDest As Long, _
            ByVal x As Long, _
            ByVal y As Long, _
            ByVal w As Long, _
            ByVal h As Long, _
            ByVal hdcSrc As Long, _
            ByVal x1 As Long, _
            ByVal y1 As Long, _
            ByVal w1 As Long, _
            ByVal h1 As Long, _
            ByVal cr As Long _
        ) As Long
    Private Sub Command2_Click()
        Dim objImg  As StdPicture
        Dim lMode   As Long
        Dim lWidth  As Long
        Dim lHeight As Long
        Dim lMemDC  As Long
        Dim hBitmap As Long
        Dim x&, y&, w&, h&, w1&, h1&
        
        lMode = Picture1.ScaleMode
        Picture1.ScaleMode = 3
        
        Set objImg = LoadPicture("e:\1.bmp")
        w1 = ScaleX(objImg.Width, vbHimetric, vbPixels)
        h1 = ScaleY(objImg.Height, vbHimetric, vbPixels)
        
        With Picture1
            x = .ScaleLeft
            y = .ScaleTop
            w = .ScaleWidth
            h = .ScaleHeight
        End With
        lMemDC = CreateCompatibleDC(Picture1.hdc)
        hBitmap = SelectObject(lMemDC, objImg.Handle)
        
        ' 假设透明色为白色
        Dim lMask As Long
        lMask = RGB(255, 255, 255)
        TransparentBlt Picture1.hdc, x, y, w, h, lMemDC, 0, 0, w1, h1, lMask
             
        SelectObject lMemDC, hBitmap
        DeleteDC lMemDC
        
        Set objImg = Nothing
    End Sub