2011-09-28 31 views
1

我的問題是與此相關的一個:How to get a screen capture of a .Net WinForms control programmatically?控制的C#屏幕截圖是白色

我想在C#中的System.Windows.Forms.Control的截圖。我使用上面鏈接的問題中提到的DrawToBitmap方法,大多數情況下都是有效的。但是有一些問題。

問題1
我有兩個的TabPages,我們姑且稱之爲A和B.控制我想採取截圖的是在標籤頁B.我想借此截圖當標籤頁A中的按鈕按下。這在大多數情況下都是有效的,除非頁面B還沒有被訪問:那麼屏幕截圖只是白色。如果我第一次訪問標籤頁B,然後返回到標籤頁A並點擊按鈕來截取屏幕截圖,那麼它工作正常。我猜這是因爲在選項卡中的一些加載或構建控件尚未完成,但我不確定究竟是什麼(或者可能完全是其他內容)。我一直在試圖用ResumeLayout,PerformLayout,Show,Update,Invalidate強制加載或構建,但這不起作用。
編輯:在包含tabpage控件上使用DrawToBitmap而不是控件本身並在該頁面上進行顯示來解決此問題。

問題2:
當我採取某種自定義控制(用戶控件的子類)的屏幕截圖有一個小的矩形白色區域中的屏幕截圖(其中不應該有一個很明顯)。矩形區域不在控件的某個特定部分,如按鈕或文本框,所以我不確定是什麼導致了這種情況。在其他自定義控件(也是UserControl的子類)上,它工作正常,所以不能成爲問題本身。
編輯:解決了它,那裏有一個空的控件被繪製在它的上面。設置可見爲該控件的錯誤解決了它。

+0

我使用'DrawToBitmap'與我的自定義控件在.net 2.0中,並沒有任何額外的白色矩形。你的控件是否有透明部分? – Djole

回答

0

你可以用這段代碼做,其餘的工作和找到正確的座標是讓讀者做作業。

int screenWidth = Screen.GetBounds(new Point(0, 0)).Width; 
int screenHeight = Screen.GetBounds(new Point(0, 0)).Height; 
Bitmap bmpScreenShot = new Bitmap(screenWidth, screenHeight); 
Graphics gfx = Graphics.FromImage((Image)bmpScreenShot); 
gfx.CopyFromScreen(0, 0, 0, 0, new Size(screenWidth, screenHeight)); 
bmpScreenShot.Save("test.jpg", ImageFormat.Jpeg); 
+2

這根本不起作用。這需要屏幕上顯示的內容的屏幕截圖。我想要的截圖是在當前不在屏幕上的標籤中。請儘量閱讀我的帖子。 – user968698

+1

@Luis如果選項卡B在該時刻不活動,屏幕截圖將不會正確顯示:( – Vasya

0

對於問題1:如果「如果我第一次訪問標籤頁B,然後再返回到標籤頁A和點擊按鈕採取截圖然後正常工作」,然後添加在該行動的formloadevent模仿:

tabControl.SelectedIndex = IndexOfTabB; 
tabControl.SelectedIndex = IndexOfTabA; 

這是竅門,但它會起作用。

對於問題2:你可以比較你的控制和它的截圖的大小,並給我們結果?如果Control.Width不等於位圖屏幕的三圍,那麼這是一個真正的問題。

+0

我設法使用其他方法解決問題1(請參閱我編輯的問題),但是感謝您的幫助。你對問題2有任何想法。 – user968698