Questo tip nasce da una richiesta diretta nel forum ovvero "Come posso salvare in un file l'intero form visibile a video?".
La funzione fa uso di alcune Win32 APIs:
GetWindowDC permette di recuperare un device context che rappresenta il contenuto di tutta la finestra (non-client area inclusa) visto che le varie soluzioni messe a disposizione dall'oggetto Graphics di GDI+ lavorano invece solo sulla client area.
ReleaseDC rilascia il device context recuperato mediante GetWindowDC mentre BitBlt copia il contenuto di un device context ad un altro permettendo di specificare l'area da copiare e l'origine dove copiare tale area.
Per ulteriori dettagli vi rimando ai commenti presenti nel codice.
'// Dichiarazioni Win32 API
Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hdcDest As IntPtr, ByVal x As Int32, ByVal y As Int32, ByVal Width As Int32, ByVal Height As Int32, ByVal hdcSrc As IntPtr, ByVal XSrc As Int32, ByVal YSrc As Int32, ByVal dwRop As Int32) As Boolean
Private Declare Function GetWindowDC Lib "user32" (ByVal hWnd As IntPtr) As IntPtr
Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As IntPtr, ByVal hDc As IntPtr) As IntPtr
Public Sub SaveForm(ByVal form As Form, ByVal fileName As String)
'// Creo un memorybitmap di dimensioni simili a quelle del form da salvare
Dim memImage As New Bitmap(form.Width, form.Height)
'// Creo un oggetto Graphics associato al memorybitmap
Dim memGraphic As Graphics = Graphics.FromImage(memImage)
'// Recupero i device context associati all'intero form e all'oggetto Graphics
Dim dc1 As IntPtr = GetWindowDC(form.Handle)
Dim dc2 As IntPtr = memGraphic.GetHdc
'// Copio il contenuto del form nel memorybitmap
BitBlt(dc2, 0, 0, Me.Size.Width, Me.Size.Height, dc1, 0, 0, &HCC0020)
'//Rilascio entrambi gli handles e l'oggetto graphics
ReleaseDC(form.Handle, dc1)
memGraphic.ReleaseHdc(dc2)
memGraphic.Dispose()
'// Salvo il memorybitmap in un file .jpg
memImage.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg)
End Sub