2017-02-22 91 views
-3

我已經if語句在我的代碼如下:這爲什麼不畫任何東西?

//global variables 
int x1; 
int y1; 
int x2; 
int y2; 
int counter = 0; 

private void pictureBox1_Click(object sender, EventArgs e) 
{ 
    if (radioButtonDrawLine.Checked) 
    { 
     if (counter == 0) 
     { 
      x1 = Cursor.Position.X; 
      y1 = Cursor.Position.Y; 
      counter++;       
     }  
     else 
     { 
      x2 = Cursor.Position.X; 
      y2 = Cursor.Position.Y; 

      if (counter == 1) 
      { 
       Graphics g = CreateGraphics(); 
       g.DrawLine(Pens.Black, x2, y2, x1, y1); 
      } 
      counter = 0; 
     } 
    } 
} 

我應該在我的PictureBox點擊兩次,並將其保存在x和y每次我點擊。在第二次點擊時,應在兩個座標之間繪製一條線。 雖然這並不工作,我不明白爲什麼。有人能告訴我什麼是錯的嗎?

+1

'radioButtonDrawLine.Checked == true?' –

+0

仍然不起作用。我認爲它應該是相同的,而不使用「== true」 –

回答

3

您的代碼有兩個主要問題。

首先,您在窗體上調用CreateGraphics,而不是圖片框 - 所以如果您確實畫到了正確的位置,繪圖將被圖片框隱藏。

其次,你的座標已關閉,因爲Cursor.Position返回屏幕座標,而不是相對於正在繪製的控件的座標。但這已經是不必要的 - 你不應該首先使用Click事件,而應該使用MouseUpClick是一種不同的動作,其根本不需要涉及定位設備(例如按下按鈕上的空間)。你想要處理鼠標點擊,所以使用鼠標事件。作爲獎勵,你會得到在事件處理程序的參數點擊本地coördinates:)

最後,如果你想讓圖像持久,我建議不直接繪製到圖片框圖形對象,而是創建一個內存中的位圖來保存圖形,並讓圖片框根據需要進行重新繪製。否則,任何導致畫框重畫的東西都將清除你所畫的任何東西。

2

您應該在Paint事件中執行繪圖。像下面的東西應該工作:

//global variables 
private Point? p1; 
private Point? p2; 
private int counter = 0; 

private void pictureBox1_Click(object sender, EventArgs e) 
{ 
    if (radioButtonDrawLine.Checked) 
    { 
     if (counter == 0) 
     { 
      p1 = pictureBox1.PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y)); 
      counter++; 
     } 
     else 
     { 
      p2 = pictureBox1.PointToClient(new Point(Cursor.Position.X, Cursor.Position.Y)); 
      pictureBox1.Refresh(); 
      counter = 0; 
     } 
    } 
} 

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    if (p1.HasValue && p2.HasValue) 
    { 
     e.Graphics.DrawLine(Pens.Black, p1.Value.X, p1.Value.Y, p2.Value.X, p2.Value.Y); 
    } 
} 

pictureBox1.Refresh()電話是迫使一旦第二點已經創造了一個重​​繪。請注意,我也使用Point結構而不是ints來存儲座標,因爲這會將座標保存在邏輯組中,並使其更清晰。

+0

如果你這樣做,一旦捕獲了co?rinates,而不是在'Paint'事件中,就執行'PointToClient'。在此期間,控制權可能已經移動,這將使線路移動。 – Luaan

相關問題