2015-04-30 102 views
1

我在圖片框中使用以下代碼嘗試在圖像上繪圖,但是更改不是在窗體上呈現。通過圖形更改圖像不會在窗體中呈現

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
     { 
      if (drawMode) 
      { 
      Graphics g = Graphics.FromImage(pictureBox1.Image); 
      RectangleF rectf = new RectangleF(10, 10, 100, 100); 
      g.SmoothingMode = SmoothingMode.AntiAlias; 
      g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
      g.PixelOffsetMode = PixelOffsetMode.HighQuality; 
      g.DrawString("yourText", new Font("Tahoma", 22), Brushes.Green, rectf); 
      g.Flush(); 
.... 

編輯:代碼現在在picturebox1對象的PaintEventHandler中。

+0

正如答案所說,對Invalidate的調用會擦除您所做的任何操作並將其替換爲原始圖像。您需要確保每次控件重新繪製時自己修改圖像,或者將其保存到新的位圖並將其用作picturebox圖像。 –

+0

謝謝@RonBeyer - 我已經改變了這一點,但沒有運氣。我錯過了什麼嗎? – FaddishWorm

+0

是的,先在paint方法調用base.Paint(sender,e)。然後在你的代碼中不要使用Graphics.FromImage,使用g = e.Graphics。那麼它應該工作。 –

回答

1

我不太確定你爲什麼這樣做,或者這是否正確。但通常情況下,你會想要做的Paint事件PictureBox內的繪圖...

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    //draw here, but DONOT call the Invalidate method 
} 
如果你想只有當形式收到一些用戶的輸入,例如點擊一個按鈕來進行繪製,

。使用布爾型標誌來確定在Paint事件中何時和要繪製什麼。然後在按鈕點擊處理程序中,使無效的PictureBox

+0

謝謝,我已經調整了我的代碼,但文本尚未顯示出來。我可以確認它在PaintEventHandler代碼中被調用 – FaddishWorm

+0

原來我的測試座標稍微有些偏了,謝謝:) – FaddishWorm