{
// Fill the client area with a simple pie chart. A
// big blue slice covers 75% of the pie, from
// 6 o'clock to 3 o'clock. This portion is filled
// with blue and has a blue edge. The remaining 25%
// is filled with a red, diagonal hatch and has
// a red edge.
// Get the client area.
CRect rectClient;
GetClientRect(rectClient);
// Make a couple of pens and similar brushes.
CPen penBlue, penRed;
CBrush brushBlue, brushRed;
CBrush* pOldBrush;
CPen* pOldPen;
brushBlue.CreateSolidBrush(RGB(0, 0, 255));
brushRed.CreateHatchBrush(HS_FDIAGONAL, RGB(255, 0, 0));
penBlue.CreatePen(PS_SOLID | PS_COSMETIC, 1, RGB(0, 0, 255));
penRed.CreatePen(PS_SOLID | PS_COSMETIC, 1, RGB(255, 0, 0));
// Draw from 3 o'clock to 6 o'clock, counterclockwise,
// in a blue pen with a solid blue fill.
pOldPen = pDC->SelectObject(&penBlue);
pOldBrush = pDC->SelectObject(&brushBlue);
pDC->Pie(rectClient,
CPoint(rectClient.right, rectClient.CenterPoint().y),
CPoint(rectClient.CenterPoint().x, rectClient.right));
// Draw the remaining quarter slice from 6 o'clock
// to 3 o'clock, counterclockwise, in a red pen with
// the hatched brush.
pDC->SelectObject(&penRed);
pDC->SelectObject(&brushRed);
// Same parameters, but reverse start and end points.
pDC->Pie(rectClient,
CPoint(rectClient.CenterPoint().x, rectClient.right),
CPoint(rectClient.right, rectClient.CenterPoint().y));
// Restore the previous pen.
pDC->SelectObject(pOldPen);
}
/*---design by whb in 2009-8-16---
_radius:半径;_fontSize:字体的大小
用于画一个扇形统计图;
*/
package maths{
import Flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.events.MouseEvent;
public class Pie extends Sprite {
private var colors:Array=[0x000000,0xff0000,0x00ff00,0x0000ff,0xffff00,0x00ffff,0xff00ff,0x999900,0x009900,0x9999ff];
private var radius:Number;
private var pies:Array=[];
private var txts:Array=[];
private var angles:Array=[];
private var rects:Array=[];
private var datas:Array=[];
private var labels:Array=[];
private var txtFormat:TextFormat;
private var pie:Sprite;
private var rect:Sprite;
private var txt:TextField;
public function Pie(_radius:Number=40,_fontSize:uint=15) {
radius=_radius;
txtFormat=new TextFormat();
txtFormat.size=_fontSize;
}
public function drawPies(_array:Array) {
for each(var obj in _array){
datas.push(obj.data);
labels.push(obj.label);
}
//计算圆心角:
var sumAngle:Number=0;
for each (var angle in datas) {
sumAngle+=angle;
}
for each (var a in datas) {
angles.push((a/sumAngle)*2*Math.PI);
}
//画扇形图:
for(var i:uint=0;i<datas.length;i++){;
pie=new Sprite();
pie.graphics.lineStyle(1,0);
pie.graphics.beginFill(colors[i%colors.length]);
pie.graphics.moveTo(0,0);
sumAngle=0;
for(var j:uint=0;j<i;j++){;
sumAngle+=angles[j];
}
pie.graphics.lineTo(radius*Math.cos(sumAngle),radius*Math.sin(sumAngle));
for(var angle1:Number=0;angle1<angles[i]+0.05;angle1+=0.05){;
pie.graphics.lineTo(radius*Math.cos(angle1+sumAngle),radius*Math.sin(angle1+sumAngle));
}
pie.graphics.lineTo(0,0);
pie.addEventListener(flash.events.MouseEvent.MOUSE_OVER,mouseOnPie);
pie.addEventListener(flash.events.MouseEvent.MOUSE_OUT,mouseOutPie);
addChild(pie);
pie.alpha=0.5;
pies.push(pie);
drawRects(i);
}
}//end of function drawPies
private function drawRects(num:uint) {
var rowNum:uint=num%4;
var listNum:uint=uint(num/4);
rect=new Sprite();
rect.graphics.lineStyle(1,0);
rect.graphics.beginFill(colors[num%colors.length]);
rect.graphics.drawRect(0,0,20,20);
rect.graphics.endFill();
addChild(rect);
rect.x=radius+40+listNum*70;
rect.y=-(radius+10)+rowNum*(20+5);
rect.alpha=0.5;
rect.addEventListener(flash.events.MouseEvent.MOUSE_OVER,mouseOnRect);
rect.addEventListener(flash.events.MouseEvent.MOUSE_OUT,mouseOutRect);
//
txt=new TextField();
txt.defaultTextFormat=txtFormat;
txt.text=labels[num]+": "+String(Math.round(1000*angles[num]/(2*Math.PI))/10)+"%";
txt.autoSize=flash.text.TextFieldAutoSize.LEFT;
txt.x=22;
txt.mouseEnabled=false;
rect.addChild(txt);
txts.push(txt);
rects.push(rect);
}//end of drawRects
private var index:Number;
private function mouseOnRect(e:MouseEvent) {
((e.target).getChildAt(0)).border=true;
e.target.alpha=1;
index=rects.indexOf(e.target);
pies[index].alpha=1;
}//end of mouseOnPie
private function mouseOutRect(e:MouseEvent) {
e.target.alpha=0.5;
for each(var t in txts){
t.border=false;}
for each(var p in pies){
p.alpha=0.5;}
}//end of mouseoutPie
private function mouseOnPie(e:MouseEvent) {
e.target.alpha=1;
index=pies.indexOf(e.target);
rects[index].alpha=1;
rects[index].getChildAt(0).border=true;
}//end of mouseOnPie
private function mouseOutPie(e:MouseEvent) {
e.target.alpha=0.5;
for each(var t in txts){
t.border=false;}
for each (var rectangle in rects) {
rectangle.alpha=0.5;
}
}//end of mouseoutPie
}//end of class
}//end of package
//
import maths.Pie;
var a:Pie=new Pie();
a.drawPies([{label:"数学",data:2},{label:"语文",data:3},{label:"英语",data:4},{label:"物理",data:2}]);
addChild(a);
a.x=a.y=100;