/////////////////////////////////////////////////////////////////////////
//
//グラフのラベルを作成するクラス。
//
//使い方----------------------------------------------------------------
//このファイルを ChartLabel.h として取り込みます
//
//#include "ChartLabel.h"
//
//グローバルに近いところに変数宣言--------------------------------------
//
//ChartLabel*pCl;
//LabelData pData[10];//ラベルの値を格納する構造体
//
//初期設定--------------------------------------------------------------
//
//	//1つ目のラベルの値の設定
//	pData[0].Color=RGB(255,0,0);	//色の設定
//	pData[0].Line =false;			//ラインを描画:true 四角を描画:false
//	pData[0].PaintMode =true;		//斜線塗りつぶし:true 塗りつぶし:false (四角を描画の場合のみ有効)
//	pData[0].Str = "今日は晴天なり1";//ラベルの文字列
//	
//	//2つ目のラベルの値の設定
//	pData[1].Color=RGB(255,0,0);
//	pData[1].Line =false;
//	pData[1].PaintMode =false;
//	pData[1].Str = "今日は晴天なり2";
//
//	//3つ目のラベルの値の設定
//	pData[2].Color=RGB(255,0,0);
//	pData[2].Line =true;
//	pData[2].PaintMode =true;
//	pData[2].Str = "今日は晴天なり3";
//
//	//4つ目のラベルの値の設定
//	pData[3].Color=RGB(0,0,255);
//	pData[3].Line =true;
//	pData[3].PaintMode =true;
//	pData[3].Str = "今日は晴天なり4";
//
//	pCl=new ChartLabel(this,IDC_STATIC);//描画するコントロールを指定
//	pCl->SetData(pData,4);//値を設定と値の数の設定
//	pCl->SetLabelWidth(30);//ラベル同士の高さの間隔を設定
//	pCl->SetStartDrowPoint(10,10);//描画開始地点を設定
//	pCl->SetColor(RGB(200,255,255),RGB(200,255,255));//バックカラー、フォアカラーを設定
//
//描画--------------------------------------------------------------
//
//	pCl->OnDrow();//描画します。
//
/////////////////////////////////////////////////////////////////////////
struct LabelData{
	bool Line;
	COLORREF Color;
	bool PaintMode;
	CString Str; 
};

class ChartLabel{
private:
	CDialog*pDlg;
	CWnd* pWnd;
	COLORREF cBkColor;
	COLORREF cBaseLineColor;
	LabelData*pData;
	int DataCount;
	int LineWidth;
	int StartDrowPointX;
	int StartDrowPointY;
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,LabelData*Data,int x,int y){
		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;

		if(Data->PaintMode){
			brush.CreateHatchBrush(HS_FDIAGONAL, Data->Color);
		}else {brush.CreateSolidBrush(Data->Color);}

		pen.CreatePen(PS_SOLID | PS_COSMETIC, 1, Data->Color);

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

		if(Data->Line){
			pMDC->MoveTo(x,y+10);
			pMDC->LineTo(x+40,y+10);
		}else{
			pMDC->Rectangle(x,y,x+40,y+20);
		}
		pMDC->TextOut(x+50,y,Data->Str);

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

	ChartLabel(CDialog*pDialog,UINT nID){
		pDlg=pDialog;
		pWnd=pDlg->GetDlgItem(nID);
		cBkColor=RGB(255,255,255);
		cBaseLineColor=RGB(0,0,0);
		DataCount=0;
		LineWidth=30;
		StartDrowPointX=0;
		StartDrowPointY=0;
	}
	void SetData(LabelData 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);
		
		//描画

		pMDC.SetBkMode(TRANSPARENT);
		for(int i=0;i<DataCount;i++){
			DrowGraph(&pMDC,&pData[i],StartDrowPointX,LineWidth*i+StartDrowPointY);
		}

		pDC->BitBlt(0 ,0,zRect.right ,zRect.bottom ,&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;
	}
	void SetLabelWidth(int Width){
		LineWidth = Width;
	}
	void SetStartDrowPoint(int x,int y){
		StartDrowPointX=x;
		StartDrowPointY=y;
	}
};




▲トップページ