问题
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!!!
回答1:
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(); } } }
回答2:
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.
来源:https://stackoverflow.com/questions/1362525/c-sharp-winforms-getting-the-screenshot-image-that-has-to-be-behind-a-control