Живопись Winforms выполняется синхронно или асинхронно? - PullRequest
2 голосов
/ 19 января 2012

У меня есть форма с тремя панелями. Верхняя панель содержит списки, средняя панель содержит сетку, а нижняя панель содержит сетку. Мне нужно сделать скриншот нижней сетки, но иногда в сетке больше строк, и вам нужно прокрутить, чтобы увидеть каждую строку. Я хочу сделать нижнюю сетку размером с форму, прежде чем сделать снимок экрана, и могу сделать это, установив .Visible в false для двух верхних панелей. Моя проблема в том, что снимок экрана делается до того, как форма перерисовывается, чтобы показать сетку как размер формы. Как я могу гарантировать, что форма была перерисована / перекрашена перед выполнением кода для создания снимка экрана?

Я использую ответ ArsenMkrt из Сделать снимок экрана активного окна? , чтобы сделать снимок экрана.

РЕДАКТИРОВАТЬ: сетка является UltraGrid Infragistics.

Ответы [ 3 ]

3 голосов
/ 19 января 2012

Вызвать метод Update () формы.Если есть какие-либо ожидающие краски, вы можете быть уверены, что они будут выполнены, и форма полностью нарисована.В данном случае, скрытие панелей требует, чтобы форма перерисовывала фон.

Это работает только для вашей формы, а не для окна, принадлежащего другому процессу.Использование метода DrawToBitmap () формы также обычно работает (синхронизация не требуется), но не все дочерние элементы управления поддерживают его.Примечательно, что RichTextBox и WebBrowser, а также многие другие элементы управления ActiveX неправильно реализуют базовое сообщение Windows.

1 голос
/ 19 января 2012

Если вы используете DataGrid Winforms, вам не нужно проходить через все эти проблемы.Просто используйте Control.DrawToBitmap ()

var width = dataGridView1.Width;
var height = dataGridView1.Height;
var x = dataGridView1.Left;
var y = dataGridView1.Top;

var bitmap = new Bitmap(width, height);
var targetBounds = new Rectangle(x, y, width, height);
dataGridView1.DrawToBitmap(bitmap, targetBounds);

bitmap.Save("C:\\DataGridView.bmp");
0 голосов
/ 19 января 2012

Используйте Applicaton.DoEvents(), чтобы разрешить обработку всех сообщений Windows, поэтому изменение размера и рисование будут завершены по возвращении из вызова.Сразу же после этого вы можете сделать снимок экрана с формой.

...