////////////////////////////////////////////////////////////////////////////
//円グラフ作成クラス
//VC6  VC2003 にて作成
//
//ダブルバッファリングでちらつきの無い描画ができます。
//
//使用方法---------------------------------------------------
//このファイルを	"PieChart.h" として保存します------------
//
//#include "PieChart.h"
//
//ダイアログ上にSTATICコントロール(IDC_STATIC)を貼り付けます。-----------
//
//グローバル変数に近い所に変数を宣言します。---------
//
//PieChart*p;
//PieData Data[10];
//
//初期化--------------------------------------------------------
//
//p=new PieChart(this,IDC_STATIC);
//p->SetColor(RGB(255,200,200),RGB(0,0,255));
//
//値の設定と描画------------------------------------------------
//
//void CDlg::OnButton1() 
//{
//
////1つ目の扇形の設定
//Data[0].startAngle =0;//開始角度
//Data[0].lastAngle =45;//終了角度
//Data[0].color =RGB(255,0,0);//描画色
//Data[0].paintMode = true;//描画モード 斜線:true 塗りつぶし:false
//
////2つ目の扇形の設定
//Data[1].startAngle =45;
//Data[1].lastAngle =90;
//Data[1].color =RGB(255,0,0);
//Data[1].paintMode = false;
//
////3つ目の扇形の設定
//Data[2].startAngle =90;
//Data[2].lastAngle =180;
//Data[2].color =RGB(0,0,255);
//Data[2].paintMode = true;
//
////4つ目の扇形の設定
//Data[3].startAngle =180;
//Data[3].lastAngle =360;
//Data[3].color =RGB(0,0,255);
//Data[3].paintMode = false;
//
//p->SetData(Data,4);//Data:上の値 4:描画する数
//
//p->OnDrow();//描画
//}
//
///////////////////////////////////////////////////////////////////////////////////

#include "math.h"

struct PieData{
	int startAngle;
	int lastAngle;
	COLORREF color;
	bool paintMode;
};

class PieChart{
private:
	CDialog*pDlg;
	CWnd* pWnd;
	COLORREF cBkColor;
	COLORREF cBaseLineColor;
	PieData*pData;
	int DataCount;

	CPoint Trigon(int angle,int x,int y,int r){
		CPoint p;
		const double pi=3.1415926;
		p.x=(int)((double)x+(sin((pi/(double)180)*(double)angle)*(double)r));
		p.y=(int)((double)y-(cos((pi/(double)180)*(double)angle)*(double)r));
		return p;
	}
protected:
	POINT GetSize(void){
		RECT zRect;
		pWnd->GetClientRect( &zRect );
		POINT p;
		p.x=zRect.right - zRect.left;
		p.y=zRect.bottom - zRect.top;
		return p;
	}

	void DrowGraph(CDC*pMDC,int startAngle,int lastAngle,COLORREF color,bool paintMode=true){
		POINT p=GetSize();
		int iHight=p.x;
		int iWidth=p.y;

		CPen Pen;
		CPen *pTmpPen;
		Pen.CreatePen(PS_SOLID,1,RGB(255,0,0));	//ペンの作成
		pTmpPen = pMDC->SelectObject(&Pen);

		CRect rectClient;
		pWnd->GetClientRect(rectClient);
		CPen pen;
		CBrush brush;
		CBrush* pOldBrush;
		CPen* pOldPen;
		pMDC->SetBkMode(TRANSPARENT);//斜線ブラシの背景をバックカラーで塗りつぶす
		if(paintMode){
			brush.CreateHatchBrush(HS_FDIAGONAL, color);
		}else {brush.CreateSolidBrush(color);}

		pen.CreatePen(PS_SOLID | PS_COSMETIC, 1, color);

		pOldPen = pMDC->SelectObject(&pen);
		pOldBrush = pMDC->SelectObject(&brush);

		int centorY=iWidth/2;
		int centorX=iHight/2;
		int r=10000;

		pMDC->Pie(rectClient,Trigon(lastAngle,centorX,centorY,r),Trigon(startAngle,centorX,centorY,r));

		pMDC->SelectObject(pOldPen);
		pMDC->SelectObject(pOldBrush);
		pen.DeleteObject();
		brush.DeleteObject();
		pMDC->SelectObject(pTmpPen);	//ペンを戻す
		Pen.DeleteObject();
	}
public:

	PieChart(CDialog*pDialog,UINT nID){
		pDlg=pDialog;
		pWnd=pDlg->GetDlgItem(nID);
		cBkColor=RGB(255,255,255);
		cBaseLineColor=RGB(0,0,0);
		DataCount=0;
	}
	void SetData(PieData Data[],int count){
		DataCount=count;
		pData=Data;
	}
	void OnDrow(void){
		pWnd->SetRedraw(true);//描画の開始
		POINT p=GetSize();
		int iHight=p.x;
		int iWidth=p.y;
		
		CDC* pDC=pWnd->GetDC();//CDCを取得
		//描画処理
		CBitmap pBitmap;
		CClientDC dcScreen(pDlg);
		pBitmap.CreateCompatibleBitmap(&dcScreen,iHight,iWidth);//ビットマップを作成

		CDC pMDC;
		pMDC.CreateCompatibleDC(pDC);// 窓と同じ属性のメモリー領域を確保して
		//pB.LoadBitmap(IDB_BITMAP1); // IDB_BITMAP1を選択して
		pMDC.SelectObject(&pBitmap);

		//ブラシの作成
		CBrush Brush;
		CBrush *pTmpBrush;
		Brush.CreateSolidBrush(cBkColor);
		pTmpBrush = pMDC.SelectObject(&Brush);

		//ペンの作成
		CPen Pen;
		CPen *pTmpPen;
		Pen.CreatePen(PS_SOLID,1,cBaseLineColor);	//ペンの作成
		pTmpPen = pMDC.SelectObject(&Pen);		//元のペンを一時退避しながら新たなペンの設定

		//bitmapのBackColorの塗りつぶし
		RECT zRect;
		pWnd->GetClientRect(&zRect);
		pMDC.Rectangle(&zRect);

		//グラフの描画
		DrowGraph(&pMDC,0,45,RGB(255,0,0));

		for(int i=0;i<DataCount;i++){
			DrowGraph(&pMDC,pData[i].startAngle,pData[i].lastAngle,pData[i].color,pData[i].paintMode);
		}

		pDC->BitBlt(0, 0,iHight,iWidth,&pMDC,0,0,SRCCOPY); // 確保したメモリー領域にBitmapをコピーしたのち、pDC に表示します。
		
		pMDC.SelectObject(pTmpPen);				//ペンを戻す
		pMDC.SelectObject(pTmpBrush);			//ブラシを戻す
		Pen.DeleteObject();
		Brush.DeleteObject();
		DeleteDC(pMDC);
		DeleteObject(pBitmap);

		pWnd->ReleaseDC(pDC);//CDCを解放(必ず必要
		pWnd->SetRedraw(false);//描画の停止
	}
	void SetColor(COLORREF BkColor,COLORREF BaseLineColor){
		cBkColor=BkColor;
		cBaseLineColor=BaseLineColor;
	}
};



▲トップページ