截圖目前,我有,我發現其他地方的StackOverflow此有用的代碼:DrawToBitmap沒有采取所有項目
form.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
我有幾個文本框/下拉菜單和一個大圖片框的形式。然後,我在這個大圖片框的頂部放置了較小的圖片框。
當我查看截圖時,它顯示窗體,但放置在大圖片框上的較小圖片框由於某種原因不顯示?
截圖目前,我有,我發現其他地方的StackOverflow此有用的代碼:DrawToBitmap沒有采取所有項目
form.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
我有幾個文本框/下拉菜單和一個大圖片框的形式。然後,我在這個大圖片框的頂部放置了較小的圖片框。
當我查看截圖時,它顯示窗體,但放置在大圖片框上的較小圖片框由於某種原因不顯示?
我看到在docs此限制爲Control.DrawToBitmap():容器內部
控制以相反的順序被渲染。
這將意味着,如果兩個控制彼此重疊,所述一種通常呈現「下面」的另一個(它的拉伸,然後再由重疊控制透支)將代替被渲染最後(所以它會重疊一個通常與它重疊)。在你的情況下,一個較小的控件完全被繪製在一個較大的控件的邊界內,並且在其之上,控件將被這個反向呈現隱藏。
嘗試解決這個問題的方法是在較大的PictureBox上使用BringToFront()和SendToBack(),這些較大的PictureBox會與較小的圖片框重疊。在繪製到位圖之前調用BringToFront(),然後在完成時調用SendToBack()。如果您不希望用戶看到屏幕閃爍,請嘗試在執行任何Z順序更改之前調用SuspendLayout(),然後在重置爲正確的Z順序之後調用ResumeLayout(true)。
非常感謝您的回覆Keith。這工作完美。正如你所說的,我只是在大圖片框中調用了BringToFront(),截取了屏幕截圖,然後調用了SendToBack()。 – Mike91 2012-04-16 20:44:43
感謝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);
}
}
您可以張貼整個代碼用一行代碼,我們不能確定問題出在哪裏實際上是。 – coder 2012-04-10 20:55:45