c # winforms: получение снимка экрана, который должен находиться за элементом управления - PullRequest
2 голосов
/ 01 сентября 2009

У меня есть форма окна c #, на которой есть несколько элементов управления, часть элементов управления расположена одна на другой. Я хочу функцию, которая примет для ввода элемент управления из формы и вернет изображение, которое должно быть позади элемента управления. Например: если форма имеет backgroundimage и содержит кнопку - если я запусту эту функцию, я получу часть backgroundimage, расположенную за кнопкой Любая идея - и код?

Н-Е-Л-П !!!

Ответы [ 2 ]

1 голос
/ 01 сентября 2009

Это мое первоначальное предположение, но я должен его проверить.

  • Кнопка ввода невидимая
  • захват текущего экрана
  • Обрезать экран, захваченный клиенту Прямоугольник кнопки
  • Кнопка восстановления.

    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 голосов
/ 01 сентября 2009

Это довольно легко сделать. Каждый элемент управления в форме имеет свойство Size и Location, которое можно использовать для создания нового прямоугольника, например:

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

Чтобы получить растровое изображение, содержащее часть фонового изображения, расположенную за элементом управления, сначала необходимо создать растровое изображение с соответствующими размерами:

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

Затем вы создаете объект Graphics для нового растрового изображения и используете метод DrawImage этого объекта для копирования части фонового изображения:

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
}

Это оставит вас с новым растровым изображением (bmp), содержащим часть фонового изображения под этим элементом управления.

Извините, я не могу быть более точным в коде - я нахожусь на общественном терминале. Но информация intellisense скажет вам, что вам нужно передать для метода DrawImage.

...