Как получить изображение элемента управления, формы или клиентской области формы в 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.
