Option Explicit
Private Type POINTAPI
      X As Long
      Y As Long
End Type
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc 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 nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Private Const SRCCOPY = &HCC0020
'Private Const SWP_NOMOVE = &H2
'Private Const SWP_NOSIZE = &H1
'Private Const HWND_TOPMOST = -1
Private Const Flags = &H2 Or &H1
Dim Pos As POINTAPIPrivate Sub Form_Load()
    Form1.ScaleMode = 3
    SetWindowPos Me.hwnd, -1, 0, 0, 0, 0, Flags
    HScroll1.Max = 59
    HScroll1.Min = 1
    HScroll1.LargeChange = 5
    HScroll1.SmallChange = 1
    
End Sub
Private Sub Form_Resize()
    Text1.Width = 800 'Me.ScaleX(Me.Width, 1, 3) - 9
    Text1.Height = 600 'Me.ScaleY(Me.Height, 1, 3) - 50
    HScroll1.Width = Text1.Width
    HScroll1.Top = Text1.Height + 7
End SubPrivate Sub AddSee(倍数 As Single, ShowObj As Object)
    Dim Sx As Integer
    Dim Sy As Integer
    Dim ShowW As Long
    Dim ShowH As Long
    Dim PicW As Long
    Dim PicH As Long
    PicW = ShowObj.Width
    PicH = ShowObj.Height
    GetCursorPos Pos
    ShowW = PicW / 倍数
    ShowH = ShowW * (PicH / PicW)
    Sx = IIf(Pos.X < ShowW / 2 Or Pos.X > 800 - ShowW / 2, IIf(Pos.X < ShowW / 2, 0, 800 - ShowW), Pos.X - ShowW / 2)
    Sy = IIf(Pos.Y < ShowH / 2 Or Pos.Y > 600 - ShowH / 2, IIf(Pos.Y < ShowH / 2, 0, 600 - ShowH), Pos.Y - ShowH / 2)
    StretchBlt GetDC(ShowObj.hwnd), 0, 0, PicW, PicH, GetDC(0), Sx, Sy, 800, 600, SRCCOPY
End SubPrivate Sub Command1_Click()
AddSee HScroll1.Value, Text1
SavePicture Me.Text1.Image, App.Path & "\1.bmp" '<==== 它怎么保存的图片是空的?
End Sub

