Как получить изображение элемента управления, формы или клиентской области формы в C#

В этом примере показано, как получить изображение элемента управления. Поскольку форма является типом управления, тот же метод позволяет получить образ формы.

Метод управления DrawToBitmap элемента управления управляет рисованием в растровое изображение. Метод GetControlImage, показанный ниже, использует DrawToBitmap, чтобы вернуть растровое изображение, содержащее изображение элемента управления.

// Вернуть растровое изображение, содержащее изображение элемента управления.
private Bitmap GetControlImage(Control ctl)
{
    Bitmap bm = new Bitmap(ctl.Width, ctl.Height);
    ctl.DrawToBitmap(bm,
        new Rectangle(0, 0, ctl.Width, ctl.Height));
    return bm;
}

Метод GetFormImageWithoutBorders, показанный в следующем коде, получает изображение формы без его границ или заголовка.

// Возвращаем изображение формы без его границ и украшений.
private Bitmap GetFormImageWithoutBorders(Form frm)
{
    // Получить весь образ формы.
    using (Bitmap whole_form = GetControlImage(frm))
    {
        // Посмотрим, как далеко находится верхний левый угол формы
        // из верхнего левого угла его клиентской области.
        Point origin = frm.PointToScreen(new Point(0, 0));
        int dx = origin.X - frm.Left;
        int dy = origin.Y - frm.Top;

        // Скопируем клиентскую область в новый Bitmap.
        int wid = frm.ClientSize.Width;
        int hgt = frm.ClientSize.Height;
        Bitmap bm = new Bitmap(wid, hgt);
        using (Graphics gr = Graphics.FromImage(bm))
        {
            gr.DrawImage(whole_form, 0, 0,
                new Rectangle(dx, dy, wid, hgt),
                GraphicsUnit.Pixel);
        }
        return bm;
    }
}

Этот метод вызывает GetControlImage, чтобы получить изображение всей формы. Затем он использует метод PointToScreen формы, чтобы увидеть, где находится верхний левый угол его клиентской области в координатах экрана. Разница между этой точкой и верхним левым углом формы указывает вам, как далеко область клиента формы вставляется из угла ее границ.

Код делает новый растровый рисунок, который является правильным размером для хранения области клиента формы, а затем копирует клиентскую часть всего изображения формы в новое растровое изображение.

Пример программы делает еще одну интересную вещь. Если вы нажмете кнопки Page 1 или Page 2, то отобразите изображение соответствующей страницы TabControl. Следующий код показывает, как программа захватывает страницу 2.

private void btnPage2_Click(object sender, EventArgs e)
{
    int selected = tabControl1.SelectedIndex;
    tabControl1.SelectedIndex = 1;

    ShowControlImage(tabPage2);
    
    tabControl1.SelectedIndex = selected;
}

К сожалению, если страница закладки не отображается, то ее метод DrawToBitmap может не отобразить страницу, потому что она может быть недоступна в неэкранированной памяти. Чтобы решить эту проблему, код сохраняет текущий выбранный индекс страницы, выбирает нужную страницу, а затем вызывает ShowControlImage, чтобы получить изображение элемента управления и отобразить его в диалоговом окне. Когда вы закрываете диалог, код восстанавливает первоначально выбранную страницу TabControl.

Источник: http://csharphelper.com/blog/2014/09/get-the-image-of-a-control-or-form-or-a-forms-client-area-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector