2014-01-10 45 views
0

組合框應生成2和15,並且當用戶選擇了一個數字 隨機彩色點是在面板上隨機抽取之間的數字。例如。用戶選擇 7,因此,隨機顏色繪製7個隨機點。如何在面板上生成隨機顏色的點?

這是我到目前爲止的代碼:

private void cmbDots_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    try 
    { 
     randomPaint(Convert.ToInt32(cmbDots.SelectedItem)); 
    } 
    catch (Exception e) 
    { 

    } 
} 

private void Design_Form_Load(object sender, EventArgs e) 
{ 
    for (int i = 2; i <= 15; i++) 
    { 
     cmbDots.Items.Add(i); 
    } 
} 

private void randomPaint(int numberOfTimes) 
{ 
    Random r = new Random(); 
    Graphics g = this.CreateGraphics(); 
    Color rC; 
    SolidBrush b1; 

    for (int i = 0; i < numberOfTimes; i++) 
    { 
     rC = Color.FromArgb(r.Next(255), r.Next(255), r.Next(255)); 
     b1 = new SolidBrush(rC); 
     g.FillEllipse(b1, r.Next(this.Size.Width), r.Next(this.Size.Height), 30, 30); 
    } 
} 
+2

什麼問題? – Kami

+0

try和catch(例外五)存在錯誤 – user3177361

+0

是的,我也不看這個問題,看起來你已經制定了循環,窗口的限制之內就會產生一個隨機彩色30×30點陣... – Taegost

回答

3

當你需要顯示面板上的點,你需要將面板添加到控制 - 如果它不存在。

private void randomPaint(int numberOfTimes) 
{ 
    Random r = new Random(); 
    Color rC; 
    SolidBrush b1; 

    Graphics g = pnlDraw.CreateGraphics(); 

    for (int i = 0; i < numberOfTimes; i++) 
    { 
     rC = Color.FromArgb(r.Next(255), r.Next(255), r.Next(255)); 
     b1 = new SolidBrush(rC); 
     g.FillEllipse(b1, r.Next(pnlDraw.Size.Width), r.Next(pnlDraw.Size.Height), 30, 30); 
    } 
} 

而且,對於事件處理,以避免變量名稱衝突這個任務

private void cmbDots_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    try 
    { 
     randomPaint(Convert.ToInt32(cmbDots.SelectedItem)); 
    } 
    catch (Exception err) 
    { 
     Console.WriteLine(err.Message); 
    } 
} 
+0

這不是讓我添加代碼 – user3177361

+0

我已經添加了一個面板我怎麼能包括它的代碼?以便它可以顯示在面板上。它的名字是pnlDraw。 – user3177361

+0

@ user3177361我更新了代碼。 – Kami

0

你不應該使用的createGraphics改變功能。您應該使用該面板的Paint事件:

int currentDotCount = 0; 

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     currentDotCount = Convert.ToInt32(comboBox1.SelectedItem); 
     panel2.Refresh(); 
    } 

    private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     randomPaint(currentDotCount, (Panel)sender, e.Graphics); 
    } 

    private void randomPaint(int numberOfTimes, Panel p, Graphics g) 
    { 
     Random r = new Random(); 

     for (int i = 0; i < numberOfTimes; i++) 
     { 
      using (var b1 = new SolidBrush(Color.FromArgb(r.Next(255), r.Next(255), r.Next(255)))) 
      { 
       g.FillEllipse(b1, r.Next(p.Size.Width), r.Next(p.Size.Height), 30, 30); 
      } 
     } 
    } 

這將確保如果窗體被最小化,或者另一個窗口在面板前穿過你的顯卡也不會被刪除。