解决方案 »

  1.   

    对不起,其中的 Text1 是 PictureBox 控件,我为了偷懒没有改名。
      

  2.   

    文本框无image属性,我也经常忘记这一点。
      

  3.   

    你改成save它的picture属性,而不是image属性。
    StretchBlt画出来的东西好像是在picture属性里的。
      

  4.   

    to fishzone(阿愚-本ID已经消毒)   你的意思是:SavePicture Me.Picture.Picture, App.Path & "\1.bmp" 吧?
       问题依旧!!
      

  5.   

    SavePicture Me.Picture.image, App.Path & "\1.bmp"
      

  6.   

    to yefanqiu(叶帆)    问题依旧!
      

  7.   

    picture.antoredraw=true
    试一下
      

  8.   

    to z_yanjie(困惑中!!!!) 
       是 AutoRedraw 吧,我试过,图像一闪就没了。
      

  9.   

    '捕捉整个屏幕的图像,并且保存。Private Type PALETTEENTRY
       peRed As Byte
       peGreen As Byte
       peBlue As Byte
       peFlags As Byte
    End TypePrivate Type LOGPALETTE
       palVersion As Integer
       palNumEntries As Integer
       palPalEntry(255) As PALETTEENTRY
    End TypePrivate Type GUID
       Data1 As Long
       Data2 As Integer
       Data3 As Integer
       Data4(7) As Byte
    End TypePrivate Const RASTERCAPS As Long = 38
    Private Const RC_PALETTE As Long = &H100
    Private Const SIZEPALETTE As Long = 104Private Type RECT
       Left As Long
       Top As Long
       Right As Long
       Bottom As Long
    End TypePrivate Declare Function CreateCompatibleDC Lib "GDI32" (ByVal hDC 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 GetDeviceCaps Lib "GDI32" (ByVal hDC As Long, ByVal _
            iCapabilitiy As Long) As Long
    Private Declare Function GetSystemPaletteEntries Lib "GDI32" (ByVal hDC As Long, _
            ByVal wStartIndex As Long, ByVal wNumEntries As Long, lpPaletteEntries _
            As PALETTEENTRY) As Long
    Private Declare Function CreatePalette Lib "GDI32" (lpLogPalette As LOGPALETTE) _
            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 hDCDest As Long, ByVal XDest As _
            Long, ByVal YDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, _
            ByVal hDCSrc As Long, ByVal XSrc As Long, ByVal YSrc As Long, ByVal dwRop _
            As Long) As Long
    Private Declare Function DeleteDC Lib "GDI32" (ByVal hDC As Long) As Long
    Private Declare Function GetForegroundWindow Lib "user32" () As Long
    Private Declare Function SelectPalette Lib "GDI32" (ByVal hDC As Long, ByVal hPalette _
            As Long, ByVal bForceBackground As Long) As Long
    Private Declare Function RealizePalette Lib "GDI32" (ByVal hDC As Long) As Long
    Private Declare Function GetWindowDC Lib "user32" (ByVal hWnd As Long) As Long
    Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
    Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As _
            RECT) As Long
    Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hDC As _
            Long) As Long
    Private Declare Function GetDesktopWindow Lib "user32" () As LongPrivate Type PicBmp
       Size As Long
       Type As Long
       hBmp As Long
       hPal As Long
       Reserved As Long
    End TypePrivate Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As _
            PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPictureDisp) As Long'capturescreen函数捕捉整个屏幕图象
    Public Function CaptureScreen() As Picture
        Dim hWndScreen As Long    '获得桌面的窗口句柄
        hWndScreen = GetDesktopWindow()
        Set CaptureScreen = CaptureWindow(hWndScreen, False, 0, 0, Screen.Width _
            \ Screen.TwipsPerPixelX, Screen.Height \ Screen.TwipsPerPixelY)
    End FunctionPublic Function CaptureWindow(ByVal hWndSrc As Long, ByVal Client As Boolean, ByVal _
        LeftSrc As Long, ByVal TopSrc As Long, ByVal WidthSrc As Long, ByVal HeightSrc _
        As Long) As Picture    Dim hDCMemory As Long
        Dim hBmp As Long
        Dim hBmpPrev As Long
        Dim r As Long
        Dim hDCSrc As Long
        Dim hPal As Long
        Dim hPalPrev As Long
        Dim RasterCapsScrn As Long
        Dim HasPaletteScrn As Long
        Dim PaletteSizeScrn As Long
        Dim LogPal As LOGPALETTE    If Client Then
            hDCSrc = GetDC(hWndSrc)
        Else
            hDCSrc = GetWindowDC(hWndSrc)
        End If    hDCMemory = CreateCompatibleDC(hDCSrc)
        hBmp = CreateCompatibleBitmap(hDCSrc, WidthSrc, HeightSrc)
        hBmpPrev = SelectObject(hDCMemory, hBmp)    '获得屏幕属性
        RasterCapsScrn = GetDeviceCaps(hDCSrc, RASTERCAPS)
        HasPaletteScrn = RasterCapsScrn And RC_PALETTE
        PaletteSizeScrn = GetDeviceCaps(hDCSrc, SIZEPALETTE)    '如果屏幕对象有调色板则获得屏幕调色板
        If HasPaletteScrn And (PaletteSizeScrn = 256) Then
            '建立屏幕调色板的拷贝
            LogPal.palVersion = &H300
            LogPal.palNumEntries = 256
            r = GetSystemPaletteEntries(hDCSrc, 0, 256, LogPal.palPalEntry(0))
            hPal = CreatePalette(LogPal)
            '将新建立的调色板选如建立的内存绘图句柄中
            hPalPrev = SelectPalette(hDCMemory, hPal, 0)
            r = RealizePalette(hDCMemory)
        End If    '拷贝图象
        r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hDCSrc, LeftSrc, TopSrc, vbSrcCopy)    hBmp = SelectObject(hDCMemory, hBmpPrev)    If HasPaletteScrn And (PaletteSizeScrn = 256) Then
            hPal = SelectPalette(hDCMemory, hPalPrev, 0)
        End If    '释放资源
        r = DeleteDC(hDCMemory)
        r = ReleaseDC(hWndSrc, hDCSrc)    Set CaptureWindow = CreateBitmapPicture(hBmp, hPal)
    End Function
    Public Function CreateBitmapPicture(ByVal hBmp As Long, ByVal hPal As Long) As Picture
      Dim r As Long   Dim Pic As PicBmp
       Dim IPic As IPicture
       Dim IID_IDispatch As GUID   '填充IDispatch界面
       With IID_IDispatch
          .Data1 = &H20400
          .Data4(0) = &HC0
          .Data4(7) = &H46
       End With   '填充Pic
       With Pic
          .Size = Len(Pic)          ' Pic结构长度
          .Type = vbPicTypeBitmap   ' 图象类型
          .hBmp = hBmp              ' 位图句柄
          .hPal = hPal              ' 调色板句柄
       End With   '建立Picture图象
       r = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)   '返回Picture对象
       Set CreateBitmapPicture = IPic
    End Function
    '用法:
        Set picGet.Picture = CaptureScreen()    SavePicture picGet.Picture , strBmpFile
      

  10.   

    to fishzone(阿愚-本ID已经消毒)您好,谢谢您的代码,执行 CaptureScreen()时有停滞现象。如下:Dim i
    For i = 1 To 50
    DoEvents
    Set picGet.Picture = CaptureScreen()
    Next我的目的是避免停滞。
      

  11.   

    可能因为用到的系统资源多一点。
    你可以用timer来试试看。
      

  12.   

    唉,帮你看看吧
    ShowObj.AutoReDraw = True
    ShowObj.ScaleMode = vbPixels
    StretchBlt ShowObj.hdc, 0, 0, PicW, PicH, GetDC(0), Sx, Sy, 800, 600, SRCCOPY
    这样应该没有问题了