2009-08-08 103 views
2

我试图通过C#绘制一个简单的条形图,但我从未尝试过使用图形和绘图命名空间。我想要生成一个“开始”和“结束”的图形,然后重复一个图像(显示“长度”),但我不知道如何做到这一点。C#:绘制自己的条形图

如果你能指向正确的方向和/或如果你有示例代码来做到这一点,我会非常高兴。

回答

-2

这有什么错用一个简单的循环?

7

亚历克斯,这是一个非常简单的例子,让你开始。要测试代码,只需将面板控件添加到窗体并为其创建一个绘制事件处理程序。 (双击设计器中的面板应该默认执行它。)然后用下面的代码替换处理程序代码。

该代码在面板上绘制任意长度的五个小节,小节宽度和高度与面板宽度和高度有关。代码是任意的,但是引入.Net绘图功能是一种很好且简单的方法。

void Panel1Paint(object sender, PaintEventArgs e) 
{ 
    Graphics g = e.Graphics; 
    int objCount = 5; 

    for (int n=0; n<objCount; n++) 
    { 
     g.FillRectangle(Brushes.AliceBlue, 0, n*(panel1.Height/objCount), 
         panel1.Width/(n+1), panel1.Height/objCount); 
     g.DrawRectangle(new Pen(Color.Black), 0, n*(panel1.Height/objCount), 
         panel1.Width/(n+1), panel1.Height/objCount); 
     g.DrawString(n.ToString(), new Font("Arial", 10f), Brushes.Black, 
        2, 2+n*(panel1.Height/objCount)); 
    } 
} 
1

基于保罗萨西克的答复,我创建了一个有点不同简单的条形图。我希望这可以帮助其他人。

void DrawTheBar(int[] Values, Panel p) 
    {      
     //configuration of the bar chart 
     int barWidth = 20; //Width of the bar 
     int barSpace = 5; //Space between each bars. 
     int BCS = 5; //Background cell size 
     float fontSize = 8; 
     string fontFamily = "Arial";   

     Color bgColor = Color.White; 
     Brush fillColor = Brushes.CadetBlue; 
     Color borderColor = Color.Black; 
     Color bgCellColor = Color.Silver; 
     Brush textColor = Brushes.Black; 

     //do some magic here... 
     p.BackColor = bgColor; //set the bg color on panel 
     Graphics g = p.CreateGraphics(); 
     g.Clear(bgColor); //cleans up the previously draw pixels 
     int Xpos = barSpace; //initial position 
     int panelHeight = panel1.Height-1; //fix panel height for drawing border 

     //Drawing rectangles for background. 
     for(int c = 0; c < Convert.ToInt16(panel1.Width/BCS); c++) 
     { 
      for(int r = 0; r < Convert.ToInt16(panel1.Height/BCS); r++) 
      { 
       g.DrawRectangle(new Pen(bgCellColor), c * BCS, r * BCS, BCS, BCS); 
      } 
     } 

     //Drawing the bars 
     for(int i = 0; i < Values.Length; i++) 
     { 
      //Drawing a filled rectangle. X = Xpos; Y = ((panel Height - 1) - Actual value); Width = barWidth, Height = as value define it 
      g.FillRectangle(fillColor, Xpos, (panelHeight - Values[i]), barWidth, Values[i]); 
      //Draw a rectangle around the previously created bar. 
      g.DrawRectangle(new Pen(borderColor), Xpos, (panelHeight - Values[i]), barWidth, Values[i]); 
      //Draw values over each bar. 
      g.DrawString(Values[i].ToString(), new Font(fontFamily, fontSize), textColor, (Xpos + 2), (panelHeight - Values[i]) - (fontSize + barSpace)); 

      //calculate the next X point for the next bar. 
      Xpos += (barWidth + barSpace); 
     } 

     //here you will be happy with the results. :) 
    }