DrawToBitmap не снимает скриншоты всех предметов
В настоящее время у меня есть этот полезный код, который я нашел в другом месте в StackOverflow:
form.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
У меня есть форма с несколькими текстовыми полями/выпадающими списками и большим ящиком. Затем у меня есть меньшие коробки с картинками, расположенные поверх этого большого окна.
Когда я просматриваю снимок экрана, он показывает форму, но по каким-то причинам по каким-либо причинам не отображаются меньшие окна с картинками, которые были помещены над большим изображением.
Ответы
Ответ 1
Я вижу это ограничение в документах для Control.DrawToBitmap():
Элементы управления внутри контейнеров отображаются в обратном порядке.
Это означало бы, что если два элемента управления накладываются друг на друга, тот, который обычно отображается "под" другой (он сначала нарисован, а затем перегружен перекрывающимся элементом управления) вместо этого будет отображаться последним (так что он будет перекрывать тот, который обычно перекрывается Это). В вашем случае, когда меньший элемент управления полностью вычерчивается внутри границ более крупного и поверх него, элемент управления будет скрыт при этом обратном рендеринге.
Попробуйте обходиться с помощью BringToFront() и SendToBack() на более крупном PictureBox, который перекрывается меньшими. Вызовите BringToFront() непосредственно перед рисованием в растровое изображение, а затем SendToBack(), когда закончите. Если вы не хотите, чтобы пользователь видел мерцание экрана, попробуйте вызвать функцию SuspendLayout() перед внесением изменений в Z-порядок, а затем ResumeLayout (true) после сброса до нужного Z-порядка.
Ответ 2
Спасибо KeithS за помощь мне!
Для тех, кому нужен код, чтобы делать эти обратные и обратные действия, здесь вы идете:
private void ReverseControlZIndex(Control parentControl)
{
var list = new List<Control>();
foreach (Control i in parentControl.Controls)
{
list.Add(i);
}
var total = list.Count;
for (int i = 0; i < total / 2; i++)
{
var left = parentControl.Controls.GetChildIndex( list[i]);
var right = parentControl.Controls.GetChildIndex(list[total - 1 - i]);
parentControl.Controls.SetChildIndex(list[i], right);
parentControl.Controls.SetChildIndex(list[total - 1 - i], left);
}
}
private void SaveImage()
{
SaveFileDialog sf = new SaveFileDialog();
sf.Filter = "Bitmap Image (.bmp)|*.bmp|Gif Image (.gif)|*.gif|JPEG Image (.jpeg)|*.jpeg|Png Image (.png)|*.png|Tiff Image (.tiff)|*.tiff|Wmf Image (.wmf)|*.wmf";
if (sf.ShowDialog() == DialogResult.OK)
{
int width = pnlCanvas.Size.Width;
int height = pnlCanvas.Size.Height;
Bitmap bm = new Bitmap(width, height);
SuspendLayout();
// reverse control z-index
ReverseControlZIndex(pnlCanvas);
pnlCanvas.DrawToBitmap(bm, new Rectangle(0, 0, width, height));
// reverse control z-index back
ReverseControlZIndex(pnlCanvas);
ResumeLayout(true);
bm.Save(sf.FileName, ImageFormat.Bmp);
}
}