views:

577

answers:

2

I have c# windows form which have several controls on it, part of the controls are located one on another. I want a function that will take for input a control from the form and will return the image that has to be behind the control. for ex: if the form has backgroundimage and contains a button on it - if I'll run this function I'll got the part of backgroundimage that located behind the button. any Idea - and code?

H-E-L-P!!!

A: 

This is pretty easy to do. Each control on the form has a Size and a Location property, which you can use to instantiate a new Rectangle, like so:

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

To get a Bitmap that contains the portion of the background image located behind the control, you first create a Bitmap of the proper dimensions:

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

You then create a Graphics object for the new Bitmap, and use that object's DrawImage method to copy a portion of the background image:

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
}

This will leave you with the new Bitmap (bmp) containing the portion of the background image underneath that control.

Sorry I can't be more specific in the code - I'm at a public terminal. But the intellisense info will tell you what you need to pass in for the DrawImage method.

MusiGenesis
+1  A: 

That's my initial guess, but have to test it.

  • Put button invisible
  • capture current screen
  • Crop screen captured to the clientRectangle of the button
  • Restablish button.

    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();
     }
    }
    
    }
Jhonny D. Cano -Leftware-
I don't think he wants an image of what's underneath the control AND behind the form - he just wants what on the form underneath the control.
MusiGenesis
I'm just putting visible the button, so the effect will be getting the image behind it
Jhonny D. Cano -Leftware-