Come acquisire una schermata di un controllo .Net WinForms a livello di codice?
Domanda
Come si ottiene a livello di codice un'immagine di un controllo .Net?
Soluzione
Esiste un metodo su ogni controllo chiamato DrawToBitmap . Non è necessario p / invoke per farlo.
Control c = new TextBox();
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(c.Width, c.Height);
c.DrawToBitmap(bmp, c.ClientRectangle);
Altri suggerimenti
Puoi ottenere un'immagine di un controllo .NET a livello di programmazione abbastanza facilmente usando il metodo DrawToBitmap della classe Control a partire da .NET 2.0
Ecco un esempio in VB
Dim formImage As New Bitmap("C:\File.bmp")
Me.DrawToBitmap(formImage, Me.Bounds)
Ed eccolo in C #:
Bitmap formImage = New Bitmap("C:\File.bmp")
this.DrawToBitmap(formImage, this.Bounds)
Control.DrawToBitmap ti permetterà di disegnare la maggior parte dei controlli su una bitmap. Questo non funziona con RichTextBox e alcuni altri.
Se si desidera acquisire questi o un controllo che ne possiede uno, è necessario eseguire PInvoke come descritto in questo articolo di CodeProject: Acquisizione immagine
Assicurati che alcuni di questi metodi cattureranno tutto ciò che è sullo schermo, quindi se hai un'altra finestra che copre il tuo controllo, otterrai quello.
Per i controlli WinForms che lo supportano, esiste un metodo nella classe System.Windows.Forms.Control:
public void DrawToBitmap(Bitmap bitmap, Rectangle targetBounds);
Tuttavia, questo non funziona con tutti i controlli. I fornitori di componenti di terze parti hanno soluzioni più complete.
Ecco come farlo per un intero Modulo
, non solo per l'area Client (che non ha la barra del titolo e altri condimenti)
Rectangle r = this.Bounds;
r.Offset(-r.X,-r.Y);
Bitmap bitmap = new Bitmap(r.Width,r.Height);
this.DrawToBitmap(bitmap, r);
Clipboard.SetImage(bitmap);
se non si tratta del controllo che si sta tentando di eseguire, in genere è possibile eseguirne il cast nella classe Control di base e chiamare lì il metodo DrawToBitmap.
Panel1.Dock = DockStyle.None ' If Panel Dockstyle is in Fill mode
Panel1.Width = 5000 ' Original Size without scrollbar
Panel1.Height = 5000 ' Original Size without scrollbar
Dim bmp As New Bitmap(Me.Panel1.Width, Me.Panel1.Height)
Me.Panel1.DrawToBitmap(bmp, New Rectangle(0, 0, Me.Panel1.Width, Me.Panel1.Height))
'Me.Panel1.DrawToBitmap(bmp, Panel1.ClientRectangle)
bmp.Save("C:\panel.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
Panel1.Dock = DockStyle.Fill
Nota: funziona bene