C # Скриншот управления белый - PullRequest
1 голос
/ 28 сентября 2011

Мой вопрос связан с этим: Как программно получить снимок экрана элемента управления WinNet Forms.

Я хочу сделать снимок экрана System.Windows.Forms.. Контроль в C #.Я использую метод DrawToBitmap, предложенный в вопросе, связанном выше, и это работает большую часть времени.Однако есть несколько проблем.

Задача 1 :
У меня есть две вкладки, назовем их A и B. Элемент управления, снимок которого я хочу сделать, находится на вкладке BЯ хочу сделать снимок экрана при нажатии кнопки на вкладке А.Это работает большую часть времени, за исключением случаев, когда вкладка B еще не была открыта: тогда скриншот просто белый.Если я сначала захожу на вкладку B, затем возвращаюсь на вкладку A и нажимаю кнопку, чтобы сделать снимок экрана, тогда он работает нормально.Я предполагаю, что это из-за некоторой загрузки или построения элемента управления на вкладке, который еще не был сделан, но я не уверен, что именно (или это может быть что-то еще полностью).Я пытался форсировать эту загрузку или сборку с помощью ResumeLayout, PerformLayout, Show, Update, Invalidate, но это не работает.
EDIT: Мне удалось решить эту проблему с помощью DrawToBitmap насодержащий элемент управления вкладки вместо самого элемента управления и выполнение шоу на этой вкладке.

Проблема 2:
Когда я делаю снимок экрана определенного пользовательского элемента управления (подкласс UserControl)на скриншоте есть небольшая прямоугольная белая область (там, где ее явно не должно быть).Прямоугольная область находится не на одной конкретной части элемента управления, например на кнопке или текстовом поле, поэтому я не уверен, что является причиной этого.На других пользовательских элементах управления (также подклассах UserControl) он работает нормально, поэтому сама проблема не может быть.
РЕДАКТИРОВАТЬ: Решено, там был пустой элемент управления, который был нарисован сверхуэтогоУстановка Visible в false для этого элемента управления решила это.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2011

Для задачи 1: если «Если я впервые захожу на вкладку B, затем вернусь на вкладку A и нажмите кнопку, чтобы сделать снимок экрана, то все будет хорошо», а затем добавьте в formloadevent имитацию этих действий:

tabControl.SelectedIndex = IndexOfTabB;
tabControl.SelectedIndex = IndexOfTabA;

Это трюк, но это сработает.

Для задачи 2: Можете ли вы сравнить размеры элемента управления и снимка экрана с ним и дать нам результаты? Если Control.Width не равен длине растрового экрана, то это реальная проблема.

0 голосов
/ 28 сентября 2011

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

int screenWidth = Screen.GetBounds(new Point(0, 0)).Width;
int screenHeight = Screen.GetBounds(new Point(0, 0)).Height;
Bitmap bmpScreenShot = new Bitmap(screenWidth, screenHeight);
Graphics gfx = Graphics.FromImage((Image)bmpScreenShot);
gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight));
bmpScreenShot.Save("test.jpg", ImageFormat.Jpeg);
...