2012-04-10 53 views
11

截圖目前,我有,我發現其他地方的StackOverflow此有用的代碼:DrawToBitmap沒有采取所有項目

form.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); 

我有幾個文本框/下拉菜單和一個大圖片框的形式。然後,我在這個大圖片框的頂部放置了較小的圖片框。

當我查看截圖時,它顯示窗體,但放置在大圖片框上的較小圖片框由於某種原因不顯示?

+0

您可以張貼整個代碼用一行代碼,我們不能確定問題出在哪裏實際上是。 – coder 2012-04-10 20:55:45

回答

16

我看到在docs此限制爲Control.DrawToBitmap():容器內部

控制以相反的順序被渲染。

這將意味着,如果兩個控制彼此重疊,所述一種通常呈現「下面」的另一個(它的拉伸,然後再由重疊控制透支)將代替被渲染最後(所以它會重疊一個通常與它重疊)。在你的情況下,一個較小的控件完全被繪製在一個較大的控件的邊界內,並且在其之上,控件將被這個反向呈現隱藏。

嘗試解決這個問題的方法是在較大的PictureBox上使用BringToFront()和SendToBack(),這些較大的PictureBox會與較小的圖片框重疊。在繪製到位圖之前調用BringToFront(),然後在完成時調用SendToBack()。如果您不希望用戶看到屏幕閃爍,請嘗試在執行任何Z順序更改之前調用SuspendLayout(),然後在重置爲正確的Z順序之後調用ResumeLayout(true)。

+1

非常感謝您的回覆Keith。這工作完美。正如你所說的,我只是在大圖片框中調用了BringToFront(),截取了屏幕截圖,然後調用了SendToBack()。 – Mike91 2012-04-16 20:44:43

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); 
     } 

    }