.NET круговая диаграмма: как добавить текст в слайсы и повернуть диаграмму - PullRequest
3 голосов
/ 23 июня 2009

Код ниже создает круговую диаграмму из 24 срезов. Как мне:

  1. Добавьте текстовые метки к каждому срезу а-ля "Колесо фортуны".
  2. Повернуть круговую диаграмму? Я хочу, чтобы оно вращалось как «Колесо фортуны».

    private void DrawPieChart()
    {
        Graphics g = this.CreateGraphics();
        g.Clear(this.BackColor);
        Rectangle rect = new Rectangle(0, 0, 300, 300);
        float angle = 0;
        Random random = new Random();
        int sectors = 24;
        int sweep = 360 / sectors;
    
         for(int i=0; i<24;i++)
        {
            Color clr = Color.FromArgb(random.Next(0, 255),random.Next(0, 255), random.Next(0, 255));
            g.FillPie(new SolidBrush(clr), rect, angle, sweep);
            angle += sweep;
        }
        g.Dispose();
    }
    

1 Ответ

2 голосов
/ 23 июня 2009

Чтобы добавить текстовые метки, звоните g.DrawString.

РЕДАКТИРОВАТЬ : Чтобы сделать текст верным, как ваше изображение, поверните графический объект к angle + sweep / 2 и нарисуйте свой текст. Чтобы заставить его рисовать вниз, yopu может рисовать его на небольшой ширине и полагаться на перенос символов; если это не сработает, нарисуйте его символ vy chaaracter и используйте g.MeasureString, чтобы выяснить, куда поместить следующий символ.

Чтобы повернуть всю диаграмму, вызовите g.RotateTransform с углом в градусах, прежде чем рисовать его. РЕДАКТИРОВАТЬ : как это:

    private void DrawPieChart()
    {
        Graphics g = this.CreateGraphics();
        g.Clear(this.BackColor);
        Rectangle rect = new Rectangle(0, 0, 300, 300);
        float angle = 0;
        Random random = new Random();
        int sectors = 24;
        int sweep = 360 / sectors;

         g.RotateTransform(90);        //Rotates by 90 degrees
         for(int i=0; i<24;i++)
        {
            Color clr = Color.FromArgb(random.Next(0, 255),random.Next(0, 255), random.Next(0, 255));
            g.FillPie(new SolidBrush(clr), rect, angle, sweep);
            angle += sweep;
        }
        g.Dispose();
    }

Чтобы оживить вращение, создайте поле для угла, увеличьте его по таймеру и передайте поле в g.RotateTransform.

Кроме того, правильный способ рисования состоит в том, чтобы обрабатывать событие Paint элемента управления и рисовать, используя e.Graphics. Затем, когда вы хотите перерисовать его, позвоните Invalidate. Чтобы предотвратить мерцание, вызовите this.SetStyle(ControlStyles.DoubleBuffer, true); в конструкторе.

...