DrawToBitmap не делает скриншоты всех предметов
В настоящее время у меня есть этот полезный код, который я нашел в другом месте в Stackru:
form.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
У меня есть форма с несколькими текстовыми полями / раскрывающимися списками и большим графическим полем. Затем у меня есть большие графические коробки, помещенные поверх этой большой картинной коробки.
Когда я просматриваю сделанный снимок экрана, он показывает форму, но меньшие графические блоки, которые были помещены над большим графическим блоком, по какой-то причине не отображаются?
2 ответа
Я вижу это ограничение в документах для Control.DrawToBitmap():
Элементы управления внутри контейнеров отображаются в обратном порядке.
Это будет означать, что если два элемента управления перекрывают друг друга, то один, обычно отображаемый "под" другим (сначала он рисуется, а затем перекрывается перекрывающимся элементом управления), будет отображаться последним (поэтому он будет перекрывать тот, который обычно перекрывает его). В вашем случае, когда меньший элемент управления рисуется полностью внутри границ большего элемента и поверх него, этот элемент управления будет скрыт этим обратным рендерингом.
Попробуйте обойти это, используя BringToFront () и SendToBack () на большом PictureBox, который перекрывается с меньшими. Вызовите BringToFront () непосредственно перед рисованием на растровом изображении, затем SendToBack (), когда вы закончите. Если вы не хотите, чтобы пользователь видел мерцание экрана, попробуйте вызвать SuspendLayout (), прежде чем вносить какие-либо изменения Z-порядка, затем ResumeLayout(true) после сброса в правильный Z-порядок.
Спасибо 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);
}
}