📄 roundmeter.cpp
字号:
{
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 + -