⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bar.cpp

📁 WINCE下的画图工具
💻 CPP
字号:
// Bar.cpp: implementation of the CBar class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Bar.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CBar::CBar()
{
	CoordinateDirection = VER;
	XFieldMode = ON;
	LegendMode = BOTTOM;
	TitleMode = TOP;
	GraphMode = FALSE;
	WithDash = FALSE;
	Column = FALSE;

	yDeta = 5;
	yCoorDeta = 0;
}

CBar::~CBar()
{

}
void CBar::DrawCoordinate(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy,BOOL WithDash)
{
	if(GraphMode == FALSE)//Flat
		Draw2DCoordinate(pDC,LeftTopx,LeftTopy,RightBottomx,RightBottomy,WithDash);
	else
		Draw3DCoordinate(pDC,LeftTopx,LeftTopy,RightBottomx,RightBottomy,WithDash);
}
void CBar::Draw2DCoordinate(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy,BOOL WithDash)
{
	int nDeta = 5;
	int nCount = (YMax - YMin)/nDeta ;
	int nCoorDeta = (RightBottomy - LeftTopy)/nCount;
	yCoorDeta = nCoorDeta;
	while(nCoorDeta < 10 )
	{
		yDeta = nDeta;
		nDeta += 5;
		nCount = (YMax - YMin)/nDeta ;
		nCoorDeta = (RightBottomy - LeftTopy)/nCount;
		yCoorDeta = nCoorDeta;
	}
	DrawLine(pDC,LeftTopx,LeftTopy,LeftTopx,RightBottomy);
	DrawLine(pDC,LeftTopx,RightBottomy,RightBottomx,RightBottomy);
	if(WithDash)
	{
		DrawLine(pDC,RightBottomx,RightBottomy,RightBottomx,LeftTopy);
		DrawLine(pDC,RightBottomx,LeftTopy,LeftTopx,LeftTopy);
	}
	CString CoordinateValue;
	CoordinateValue.Format(_T("%3d"),YMin);
	DrawYCoordinateValue(pDC,LeftTopx-18,RightBottomy-5,CoordinateValue);
	for(int i=1;i<=nCount;i++)
	{
		if(WithDash)
			DrawDashLine(pDC,LeftTopx,RightBottomy-nCoorDeta*i,RightBottomx,RightBottomy-nCoorDeta*i);
		DrawLine(pDC,LeftTopx,RightBottomy-nCoorDeta*i,LeftTopx+5,RightBottomy-nCoorDeta*i);
		CoordinateValue.Format(_T("%3d"),YMin+nDeta*i);
		DrawYCoordinateValue(pDC,LeftTopx-18,RightBottomy-nCoorDeta*i-5,CoordinateValue);
	}

	DrawXName(pDC,RightBottomx-12*XName.GetLength(),RightBottomy+15,XName);
	DrawYName(pDC,LeftTopx-35,LeftTopy+12*YName.GetLength(),YName);
	DrawTitle(pDC,LeftTopx,LeftTopy,RightBottomx,RightBottomy,TitleMode);
}
void CBar::Draw3DCoordinate(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy,BOOL WithDash)
{
	int nXDeta = (RightBottomx-LeftTopx)/(m_Legend.GetSize()+1);
	if(Column == FALSE)
	{
		int nDeta = 5;
		int nCount = (YMax - YMin)/nDeta ;
		int nCoorDeta = (RightBottomy - LeftTopy)/nCount;
		yCoorDeta = nCoorDeta;
		while(nCoorDeta < 10 )
		{
			nDeta += 5;
			yDeta = nDeta;
			nCount = (YMax - YMin)/nDeta ;
			nCoorDeta = (RightBottomy - LeftTopy)/nCount;
			yCoorDeta = nCoorDeta;
		}
		DrawLine(pDC,LeftTopx,LeftTopy,LeftTopx,RightBottomy);
		DrawLine(pDC,LeftTopx,RightBottomy,RightBottomx,RightBottomy);
		DrawLine(pDC,LeftTopx,LeftTopy,LeftTopx+nXDeta/2,LeftTopy-nXDeta/2);
		DrawLine(pDC,LeftTopx,RightBottomy,LeftTopx+nXDeta/2,RightBottomy-nXDeta/2);
		DrawLine(pDC,RightBottomx,RightBottomy,RightBottomx+nXDeta/2,RightBottomy-nXDeta/2);
		DrawLine(pDC,LeftTopx+nXDeta/2,LeftTopy-nXDeta/2,LeftTopx+nXDeta/2,RightBottomy-nXDeta/2);
		DrawLine(pDC,RightBottomx+nXDeta/2,LeftTopy-nXDeta/2,RightBottomx+nXDeta/2,RightBottomy-nXDeta/2);
		DrawLine(pDC,LeftTopx+nXDeta/2,LeftTopy-nXDeta/2,RightBottomx+nXDeta/2,LeftTopy-nXDeta/2);
		DrawLine(pDC,LeftTopx+nXDeta/2,RightBottomy-nXDeta/2,RightBottomx+nXDeta/2,RightBottomy-nXDeta/2);

		CString CoordinateValue;
		CoordinateValue.Format(_T("%3d"),YMin);
		DrawYCoordinateValue(pDC,LeftTopx-18,RightBottomy-5,CoordinateValue);
		for(int i=1;i<=nCount;i++)
		{
			if(WithDash)
			{
				DrawDashLine(pDC,LeftTopx,RightBottomy-nCoorDeta*i,LeftTopx+nXDeta/2,RightBottomy-nCoorDeta*i-nXDeta/2);
				DrawDashLine(pDC,LeftTopx+nXDeta/2,RightBottomy-nCoorDeta*i-nXDeta/2,RightBottomx+nXDeta/2,RightBottomy-nCoorDeta*i-nXDeta/2);
			}
			CoordinateValue.Format(_T("%3d"),YMin+nDeta*i);
			DrawYCoordinateValue(pDC,LeftTopx-18,RightBottomy-nCoorDeta*i-5,CoordinateValue);
		}
		
		DrawXName(pDC,RightBottomx-12*XName.GetLength(),RightBottomy+15,XName);
		DrawYName(pDC,LeftTopx-35,LeftTopy+12*YName.GetLength(),YName);
		DrawTitle(pDC,LeftTopx,LeftTopy,RightBottomx,RightBottomy,TitleMode);
	}
	else
	{
		Draw2DCoordinate(pDC,LeftTopx,LeftTopy,RightBottomx,RightBottomy,WithDash);
	}
}
void CBar::DrawBar(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy)
{
	int nWidth = 30;
	DrawCoordinate(pDC,LeftTopx+40,LeftTopy+37,RightBottomx-4-nWidth,RightBottomy-54,WithDash);
	DrawContent(pDC,LeftTopx+40,LeftTopy+37,RightBottomx-4-nWidth,RightBottomy-54);
	DrawLegend(pDC,RightBottomx-2-nWidth,LeftTopy+37,nWidth,LegendMode);
}
void CBar::DrawContent(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy)
{
	if(GraphMode == FALSE)
		Draw2DBar(pDC,LeftTopx,LeftTopy,RightBottomx,RightBottomy);
	else
		Draw3DBar(pDC,LeftTopx,LeftTopy,RightBottomx,RightBottomy);
}
void CBar::Draw2DBarContent(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy)
{
	int nXDeta = (RightBottomx-LeftTopx)/(m_Legend.GetSize()+1);
	for(int i=1;i<=m_Legend.GetSize();i++)
	{
		if(m_Legend.GetAt(i-1).Value > YMax)
		{
			Legend LegendTmp = m_Legend.GetAt(i-1); 
			LegendTmp.Value = YMax;
			m_Legend.SetAt(i-1,LegendTmp);
		}
		if(m_Legend.GetAt(i-1).Value < YMin) 
		{
			Legend LegendTmp = m_Legend.GetAt(i-1); 
			LegendTmp.Value = YMin;
			m_Legend.SetAt(i-1,LegendTmp);
		}
		if(WithDash)
			DrawDashLine(pDC,LeftTopx+nXDeta*i,RightBottomy,LeftTopx+nXDeta*i,LeftTopy);
		int Height = ((int)(m_Legend.GetAt(i-1).Value+0.5)-YMin)*yCoorDeta/yDeta;
	//	Height = (Height<(yCoorDeta*(YMax-YMin)/yDeta))?Height:(yCoorDeta*(YMax-YMin)/yDeta);
		if(GraphMode == FALSE)
			DrawRectangle(pDC,LeftTopx+nXDeta*i-nXDeta/2+1,RightBottomy-Height,LeftTopx+nXDeta*i+nXDeta/2-1,RightBottomy,m_Legend.GetAt(i-1).Graph.LineSize,m_Legend.GetAt(i-1).Graph.LineColor,m_Legend.GetAt(i-1).Graph.FillColor);
		else
		{
			DrawColumn(pDC,LeftTopx+nXDeta*i-nXDeta/2+1,RightBottomy-nXDeta/2+2-Height,LeftTopx+nXDeta*i+nXDeta/2-1,RightBottomy+nXDeta/2-2-Height,Height,m_Legend.GetAt(i-1).Graph.LineSize,m_Legend.GetAt(i-1).Graph.LineColor,m_Legend.GetAt(i-1).Graph.FillColor);
		//	DrawColumn(pDC,80,80,80+40,80+30,Height,m_Legend.GetAt(i-1).Graph.LineSize,m_Legend.GetAt(i-1).Graph.LineColor,m_Legend.GetAt(i-1).Graph.FillColor);
		}
		switch(XFieldMode)
		{
		case LEFT:
		case RIGHT:
		case NONE:
			break;
		case TOP:
		//	if(nXDeta < 12*m_Legend.GetAt(i-1).Name.GetLength())
		//		DrawXCoordinateValue(pDC,LeftTopx+nXDeta*i-nXDeta/2+2,RightBottomy-Height-1,m_Legend.GetAt(i-1).Name,HOR);
		//	else
				DrawXCoordinateValue(pDC,LeftTopx+nXDeta*i-nXDeta/2+2,RightBottomy-Height-15,m_Legend.GetAt(i-1).Name);
			break;
		case BOTTOM:
			DrawXCoordinateValue(pDC,LeftTopx+nXDeta*i-nXDeta/2+2,RightBottomy+15,m_Legend.GetAt(i-1).Name);
			break;
		case ON:
			//if(nXDeta < 12*m_Legend.GetAt(i-1).Name.GetLength())
			DrawXCoordinateValue(pDC,LeftTopx+nXDeta*i-nXDeta/2+2,RightBottomy-5,m_Legend.GetAt(i-1).Name,HOR);
			//else
			//	DrawXCoordinateValue(pDC,LeftTopx+nXDeta*i-nXDeta/2+2,RightBottomy-5,m_Legend.GetAt(i-1).Name);
			break;
		}
	}
}
void CBar::Draw3DBarContent(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy)
{
	if(Column == FALSE)
	{
		int nXDeta = (RightBottomx-LeftTopx)/(m_Legend.GetSize()+1);
		for(int i=1;i<=m_Legend.GetSize();i++)
		{
			if(m_Legend.GetAt(i-1).Value > YMax)
			{
				Legend LegendTmp = m_Legend.GetAt(i-1); 
				LegendTmp.Value = YMax;
				m_Legend.SetAt(i-1,LegendTmp);
			}
			if(m_Legend.GetAt(i-1).Value < YMin) 
			{
				Legend LegendTmp = m_Legend.GetAt(i-1); 
				LegendTmp.Value = YMin;
				m_Legend.SetAt(i-1,LegendTmp);
			}

			int Height = ((int)(m_Legend.GetAt(i-1).Value+0.5)-YMin)*yCoorDeta/yDeta;
			//	Height = (Height<(yCoorDeta*(YMax-YMin)/yDeta))?Height:(yCoorDeta*(YMax-YMin)/yDeta);
			DrawCub(pDC,LeftTopx+nXDeta*i-nXDeta/2+1,RightBottomy-Height,LeftTopx+nXDeta*i+nXDeta/2-1,RightBottomy-Height,Height,m_Legend.GetAt(i-1).Graph.LineSize,m_Legend.GetAt(i-1).Graph.LineColor,m_Legend.GetAt(i-1).Graph.FillColor);
			
			switch(XFieldMode)
			{
			case LEFT:
			case RIGHT:
			case NONE:
				break;
			case TOP:
				//	if(nXDeta < 12*m_Legend.GetAt(i-1).Name.GetLength())
				//		DrawXCoordinateValue(pDC,LeftTopx+nXDeta*i-nXDeta/2+2,RightBottomy-Height-1,m_Legend.GetAt(i-1).Name,HOR);
				//	else
				DrawXCoordinateValue(pDC,LeftTopx+nXDeta*i-nXDeta/2+2,RightBottomy-Height-15,m_Legend.GetAt(i-1).Name);
				break;
			case BOTTOM:
				DrawXCoordinateValue(pDC,LeftTopx+nXDeta*i-nXDeta/2+2,RightBottomy+15,m_Legend.GetAt(i-1).Name);
				break;
			case ON:
				//if(nXDeta < 12*m_Legend.GetAt(i-1).Name.GetLength())
				DrawXCoordinateValue(pDC,LeftTopx+nXDeta*i-nXDeta/2+2,RightBottomy-5,m_Legend.GetAt(i-1).Name,HOR);
				//else
				//	DrawXCoordinateValue(pDC,LeftTopx+nXDeta*i-nXDeta/2+2,RightBottomy-5,m_Legend.GetAt(i-1).Name);
				break;
			}
		}
	}
	else
	{
		Draw2DBarContent(pDC,LeftTopx,LeftTopy,RightBottomx,RightBottomy);
	}
}
void CBar::Draw2DBar(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy)
{
	Draw2DCoordinate(pDC,LeftTopx,LeftTopy,RightBottomx,RightBottomy,WithDash);
	Draw2DBarContent(pDC,LeftTopx,LeftTopy,RightBottomx,RightBottomy);
}
void CBar::Draw3DBar(CDC* pDC,int LeftTopx,int LeftTopy,int RightBottomx,int RightBottomy)
{
	Draw3DCoordinate(pDC,LeftTopx,LeftTopy,RightBottomx,RightBottomy,WithDash);
	Draw3DBarContent(pDC,LeftTopx,LeftTopy,RightBottomx,RightBottomy);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -