2012-06-18 70 views
0

我寫過這段代碼,但是它不起作用。這不但不行,而且我嘗試繪製的方法都沒有奏效。我花了一個多小時或兩個小時試圖解決這個問題,但沒有成功。我試過簡單的程序,它所做的只是顯示一條小線,但無論我做什麼,它都不會工作:c在Winforms中繪圖

我在做什麼錯,或者是什麼原因導致了這種情況?

private void pictureBox1_MouseDown(object sender, 
            MouseEventArgs m, 
            EventArgs e, 
            PaintEventArgs q) 
{ 
    if (m.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
     Point currpoint = System.Windows.Forms.Cursor.Position; 

     Point origin = new Point(0, 0); 

     decimal sizee = nud.Value; 

     int size = Convert.ToInt32(sizee); 

     Random randonGen = new Random(); 

     Color randomColor = Color.FromArgb(randonGen.Next(255), 
              randonGen.Next(255), 
              randonGen.Next(255)); 

     Pen selPen = new Pen(randomColor, size); 

     Graphics g = Graphics.FromImage(pictureBox1.Image); 

     g.DrawLine(selPen, 3, 3, 133, 133); 
    } 
} 
+0

筆的寬度是多少?大小是以像素爲單位的,所以如果它是0,那麼你的線條就沒有厚度。也可以嘗試使用不變的顏色 - 先簡化代碼以證明其有效,然後再增加複雜性。 – dash

+0

寬度默認爲5,並且有一個numericUpDown可以使用close更改 – user1464962

回答

4

嘗試添加

pictureBox1.Invalidate(); 

電話。

+0

和'g.Dispose();'或更好。 –

1

這不是畫的圖片框的正確方法:

private void pictureBox1_MouseDown(object sender, 
            MouseEventArgs m, 
            EventArgs e, 
            PaintEventArgs q) 
{ 
    if (m.Button == System.Windows.Forms.MouseButtons.Left) 
    { 
     Point currpoint = System.Windows.Forms.Cursor.Position; 

     Point origin = new Point(0, 0); 

     decimal sizee = nud.Value; 

     int size = Convert.ToInt32(sizee); 

     Random randonGen = new Random(); 

     Color randomColor = Color.FromArgb(randonGen.Next(255), 
              randonGen.Next(255), 
              randonGen.Next(255)); 

     Pen selPen = new Pen(randomColor, size); 

     using(Graphics g = pictureBox1.CreateGraphics()) // Use the CreateGraphics method to create a graphic and draw on the picture box. Use using in order to free the graphics resources. 
     { 
      g.DrawLine(selPen, 3, 3, 133, 133); 
     } 
    } 
} 

順便說一句,這種方法會造成當控制無效,其reseted臨時圖像。對於更持久的繪圖,您需要聽取圖片框的Paint事件並在那裏繪製圖形。

+0

*這個*方法確實可能會創建一個臨時圖像,但OP的方法不會。 – GSerg

+0

繪製到picturebox圖像是一個壞主意(好吧,讓我們只是說這是一個不好的做法)。它可能是許多錯誤的源頭,從picturebox沒有加載圖像的情況開始:) –

+0

我將如何偵聽繪畫事件? – user1464962

0

您必須先從圖像中繪製它。然後將其附加到pictureBox1

Bitmap canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
Graphics g = Graphics.FromImage(canvas); 

Point currpoint = System.Windows.Forms.Cursor.Position; 

Point origin = new Point(0, 0); 

decimal sizee = nud.Value; 

int size = Convert.ToInt32(sizee); 

Random randonGen = new Random(); 

Color randomColor = Color.FromArgb(randonGen.Next(255), 
            randonGen.Next(255), 
            randonGen.Next(255)); 

Pen selPen = new Pen(randomColor, size); 

g.DrawLine(selPen, 3, 3, 133, 133); 
pictureBox1.image = canvas;