RT
希望把Picture控件一点不变的打印出来,有没有比较简单直接的方法比如如果我在Picture上放一个Grid,希望出来的样子和看到的样子一样

解决方案 »

  1.   

    可以参考
    http://www.vbwm.com/forums/topic.asp?TOPIC_ID=3961
    -------------------------------------------Originally posted by AllenHow to print a picture box image to a printer. Example download is available below.
    -----------------------------------------------------------------------------------'Create an invisible picture control on your form (called Picture2 below), then paste in the code below onto your Form:Option Explicit
    Private Declare Function SendMessage Lib "user32" Alias _
                           "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
                            ByVal wParam As Long, ByVal lParam As Long) As LongPrivate Const twipFactor = 1440
    Private Const WM_PAINT = &HF
    Private Const WM_PRINT = &H317
    Private Const PRF_CLIENT = &H4&    ' Draw the window's client area.
    Private Const PRF_CHILDREN = &H10& ' Draw all visible child windows.
    Private Const PRF_OWNED = &H20&    ' Draw all owned windowsPrivate Sub PrintDiagram(CurrPicture As PictureBox, xp As Single, yp As Single, _
                             pcWidth As Single, pcHeight As Single)
    Dim rv As LongWith Picture2
       .Top = 0
       .Left = 0
       .Width = CurrPicture.Width
       .Height = CurrPicture.Height
    End WithPicture2.AutoRedraw = True
    rv = SendMessage(CurrPicture.hWnd, WM_PAINT, Picture2.hDC, 0)
    rv = SendMessage(CurrPicture.hWnd, WM_PRINT, Picture2.hDC, PRF_CHILDREN + PRF_CLIENT + PRF_OWNED)Picture2.Picture = Picture2.Image
    Picture2.AutoRedraw = False
    Printer.PaintPicture Picture2.Picture, xp * twipFactor, yp * twipFactor, _
                         pcWidth * twipFactor, pcHeight * twipFactor
    End Sub
    'Then call the PrintDiagram sub supplied with:
    ' the object name of the picture you want to print                (Picture1 in the example below)
    ' and the upper left point coordinate of where on the page to print  (1,3.5 in the example below)
    ' and the width and height of the picture to be printed on the printer (6,3 in the example below)Private Sub Command1_Click()
    PrintDiagram Picture1, 1, 3.5, 6, 3
    End SubPrivate Sub Form_Load()
    Picture1.ScaleLeft = -200
    End SubPrivate Sub Picture1_Click()
    Static cx As Long
    Picture1.CurrentX = cx
    Picture1.Print "teeesssst"
    cx = cx + 200
    End Sub
      

  2.   

    http://www.china-askpro.com/msg2/qa05.shtml如何将PictureBox中的图形与控件一起转换为BMP图 
        
         下面的方法实际上是抓取屏幕图象的方法。 
        如果要得到一个PictureBox中的图形(不包括覆盖在其上的控件),可以使用SavePicture Picture1.Picture "c:\test.bmp"语句将图形存盘。这种方法不管整个图形部分是否可见,都可以保存下来。 
        如果要包括覆盖在其上的控件,可以用下面的办法: 
        首先建立一个模块,输入以下内容: 
        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 ' Enough for 256 colors. 
        End Type 
         
        Private Type GUID 
         Data1 As Long 
         Data2 As Integer 
         Data3 As Integer 
         Data4(7) As Byte 
        End Type 
         
        #If Win32 Then 
         
         Private Const RASTERCAPS As Long = 38 
         Private Const RC_PALETTE As Long = &H100 
         Private Const SIZEPALETTE As Long = 104 
         
         Private Type RECT 
         Left As Long 
         Top As Long 
         Right As Long 
         Bottom As Long 
         End Type 
         
         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 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 Long 
         
         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 
         
        #ElseIf Win16 Then 
         
         Private Const RASTERCAPS As Integer = 38 
         Private Const RC_PALETTE As Integer = &H100 
         Private Const SIZEPALETTE As Integer = 104 
         
         Private Type RECT 
         Left As Integer 
         Top As Integer 
         Right As Integer 
         Bottom As Integer 
         End Type 
         
         Private Declare Function CreateCompatibleDC Lib "GDI" ( _ 
         ByVal hDC As Integer) As Integer 
         Private Declare Function CreateCompatibleBitmap Lib "GDI" ( _ 
         ByVal hDC As Integer, ByVal nWidth As Integer, _ 
         ByVal nHeight As Integer) As Integer 
         Private Declare Function GetDeviceCaps Lib "GDI" ( _ 
         ByVal hDC As Integer, ByVal iCapabilitiy As Integer) As Integer 
         Private Declare Function GetSystemPaletteEntries Lib "GDI" ( _ 
         ByVal hDC As Integer, ByVal wStartIndex As Integer, _ 
         ByVal wNumEntries As Integer, _ 
         lpPaletteEntries As PALETTEENTRY) As Integer 
         Private Declare Function CreatePalette Lib "GDI" ( _ 
         lpLogPalette As LOGPALETTE) As Integer 
         Private Declare Function SelectObject Lib "GDI" ( _ 
         ByVal hDC As Integer, ByVal hObject As Integer) As Integer 
         Private Declare Function BitBlt Lib "GDI" ( _ 
         ByVal hDCDest As Integer, ByVal XDest As Integer, _ 
         ByVal YDest As Integer, ByVal nWidth As Integer, _ 
         ByVal nHeight As Integer, ByVal hDCSrc As Integer, _ 
         ByVal XSrc As Integer, ByVal YSrc As Integer, _ 
         ByVal dwRop As Long) As Integer 
         Private Declare Function DeleteDC Lib "GDI" ( _ 
         ByVal hDC As Integer) As Integer 
         Private Declare Function GetForegroundWindow Lib "USER" _ 
         Alias "GetActiveWindow" () As Integer 
         Private Declare Function SelectPalette Lib "USER" ( _ 
         ByVal hDC As Integer, ByVal hPalette As Integer, ByVal _ 
         bForceBackground As Integer) As Integer 
         Private Declare Function RealizePalette Lib "USER" ( _ 
         ByVal hDC As Integer) As Integer 
         Private Declare Function GetWindowDC Lib "USER" ( _ 
         ByVal hWnd As Integer) As Integer 
         Private Declare Function GetDC Lib "USER" ( _ 
         ByVal hWnd As Integer) As Integer 
         Private Declare Function GetWindowRect Lib "USER" ( _ 
         ByVal hWnd As Integer, lpRect As RECT) As Integer 
         Private Declare Function ReleaseDC Lib "USER" ( _ 
         ByVal hWnd As Integer, ByVal hDC As Integer) As Integer 
         Private Declare Function GetDesktopWindow Lib "USER" () As Integer 
         
         Private Type PicBmp 
         Size As Integer 
         Type As Integer 
         hBmp As Integer 
         hPal As Integer 
         Reserved As Integer 
         End Type 
         
         Private Declare Function OleCreatePictureIndirect _ 
         Lib "oc25.dll" (PictDesc As PicBmp, RefIID As GUID, _ 
         ByVal fPictureOwnsHandle As Integer, IPic As IPicture) _ 
         As Integer 
        #End If 
        #If Win32 Then 
         Public 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 
        #ElseIf Win16 Then 
         Public Function CaptureWindow(ByVal hWndSrc As Integer, _ 
         ByVal Client As Boolean, ByVal LeftSrc As Integer, _ 
         ByVal TopSrc As Integer, ByVal WidthSrc As Long, _ 
         ByVal HeightSrc As Long) As Picture 
         
         Dim hDCMemory As Integer 
         Dim hBmp As Integer 
         Dim hBmpPrev As Integer 
         Dim r As Integer 
         Dim hDCSrc As Integer 
         Dim hPal As Integer 
         Dim hPalPrev As Integer 
         Dim RasterCapsScrn As Integer 
         Dim HasPaletteScrn As Integer 
         Dim PaletteSizeScrn As Integer 
        #End If 
         Dim LogPal As LOGPALETTE 
         
         ' Depending on the value of Client get the proper device context. 
         If Client Then 
         hDCSrc = GetDC(hWndSrc) ' Get device context for client area. 
         Else 
         hDCSrc = GetWindowDC(hWndSrc) ' Get device context for entire 
         ' window. 
         End If 
         
     ...... 略