2013-10-29 109 views
-1

所以我必須用線條填充我的圖片框,儘管我無法理解我做錯了什麼。如何用線條C填充圖片框#

public Form1() 
     { 
      InitializeComponent(); 
      PictureBox pb = new PictureBox(); 
     } 
     public void Zimet() 
     { 
      PictureBox pb = new PictureBox(); 

      Graphics g = pb.CreateGraphics(); 
      Pen pen1 = new Pen(Color.Red); 
      for (int i = 0; i < pb.Height; i++) 
      { 
       g.DrawLine(pen1, pb.Width, 0, 0, pb.Height); 
      } 
     } 
     private void button1_Click(object sender, EventArgs e) 
     { 
      Zimet(); 
     } 
+0

我們不明白你做錯了什麼!請添加有關出錯的詳細信息。編譯錯誤?運行時異常?意外的輸出?你需要澄清問題是什麼。 – tnw

+0

tnw,絕對沒有發生。我按了那個我創建的按鈕,當它用紅線填充我的圖片框時,你什麼也沒有發生。 :/ – L2PA

回答

0

Zimet()函數創建一個Picturebox,並繪製它,然後把它扔了遠在函數結束。

您需要致電SomeUiObject.Controls.Add(pb);將其放在窗體上。

0

首先你的PictureBox應該是你的Form的字段,你不應該每次點擊一個按鈕時創建它。

 Pen pen1 = new Pen(Color.Red); 
     for (int i = 0; i < pb.Height; i++) 
     { 
      g.DrawLine(pen1, 0, i, pb.Width, i); 
     } 

但是,這將是一樣用紅色填充圖片框:第二,如果你想水平線,你需要做這樣的事情你DrawLine電話是壞的,例如。相反,我建議你通過更新i + = 2來跳過其他每一行。不過,我建議你不要使用CreateGraphic()方法,而是在Paint事件處理程序中執行所有繪圖。原因是每當你的表單失效時,你的圖形將被刪除。使用例如一些布爾值,當你點擊一個按鈕時將會設置它,然後,如果它是真的做繪圖。事情是這樣的:

public class Form1:Form 
{ 
    PictureBox pb; 
    bool drawLines = false; 
    public Form1() 
    { 
     InitializeComponent(); 
     pb = new PictureBox(); 
     pb.Size = new Size(100,100); 
     pb.Location = new Point(0,0); 
     pb.Paint+=new PaintEventHandler(pb_Paint); 
     this.Controls.Add(pb); 
    } 
    private void pb_Paint(object sender, PaintEventArgs e) 
    { 
     if(drawLines) 
     { 
      Pen pen1 = new Pen(Color.Red); 
      for (int i = 0; i < pb.Height; i+=2) 
      { 
       e.Graphic.DrawLine(pen1, pb.Width, 0, 0, pb.Height); 
      } 
     } 
    } 
    public void Zimet() 
    { 
     drawLines = true; //however this may look redundant, it is still OP's code 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     Zimet(); 
    } 
+0

仍然沒有... – L2PA

0

創建形式構造一個PictureBox pb,然後又是一個在你的Zimet()方法。方法Zimet()中的方法在該方法的範圍內是局部的,因此在方法返回時超出範圍。

您是否試圖在您的構造函數中創建的PictureBox中畫線?因爲一旦你的構造函數完成,它就超出了範圍。也許在你的課堂上創建一個字段來保存PictureBox,然後在你的Zimet()方法中繪製該字段。

1

實際上有三個原因,該代碼將無法正常工作,其中兩個已經在其他的答案被提及:

  1. 你的圖片框不是窗體上的控件(見patchandchat答案)
  2. 在畫線用錯座標(見尼古拉·達維多維奇答案)

第三個問題是,你不能畫到這樣一個PictureBox,因爲當塗料事件觸發,你畫任何東西丟失。創建一個圖像,繪製到該圖像,然後將圖像框的圖像設置爲該圖像:

public void Zimet() 
{ 
    var image = new Bitmap(pb.Width, pb.Height); 
    Graphics g = Graphics.FromImage(image); 
    Pen pen1 = new Pen(Color.Red); 
    for (int i = 0; i < pb.Height; i++) 
    { 
     g.DrawLine(pen1, 0, i, pb.Width, i); 
    } 
    pb.Image = image; 
}