C #: нарисовать собственную гистограмму - PullRequest
2 голосов
/ 08 августа 2009

Я пытаюсь нарисовать простую гистограмму с помощью C#, но я никогда не экспериментировал с пространствами имен Графика и Рисование. Я подумал о том, чтобы сгенерировать графику «начало» и «конец», а затем как-то повторить изображение (чтобы показать «длину»), но я понятия не имею, как это сделать.

Я был бы очень рад, если бы вы указали мне правильное направление и / или если у вас есть образец кода для этого.

Ответы [ 4 ]

8 голосов
/ 08 августа 2009

Алекс, вот очень простой пример для начала. Чтобы проверить код, просто добавьте элемент управления панели в форму и создайте для него обработчик события рисования. (Двойной щелчок на панели в конструкторе должен сделать это по умолчанию.) Затем замените код обработчика на следующий код.

Код рисует пять полос произвольной длины по всей панели, а ширина и высота стержня связаны с шириной и высотой панели. Код произвольный, но это хороший и простой способ представить возможности рисования .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));
    }
}
5 голосов
/ 08 августа 2009

Я должен согласиться с Эросом. Есть много очень хороших графических библиотек, чтобы выполнить то, что вы хотите. Лучшее, с чем я столкнулся:

4 голосов
/ 08 августа 2009

почему бы вам не попробовать http://zedgraph.org/wiki/index.php?title=Main_Page. Время, необходимое для создания (и тестирования) ваших собственных элементов управления графиком, будет слишком большим

2 голосов
/ 18 февраля 2015

Основываясь на ответе Пола Сасика, я создал несколько другую простую гистограмму. Я надеюсь, что это может помочь другим.

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. :)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...