DrawToBitmap ne prend pas de capture d’écran de tous les éléments

J’ai actuellement ce code utile que j’ai trouvé ailleurs sur StackOverflow:

form.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); 

J’ai un formulaire avec quelques zones de texte / menus déroulants et une grande zone d’image. J’ai ensuite des boîtes à images plus petites placées sur cette grande boîte à images.

Lorsque je regarde la capture d’écran prise, le formulaire s’affiche, mais les plus petites zones d’image placées au-dessus de la grande zone ne sont pas affichées pour une raison quelconque.

Je vois cette limitation dans la documentation pour Control.DrawToBitmap ():

Les contrôles à l’intérieur des conteneurs sont rendus dans l’ordre inverse.

Cela signifierait que si deux contrôles se chevauchent, l’un rendu normalement “sous” l’autre (il est dessiné en premier et ensuite superposé par le contrôle qui se chevauche) sera plutôt affiché en dernier (donc il chevauchera celui qui le chevauche normalement). Dans votre cas, lorsqu’un contrôle plus petit est dessiné entièrement à l’intérieur des limites d’un contrôle plus grand et au-dessus de celui-ci, le contrôle est masqué par ce rendu inverse.

Essayez de contourner ce problème en utilisant BringToFront () et SendToBack () sur le plus grand PictureBox chevauché par les plus petits. Appelez BringToFront () juste avant de dessiner dans le bitmap, puis SendToBack () lorsque vous avez terminé. Si vous ne voulez pas que l’utilisateur voie le scintillement de l’écran, essayez d’appeler SuspendLayout () avant d’apporter des modifications à l’ordre Z, puis à ResumeLayout (true) après avoir rétabli le bon ordre.

Merci KeithS de m’aider!

Pour ceux qui ont besoin du code pour faire ces choses inverses et inverses, voici:

  private void ReverseControlZIndex(Control parentControl) { var list = new List(); foreach (Control i in parentControl.Controls) { list.Add(i); } var total = list.Count; for (int i = 0; i < total / 2; i++) { var left = parentControl.Controls.GetChildIndex( list[i]); var right = parentControl.Controls.GetChildIndex(list[total - 1 - i]); parentControl.Controls.SetChildIndex(list[i], right); parentControl.Controls.SetChildIndex(list[total - 1 - i], left); } } private void SaveImage() { SaveFileDialog sf = new SaveFileDialog(); sf.Filter = "Bitmap Image (.bmp)|*.bmp|Gif Image (.gif)|*.gif|JPEG Image (.jpeg)|*.jpeg|Png Image (.png)|*.png|Tiff Image (.tiff)|*.tiff|Wmf Image (.wmf)|*.wmf"; if (sf.ShowDialog() == DialogResult.OK) { int width = pnlCanvas.Size.Width; int height = pnlCanvas.Size.Height; Bitmap bm = new Bitmap(width, height); SuspendLayout(); // reverse control z-index ReverseControlZIndex(pnlCanvas); pnlCanvas.DrawToBitmap(bm, new Rectangle(0, 0, width, height)); // reverse control z-index back ReverseControlZIndex(pnlCanvas); ResumeLayout(true); bm.Save(sf.FileName, ImageFormat.Bmp); } }