我目前在StackOverflow的其他地方找到了这个有用的代码:
form.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
我有一个带有几个文本框/下拉菜单和一个大图片框的表单。然后我在这个大图片框的顶部放置了较小的图片框。
当我查看截图时,它会显示表格,但是由于某些原因,放置在大图片框上的较小的图片框不显示?
答案 0 :(得分:16)
我在Control.DrawToBitmap()的文档中看到了这个限制:
内部容器的控件以相反的顺序呈现。
这意味着如果两个控件彼此重叠,那么通常会在两个控件之间呈现#34;另一个(它首先被绘制然后由重叠控件透支)将被最后渲染(因此它将与通常重叠的那个重叠)。在你的情况下,一个较小的控件完全被绘制在一个较大的控件的边界内并且在它的顶部,控件将被这个反向渲染隐藏。
尝试通过在较大的PictureBox上使用BringToFront()和SendToBack()来解决这个问题。在绘制到位图之前调用BringToFront(),然后在完成后调用SendToBack()。如果您不希望用户看到屏幕闪烁,请尝试在进行任何Z顺序更改之前调用SuspendLayout(),然后在重置为正确的Z顺序后调用ResumeLayout(true)。
答案 1 :(得分:0)
感谢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);
}
}