/////////////////////////////////////////////////////////////////////////
//
//グラフのラベルを作成するクラス。
//
//使い方----------------------------------------------------------------
//このファイルを 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;
}
};
▲トップページ