用Bitblt赋给PictureBox
用SavePicture函数保存为位图

解决方案 »

  1.   

    Const RC_PALETTE As Long = &H100
    Const SIZEPALETTE As Long = 104
    Const RASTERCAPS As Long = 38
    Private Type PALETTEENTRY
        peRed As Byte
        peGreen As Byte
        peBlue As Byte
        peFlags As Byte
    End Type
    Private Type LOGPALETTE
        palVersion As Integer
        palNumEntries As Integer
        palPalEntry(255) As PALETTEENTRY
    End Type
    Private Type GUID
        Data1 As Long
        Data2 As Integer
        Data3 As Integer
        Data4(7) As Byte
    End Type
    Private Type PicBmp
        Size As Long
        Type As Long
        hBmp As Long
        hPal As Long
        Reserved As Long
    End Type
    Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
    Private 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 SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject 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 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 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 Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
    Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As LongFunction CreateBitmapPicture(ByVal hBmp As Long, ByVal hPal As Long) As Picture
        Dim R As Long, Pic As PicBmp, IPic As IPicture, IID_IDispatch As GUID    
        With IID_IDispatch
            .Data1 = &H20400
            .Data4(0) = &HC0
            .Data4(7) = &H46
        End With
            
        With Pic
            .Size = Len(Pic)
            .Type = vbPicTypeBitmap
            .hBmp = hBmp
            .hPal = hPal
        End With    
        R = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)    
        Set CreateBitmapPicture = IPic
    End Function
    Function hDCToPicture(ByVal hDCSrc As Long, ByVal LeftSrc As Long, ByVal TopSrc As Long, ByVal WidthSrc As Long, ByVal HeightSrc As Long) As Picture
        Dim hDCMemory As Long, hBmp As Long, hBmpPrev As Long, R As Long
        Dim hPal As Long, hPalPrev As Long, RasterCapsScrn As Long, HasPaletteScrn As Long
        Dim PaletteSizeScrn As Long, LogPal As LOGPALETTE    
        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)    Set hDCToPicture = CreateBitmapPicture(hBmp, hPal)
    End FunctionPrivate Sub Command1_Click()
        Set Picture1.Picture = hDCToPicture(GetWindowDC(Me.hwnd), 0, 0, Screen.Width / Screen.TwipsPerPixelX, Screen.Height / Screen.TwipsPerPixelY)
    End Sub
      

  2.   

    to hydnoahark(诺亚方舟) :
    需要那么多代码吗??Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd 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 LongPrivate Sub Command1_Click()
    R = BitBlt(Picture1.hDC, 0, 0, Me.Width, Me.Height, GetWindowDC(Me.hwnd), 0, 0, vbSrcCopy)
    End Sub
      

  3.   

    请教:GetDeviceCaps函数究竟是什么意思?
    MSDN上解释为:
    The GetDeviceCaps function retrieves device-specific information about a specified device.
    看不明白。有的书上说“GetDeviceCaps函数可以访问使用设备描述表的设备数据,应用程序指定相应设备描述表的句柄和说明该函数访问数据类型的索引来访问这些数据”。
    是什么意思?
    函数的返回值究意是什么?