2009-09-01 6 views
2

J'ai un formulaire C# windows qui a plusieurs contrôles, une partie des contrôles sont situés l'un sur l'autre. Je veux une fonction qui prendra pour entrer un contrôle du formulaire et retournera l'image qui doit être derrière le contrôle. par exemple: si le formulaire a backgroundimage et contient un bouton dessus - si je vais exécuter cette fonction, je vais avoir la partie de backgroundimage qui se trouve derrière le bouton. une idée - et un code?C# winforms: Obtenir l'image de capture d'écran qui doit être derrière un contrôle

H-E-L-P !!!

+0

Pourriez-vous poster des informations sur ce que vous essayez de faire? –

Répondre

0

C'est assez facile à faire. Chaque contrôle sur le formulaire a une taille et une propriété de localisation, que vous pouvez utiliser pour instancier un nouveau rectangle, comme ceci:

Rectangle rect = new Rectangle(button1.Location, button1.Size); 

Pour obtenir une Bitmap qui contient la partie de l'image d'arrière-plan situé derrière le contrôle, vous créez un Bitmap des dimensions appropriées:

Bitmap bmp = new Bitmap(rect.Width, rect.Height); 

vous créez ensuite un objet graphique pour la nouvelle image, et utilisez la méthode DrawImage de cet objet pour copier une partie de l'image d'arrière-plan:

using (Graphics g = Graphics.FromImage(bmp)) 
{ 
    g.DrawImage(...); // sorry, I don't recall which of the 30 overloads 
     // you need here, but it will be one that uses form1.Image as 
     // the source, and rect for the coordinates of the source 
} 

Cela vous laissera avec le nouveau bitmap (bmp) contenant la partie de l'image d'arrière-plan sous ce contrôle.

Désolé je ne peux pas être plus précis dans le code - je suis à un terminal public. Mais l'information IntelliSense vous dira ce que vous devez transmettre pour la méthode DrawImage.

1

C'est ma première estimation, mais je dois le tester.

  • bouton Put invisible
  • capture d'écran actuelle
  • écran des cultures capturées à l'ClientRectangle du bouton
  • bouton Restablish.

    public static Image GetBackImage(Control c) { 
        c.Visible = false; 
        var bmp = GetScreen(); 
        var img = CropImage(bmp, c.ClientRectangle); 
        c.Visible = true; 
    } 
    
    public static Bitmap GetScreen() { 
        int width = SystemInformation.PrimaryMonitorSize.Width; 
        int height = SystemInformation.PrimaryMonitorSize.Height; 
    
        Rectangle screenRegion = Screen.AllScreens[0].Bounds; 
        var bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb); 
        Graphics graphics = Graphics.FromImage(bitmap); 
        graphics.CopyFromScreen(screenRegion.Left, screenRegion.Top, 0, 0, screenRegion.Size); 
        return bitmap; 
    } 
    public static void CropImage(Image imagenOriginal, Rectangle areaCortar) { 
        Graphics g = null; 
        try { 
         //create the destination (cropped) bitmap 
         var bmpCropped = new Bitmap(areaCortar.Width, areaCortar.Height); 
         //create the graphics object to draw with 
         g = Graphics.FromImage(bmpCropped); 
    
         var rectDestination = new Rectangle(0, 0, bmpCropped.Width, bmpCropped.Height); 
    
         //draw the areaCortar of the original image to the rectDestination of bmpCropped 
         g.DrawImage(imagenOriginal, rectDestination, areaCortar, GraphicsUnit.Pixel); 
         //release system resources 
        } finally { 
         if (g != null) { 
          g.Dispose(); 
         } 
        } 
    } 
    
+0

Je ne pense pas qu'il veut une image de ce qui est sous le contrôle ET derrière le formulaire - il veut juste ce que sur la forme sous le contrôle. – MusiGenesis

+0

Je mets juste le bouton visible, donc l'effet sera l'image derrière –

Questions connexes