pic2为目标,pichx为源目标(待拷贝的图像+标签):
Dim iWd As Long, iHt As Long
iWd = PicHX.Width
iHt = PicHX.Height
Pic2.Cls
BitBlt Pic2.hDc, 0, 0, iWd, iHt, PicHX.hDc, 0, 0, vbSrcCopy
SavePicture Pic2.Image, App.Path & "\test.bmp"
这时打开test.bmp,发现保存的图像为Pic2中空图的样子

解决方案 »

  1.   

    可以采取屏幕抓图的办法解决。祥见我的一个回复(里面有个抓图程序),凡是屏幕上可见的区域都可以抓,哪怕是pichx被其他窗口遮住一部份了,这个窗口也会被抓住:
    http://community.csdn.net/Expert/topic/5765/5765132.xml?temp=.6149256
      

  2.   

    老兄,我这样使用你的代码,怎么还是不行呀!到底哪点错了,请指点一下。
    iWd = PicHX.Width
    iHt = PicHX.Height
    Pic2.Cls
    GetScreenBitmap Form1.hwnd, PicHX.hwnd, 0, 0, iWd, iHt ', 0, 0, vbSrcCopy
    Pic2.Picture = Clipboard.GetData
    SavePicture Pic2.Image, App.Path & "\test.bmp"
    '抓取指定位置的屏幕图像
    Option Explicit
     
    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 ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
    Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function EmptyClipboard Lib "user32" () As Long
    Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
    Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
    Private Declare Function CloseClipboard Lib "user32" () As LongPrivate 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 = source' 抓取屏幕图像到剪贴板
    Public Function GetScreenBitmap(FormHwnd As Long, SourceDC As Long, Left As Long, Top As Long, Right As Long, Bottom As Long)
        Dim rWidth As Long
        Dim rHeight As Long
        'Dim SourceDC As Long
        Dim DestDC As Long
        Dim BHandle As Long
        Dim Wnd As Long
        Dim DHandle As Long
        On Error GoTo ChenJL1031
        rWidth = Right - Left
        rHeight = Bottom - Top
        'SourceDC = CreateDC("DISPLAY", 0, 0, 0)
        DestDC = CreateCompatibleDC(SourceDC)
        BHandle = CreateCompatibleBitmap(SourceDC, rWidth, rHeight)
        SelectObject DestDC, BHandle
        BitBlt DestDC, 0, 0, rWidth, rHeight, SourceDC, Left, Top, &HCC0020
        Wnd = FormHwnd 'Screen.ActiveForm.hwnd
        OpenClipboard Wnd
        EmptyClipboard
        SetClipboardData 2, BHandle
        CloseClipboard
        DeleteDC DestDC
        ReleaseDC DHandle, SourceDC
        Exit Function
        
    ChenJL1031:
           MsgBox ("抓图不成功!")
    End Function
      

  3.   

    哦,忘了,这个代码是给那个人看的。要改一下:' 抓取屏幕图像到剪贴板
    Public Function GetScreenBitmap(Left As Long, Top As Long, Right As Long, Bottom As Long)
        Dim rWidth As Long
        Dim rHeight As Long
        Dim SourceDC As Long
        Dim DestDC As Long
        Dim BHandle As Long
        Dim Wnd As Long
        Dim DHandle As Long
        On Error GoTo ChenJL1031
        rWidth = Right - Left
        rHeight = Bottom - Top
        SourceDC = CreateDC("DISPLAY", 0, 0, 0) 'DISPLAY是整个桌面
        DestDC = CreateCompatibleDC(SourceDC)
        BHandle = CreateCompatibleBitmap(SourceDC, rWidth, rHeight)
        SelectObject DestDC, BHandle
        BitBlt DestDC, 0, 0, rWidth, rHeight, SourceDC, Left, Top, &HCC0020
        Wnd = Screen.ActiveForm.hwnd
        OpenClipboard Wnd
        EmptyClipboard
        SetClipboardData 2, BHandle
        CloseClipboard
        DeleteDC DestDC
        ReleaseDC DHandle, SourceDC
        Exit Function
        
    ChenJL1031:
           MsgBox ("抓图不成功!")
    End FunctionLeft,Top是抓取区域左上角座标;Right,Bottom是抓取区域右下角座标。都桌面绝对座标。
      

  4.   

    调用抓图函数,应该是:
    GetScreenBitmap X1, Y1, X2, Y2
    Pic2.Picture = Clipboard.GetData
    pic2.refresh
      

  5.   

    你改的只能针对整个桌面,我想要达致的目的是只针对form1窗体中pichx(源目标)和pic2(目标),显然按你的做,我必须另外写代码定位pichx在桌面上的绝对位置(这个,我确实不会);另外,你的SourceDC,我到底该传那个参数PicHX.hdc还是PicHX.hwnd,这两个有啥区别?