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

📄 roundmeter.cpp

📁 一个非常灵活的圆行仪表类
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		{
			PtRgn[cnt].x=PtRgn[cnt-1].x;
			PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
			PtRgn[cnt].x=PtCenter.x-nRadius;
			PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
			PtRgn[cnt].x=PtCenter.x-nRadius;
			PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
			PtRgn[cnt].x=PtCenter.x+nRadius;
			PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
			PtRgn[cnt].x=PtCenter.x+nRadius;
			PtRgn[cnt].y=PtCenter.y-(int)(nRadius*sin(double(EndAngle/180.0)*PI));cnt++;
		}
		else
		{
			if(EndAngle<90)
			{
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
			}
			if(90<=EndAngle && EndAngle<180)
			{
				PtRgn[cnt].x=PtRgn[cnt-1].x;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+(int)(nRadius*cos(double(EndAngle/180.0)*PI));
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
			}
			if(180<=EndAngle && EndAngle<270)
			{
				PtRgn[cnt].x=PtRgn[cnt-1].x;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y-(int)(nRadius*sin(double(EndAngle/180.0)*PI));cnt++;
			}
			if(270<=EndAngle && EndAngle<=360)
			{
				PtRgn[cnt].x=PtRgn[cnt-1].x;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+(int)(nRadius*cos(double(EndAngle/180.0)*PI));
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
			}
		}
	}
	if(90<=StartAngle && StartAngle<180)		//开始角在第二象限
	{
		if(StartAngle>EndAngle)
		{
			if(EndAngle>=90)
			{
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtRgn[cnt-1].y;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+(int)(nRadius*cos(double(EndAngle/180.0)*PI));
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
			}
			else
			{
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtRgn[cnt-1].y;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y-(int)(nRadius*sin(double(EndAngle/180.0)*PI));cnt++;
			}
			
		}
		else
		{
			if(EndAngle<180)
			{
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
			}
			if(180<=EndAngle && EndAngle<270)
			{
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtRgn[cnt-1].y;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y-(int)(nRadius*sin(double(EndAngle/180.0)*PI));cnt++;
			}
			if(270<=EndAngle && EndAngle<=360)
			{
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtRgn[cnt-1].y;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+(int)(nRadius*cos(double(EndAngle/180.0)*PI));
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
			}

		}
	}
	if(180<=StartAngle && StartAngle<270)		//开始角在第三象限
	{
		if(StartAngle>EndAngle)
		{
			if(EndAngle>=180)
			{
				PtRgn[cnt].x=PtRgn[cnt-1].x;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y-(int)(nRadius*sin(double(EndAngle/180.0)*PI));cnt++;

			}
			if(90<=EndAngle && EndAngle<180)
			{
				PtRgn[cnt].x=PtRgn[cnt-1].x;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+(int)(nRadius*cos(double(EndAngle/180.0)*PI));
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
			}
			if(0<=EndAngle && EndAngle<90)
			{
				PtRgn[cnt].x=PtRgn[cnt-1].x;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y-(int)(nRadius*sin(double(EndAngle/180.0)*PI));cnt++;
			}
			
		}
		else
		{
			if(EndAngle<270)
			{
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
			}
			if(270<=EndAngle && EndAngle<=360)
			{
				PtRgn[cnt].x=PtRgn[cnt-1].x;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+(int)(nRadius*cos(double(EndAngle/180.0)*PI));
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
			}
		}
	}
	if(270<=StartAngle && StartAngle<=360)		//开始角在第四象限
	{
		if(StartAngle>EndAngle)
		{
			if(EndAngle>=270)
			{
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtRgn[cnt-1].y;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+(int)(nRadius*cos(double(EndAngle/180.0)*PI));
				PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
			}
			if(180<=EndAngle && EndAngle<270)
			{
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtRgn[cnt-1].y;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x-nRadius;
				PtRgn[cnt].y=PtCenter.y-(int)(nRadius*sin(double(EndAngle/180.0)*PI));cnt++;
			}
			if(90<=EndAngle && EndAngle<180)
			{
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtRgn[cnt-1].y;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
				PtRgn[cnt].x=PtCenter.x+(int)(nRadius*cos(double(EndAngle/180.0)*PI));
				PtRgn[cnt].y=PtCenter.y-nRadius;cnt++;
			}
			if(0<=EndAngle && EndAngle<90)
			{
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtRgn[cnt-1].y;cnt++;
				PtRgn[cnt].x=PtCenter.x+nRadius;
				PtRgn[cnt].y=PtCenter.y-(int)(nRadius*sin(double(EndAngle/180.0)*PI));cnt++;
			}
		}
		else
		{
			PtRgn[cnt].x=PtCenter.x+nRadius;
			PtRgn[cnt].y=PtCenter.y+nRadius;cnt++;
		}
	}
	PtRgn[cnt].x=PtCenter.x+(int)(nRadius*cos(double(EndAngle/180.0)*PI));
	PtRgn[cnt].y=PtCenter.y-(int)(nRadius*sin(double(EndAngle/180.0)*PI));cnt++;
	PtRgn[cnt].x=PtCenter.x;
	PtRgn[cnt].y=PtCenter.y;cnt++;
	return cnt;
}
//计算与刻度,字体有关的变量
void CRoundMeter::CalAboutTicks(int nRadius)
{
	m_TicksSPt.RemoveAll();             //大格起始点
	m_TicksEPt.RemoveAll();             //大格终止点
	m_TicksTitle.RemoveAll();           //写刻度的矩形
	m_SubTicksSPt.RemoveAll();          //小格起始点
	m_SubTicksEPt.RemoveAll();          //小格终止点
	double dMaxAngle,dMinAnble,dHalfAngle;
	//计算每个大格和小格的角度
	if(m_nStartAngle==m_nEndAngle)
	{
		dMaxAngle=double(360.00f / m_nTicks);
		dHalfAngle=180;
	}
	if(m_nStartAngle>m_nEndAngle)
	{
		dMaxAngle=double(m_nStartAngle-m_nEndAngle)/double(m_nTicks);
		dHalfAngle=double(m_nStartAngle-m_nEndAngle)/2.0;
	}
	if(m_nStartAngle<m_nEndAngle)
	{
		dMaxAngle=double(m_nStartAngle+360-m_nEndAngle)/double(m_nTicks);
		dHalfAngle=double(m_nStartAngle+360-m_nEndAngle)/2.0;
	}
	dMinAnble = dMaxAngle / m_nSubTicks;
	//计算大格刻度坐标绘制点和刻度字方框
	int nlength;
	char strFigure[MAXNAMELENGTH + 1];
	double dWidth = fabs(nRadius / 15);
	double dtexth = fabs(nRadius / 10);  //字体高度
	memset(strFigure, 0, sizeof(strFigure));
	CRect tempRect;
	double dRadius = fabs(nRadius / 2 - nRadius / 15);	
	CPoint tempt;
	double dDrawAngle=m_nStartAngle*PI/180.0;
	double dStartAngle=double(m_nStartAngle);
	for (int i=0; i<=m_nTicks; i++) //刻度坐标
	{
		if(i==0 || i==m_nTicks)
		{
			tempt.x = int(m_ptMeterCenter.x + (dRadius+dWidth) * cos(dDrawAngle));
			tempt.y = int(m_ptMeterCenter.y - (dRadius+dWidth) * sin(dDrawAngle));
		}
		else
		{
			tempt.x = int(m_ptMeterCenter.x + dRadius * cos(dDrawAngle));
			tempt.y = int(m_ptMeterCenter.y - dRadius * sin(dDrawAngle));
		}
		
		m_TicksSPt.Add(tempt);
		tempt.x = int(m_ptMeterCenter.x + (dRadius-dWidth) * cos(dDrawAngle));
		tempt.y = int(m_ptMeterCenter.y - (dRadius-dWidth) * sin(dDrawAngle)); 
		m_TicksEPt.Add(tempt);

		nlength=sprintf(strFigure, "%.0f", (m_dMaxValue - m_dMinValue) * i / m_nTicks);
		//计算字迹中心点
		tempt.x = int(m_ptMeterCenter.x + (dRadius-dWidth) * cos(dDrawAngle));
		tempt.y = int(m_ptMeterCenter.y - (dRadius-dWidth) * sin(dDrawAngle));
		//计算不同角度的偏移量
		tempt.x=tempt.x-int((nlength*dtexth/3.0+2)/2.0*cos(dDrawAngle));
		tempt.y=tempt.y+int(dtexth/2.0*sin(dDrawAngle));
		//计算字符串矩形
		tempRect.SetRect(tempt.x-int((nlength*dtexth/3.0+2)/2.0),
			tempt.y-int(dtexth/2.0),
			tempt.x+int((nlength*dtexth/3.0+2)/2.0),
			tempt.y+int(dtexth/2.0));
		m_TicksTitle.Add(tempRect);

		dStartAngle=dStartAngle-dMaxAngle;
		if(dStartAngle<0)
			dStartAngle=dStartAngle+360;
		dDrawAngle=dStartAngle*PI/180.0;
	}
	//计算小格刻度坐标绘制点
	dWidth = fabs(nRadius / 20);
	dStartAngle=double(m_nStartAngle);
	for (i=0; i<m_nTicks; i++)
	{
		for (int j=1; j<m_nSubTicks; j++)  
		{
			dStartAngle=dStartAngle-dMinAnble;
			if(dStartAngle<0)
				dStartAngle=dStartAngle+360;
			dDrawAngle = dStartAngle * PI / 180;
			tempt.x = int(m_ptMeterCenter.x + dRadius * cos(dDrawAngle));
			tempt.y = int(m_ptMeterCenter.y - dRadius * sin(dDrawAngle));
			m_SubTicksSPt.Add(tempt);
			tempt.x = int(m_ptMeterCenter.x + (dRadius-dWidth) * cos(dDrawAngle));
			tempt.y = int(m_ptMeterCenter.y - (dRadius-dWidth) * sin(dDrawAngle)); 
			m_SubTicksEPt.Add(tempt);
		}
		dStartAngle=dStartAngle-dMinAnble;
		if(dStartAngle<0)
			dStartAngle=dStartAngle+360;
	}

	//计算表题矩形
	dHalfAngle=double(m_nStartAngle)-dHalfAngle;
	if(dHalfAngle<0.0)
		dHalfAngle=dHalfAngle+360.0;         //计算标题中心所在角度
	dDrawAngle = dHalfAngle * PI / 180;
	int nRadiusFrame = m_nRadiusFrame / 2;
	tempt.x = int(m_ptMeterCenter.x + nRadiusFrame*0.4f * cos(dDrawAngle));
	tempt.y = int(m_ptMeterCenter.y - nRadiusFrame*0.4f * sin(dDrawAngle));
	m_nrectUnits.SetRect(int(tempt.x - nRadiusFrame * 0.30f),
		int(tempt.y - nRadiusFrame * 0.20f),
		int(tempt.x + nRadiusFrame * 0.30f),
		int(tempt.y + nRadiusFrame * 0.20f));
//	//计算显示值的中心点
	if(0<=dHalfAngle && dHalfAngle<=180)
	{
		tempt.x=m_ptMeterCenter.x;
		tempt.y=int(m_ptMeterCenter.y + nRadiusFrame*0.3f * sin(dDrawAngle));
	}
	else
	{
		tempt.x=m_ptMeterCenter.x;
		tempt.y=int(m_ptMeterCenter.y - nRadiusFrame*0.3f * sin(dDrawAngle));
	}
	m_nrectValue.SetRect(int(tempt.x - nRadiusFrame * 0.30f),
		int(tempt.y - nRadiusFrame * 0.10f),
		int(tempt.x + nRadiusFrame * 0.30f),
		int(tempt.y + nRadiusFrame * 0.10f));

}

⌨️ 快捷键说明

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