3

下面的代码创建了一个 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();
    }
    
4

1 回答 1

2

要添加文本标签,请调用g.DrawString

编辑:要使 textvertical 像您的图像一样,将 Graphics 对象旋转到angle + sweep / 2,然后绘制您的文本。为了使它向下绘制,yopu 可以将其绘制为小宽度并依靠字符换行;如果这不起作用,请将其绘制为字符 vy 字符并用于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);在构造函数中调用。

于 2009-06-23T01:14:46.167 回答