2010-04-28 121 views

回答

-1

在PictureBox是控制並具有圖像源 - 所以你必須在圖像上繪製和圖像交給控制,以顯示它

MyImage = new Bitmap(fileToDisplay); 
pictureBox1.ClientSize = new Size(xSize, ySize); 
pictureBox1.Image = MyImage; 
+0

這將繪製__到一個位圖___,而不是__在picturebox__。它的工作原理是完全不同的! – TaW 2017-02-21 17:01:18

2

最好的方法是不要在一個picturebox中繪製一個圓和線!它不是爲此目的而設計的。

從鮑勃·鮑威爾的GDI +博客:

這個問題的根源是Windows的基本規則 編程已經被打破。而由於圖片框 的一個後果是責備那些真的不是它的錯。爲了幫助解釋 爲什麼,下面的四點概述了這種情況下出了什麼問題。

  • PictureBox控件用於顯示圖像。它不是圖形表面的方便佔位符。

  • Windows是一個事件驅動的系統,其中每個事件必須在正確的上下文中進行服務,並且註定要處理按鈕單擊或鼠標移動事件的事件不得用於在屏幕或其他奇怪的東西上進行繪圖。

  • PictureBox通過繪製存儲在其Image屬性中的基於System.Drawing.Image的對象刷新自身。如果沒有圖像,它將顯示背景顏色。

  • 任何控件的圖形對象的竊取和繪製都不是好的做法,應該強烈建議不要在正確的時間在正確的地方處理事件的規則。基本上如果你這樣做會導致你痛苦。當你將頭撞在牆上時會引起疼痛。這是一個跡象,你應該停止這樣做。 PictureBox.CreateGraphics調用是一樣的。

正確的做法。

遵循事件驅動系統的規則很簡單,但需要一個小小的預先考慮的 。所以,如果你想繪製一些 圖形,並讓它保持在那裏,當窗口移動它前面 並再次離開或當你最小化和恢復,你必須服務 Paint事件的任何對象它是你想畫的。 這個應用程序中的PictureBox帶着行李隨身攜帶,這對於 是不必要的。如果你只想在一個 的地方繪製東西,通過響應Form.Paint事件在表單上繪製它。如果 您需要一個方便的佔位符,用於在設置的 範圍內工作的圖形,請使用Panel控件併爲其Paint事件提供服務。如果您想讓 爲公司圖像複製圖形,請創建一個控件並在OnPaint覆蓋中執行繪圖。

原文鏈接(不再有效):http://bobpowell.net/picturebox.htm

注:原路段鮑勃鮑威爾的博客已經不再起作用。我爲了歷史目的而將它留在這裏。該頁面的內容仍然可以在本文編輯日期的互聯網存檔(https://web.archive.org/web/20120330003635/http://bobpowell.net/picturebox.htm)上查看。

+2

+1這真的是正確的答案。感謝您的鏈接,它描述了根本問題。 – Sabuncu 2014-04-05 09:15:04

+8

-1「Linkrot」...這個答案對於問題是什麼或者做什麼提供了一些提示。 「鼓勵與外部資源的鏈接,但請在鏈接的周圍添加上下文,以便您的同行用戶瞭解它是什麼以及爲什麼會出現在該鏈接中。始終引用重要鏈接中最相關的部分,以防目標網站無法訪問或永久離線。「資料來源:http://stackoverflow.com/help/how-to-answer 但我找到了保存在「Wayback Machine」中的bobpowell頁面:https://web.archive.org/web/20120216111903/http: //bobpowell.net/picturebox.htm – 2015-05-01 05:20:30

+0

這是一個可怕的答案。 Bobpowell的(另外很棒的)頁面不僅沒有了,而且也沒有建議你不應該畫在PictureBox上。實際上,它們的默認DoubleBuffering使其成爲適用於開箱即用的唯一控件。鮑勃只是警告不要使用drained Control.CreateGraphics從所有可怕的MSDN起始示例頁面複製新手。 – TaW 2017-02-21 16:59:03

24

或:

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     e.Graphics.DrawLine(
      new Pen(Color.Red,2f), 
      new Point(0,0), 
      new Point(pictureBox1.Size.Width, pictureBox1.Size.Height)); 

     e.Graphics.DrawEllipse(
      new Pen(Color.Red, 2f), 
      0,0, pictureBox1.Size.Width, pictureBox1.Size.Height ); 
    } 

處理圖片框的繪畫事件並在那裏進行自定義繪圖。

相關問題