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