📄 meter.cpp
字号:
else if(dtempangle>10)
{
::SetTextAlign(pDC->m_hDC ,TA_RIGHT|TA_BASELINE) ;
pDC->ExtTextOut(pointInner[m_nSubTicks*i].x, pointInner[m_nSubTicks*i].y+nHeight/2,ETO_OPAQUE,NULL ,strtemp , NULL) ;
}
else if(dtempangle>-10)
{
::SetTextAlign(pDC->m_hDC ,TA_RIGHT|TA_BASELINE) ;
pDC->ExtTextOut(pointInner[m_nSubTicks*i].x, pointInner[m_nSubTicks*i].y+nHeight/3,ETO_OPAQUE,NULL ,strtemp , NULL) ;
}
else
{
::SetTextAlign(pDC->m_hDC ,TA_RIGHT|TA_BOTTOM) ;
pDC->ExtTextOut(pointInner[m_nSubTicks*i].x, pointInner[m_nSubTicks*i].y+nHeight/2,ETO_OPAQUE,NULL ,strtemp , NULL) ;
}
}
pDC->SelectObject(pFontOld);
}
void CMeter::ReconstructControl()
{
if ((m_pBitmapOldBackground) && (m_bitmapBackground.GetSafeHandle()) && (m_dcBackground.GetSafeHdc()))
{
m_dcBackground.SelectObject(m_pBitmapOldBackground);
m_dcBackground.DeleteDC() ;
m_bitmapBackground.DeleteObject();
}
Invalidate ();
}
void CMeter::DrawNeedle(CDC *pDC)
{
int nResult;
double dRadPerDeg = 4.0*atan(1.0)/180.0;
double dAngleDeg;
double dAngleRad ;
double dTemp ;
CBrush brushFill, *pBrushOld ;
CPen penDraw, *pPenOld ;
CPoint pointNeedle[4] ; // 指针由四边形组成
// 计算角度并限定指针走的角度
dAngleDeg = m_nStartAngleDeg-(360.0+m_nStartAngleDeg-m_nEndAngleDeg)
*(m_dCurrentValue-m_dMinValue)/(m_dMaxValue-m_dMinValue);
dAngleDeg = min(dAngleDeg, m_nStartAngleDeg);
dAngleDeg = max(dAngleDeg, m_nEndAngleDeg-360.0);
dAngleRad = dAngleDeg*dRadPerDeg;
// 计算三角形底边两个点
pointNeedle[0].x = m_ptMeterCenter.x - (int)(m_nCenterRadius*10*sin(dAngleRad)/8);
pointNeedle[0].y = m_ptMeterCenter.y - (int)(m_nCenterRadius*10*cos(dAngleRad)/8);
pointNeedle[2].x = m_ptMeterCenter.x + (int)(m_nCenterRadius*10*sin(dAngleRad)/8);
pointNeedle[2].y = m_ptMeterCenter.y + (int)(m_nCenterRadius*10*cos(dAngleRad)/8);
// 计算指针顶部坐标
dTemp = m_ptMeterCenter.x + m_nRadiusFrame*cos(dAngleRad)*95/100;
pointNeedle[1].x = ROUND(dTemp);
dTemp = m_ptMeterCenter.y - m_nRadiusFrame*sin(dAngleRad)*95/100;
pointNeedle[1].y = ROUND(dTemp);
// 计算指针尾部坐标
dTemp = m_ptMeterCenter.x - m_nRadiusFrame*cos(dAngleRad)/6;
pointNeedle[3].x = ROUND(dTemp);
dTemp = m_ptMeterCenter.y + m_nRadiusFrame*sin(dAngleRad)/6;
pointNeedle[3].y = ROUND(dTemp);
pDC->SelectClipRgn(&m_rgnBoundary);
brushFill.CreateSolidBrush(m_colorNeedle);
penDraw.CreatePen(PS_SOLID, 1, m_colorNeedle);
pPenOld = pDC->SelectObject(&penDraw) ;
pBrushOld = pDC->SelectObject(&brushFill) ;
// 绘制指针
pDC->Polygon(pointNeedle, 4);
nResult = pDC->SelectClipRgn(NULL);
pDC->SelectObject(pPenOld);
pDC->SelectObject(pBrushOld);
// 立体感处理
if(dAngleDeg>90)
{
penDraw.DeleteObject();
penDraw.CreatePen(PS_SOLID, 2, m_colorShadow);
pPenOld = pDC->SelectObject(&penDraw);
pDC->MoveTo(pointNeedle[1]);
pDC->LineTo(pointNeedle[0]);
pDC->LineTo(pointNeedle[3]);
pDC->SelectObject(pPenOld);
penDraw.DeleteObject();
penDraw.CreatePen(PS_SOLID, 1, m_colorHighlight);
pPenOld = pDC->SelectObject(&penDraw);
pDC->MoveTo(pointNeedle[1]);
pDC->LineTo(pointNeedle[2]);
pDC->LineTo(pointNeedle[3]);
pDC->SelectObject(pPenOld);
}
else
{
penDraw.DeleteObject();
penDraw.CreatePen(PS_SOLID, 2, m_colorShadow);
pPenOld = pDC->SelectObject(&penDraw);
pDC->MoveTo(pointNeedle[1]);
pDC->LineTo(pointNeedle[2]);
pDC->LineTo(pointNeedle[3]);
pDC->SelectObject(pPenOld);
penDraw.DeleteObject();
penDraw.CreatePen(PS_SOLID, 1, m_colorHighlight);
pPenOld = pDC->SelectObject(&penDraw);
pDC->MoveTo(pointNeedle[1]);
pDC->LineTo(pointNeedle[0]);
pDC->LineTo(pointNeedle[3]);
pDC->SelectObject(pPenOld);
}
}
void CMeter::UpdateNeedle(double dValue)
{
if (m_dCurrentValue != dValue)
{
m_dCurrentValue = dValue;
Invalidate();
}
}
void CMeter::SetNeedleColor(COLORREF colorNeedle)
{
if (m_colorNeedle != colorNeedle )
{
m_colorNeedle = colorNeedle ;
ReconstructControl() ;
}
}
void CMeter::SetRange(double dMin, double dMax)
{
m_dMaxValue = dMax ;
m_dMinValue = dMin ;
ReconstructControl() ;
}
void CMeter::SetScaleDecimals(int nDecimals)
{
m_nScaleDecimals = nDecimals ;
ReconstructControl() ;
}
void CMeter::SetUnits(CString &strUnits)
{
m_strUnits = strUnits ;
ReconstructControl() ;
}
void CMeter::SetValueDecimals(int nDecimals)
{
m_nValueDecimals = nDecimals ;
ReconstructControl() ;
}
void CMeter::DrawNode(CDC *pDC)
{
CPen penDraw, *pPenOld;
COLORREF cEdge, cMiddle, cNode;
cMiddle = RGB(255, 255, 255);
cEdge = RGB(0, 0, 0);
for(int i=m_nCenterRadius*3/4; i>=0; i--)
{
cNode = RGB((GetRValue(cEdge)-GetRValue(cMiddle))*((float)i)*4/(3*m_nCenterRadius)+GetRValue(cMiddle),
(GetGValue(cEdge)-GetGValue(cMiddle))*((float)i)*4/(3*m_nCenterRadius)+GetGValue(cMiddle),
(GetBValue(cEdge)-GetBValue(cMiddle))*((float)i)*4/(3*m_nCenterRadius)+GetBValue(cMiddle));
penDraw.DeleteObject();
penDraw.CreatePen(PS_SOLID, 1, cNode);
pPenOld = pDC->SelectObject(&penDraw);
// pDC->Arc(m_ptMeterCenter.x-i, m_ptMeterCenter.y-i,m_ptMeterCenter.x+i,m_ptMeterCenter.y+i,
// m_ptMeterCenter.x-i,m_ptMeterCenter.y,m_ptMeterCenter.x-i,m_ptMeterCenter.y);
pDC->SelectObject(pPenOld);
}
}
void CMeter::SetColorTick(BOOL bColorTick)
{
m_bColorTick = bColorTick;
ReconstructControl();
}
void CMeter::DrawValue(CDC *pDC)
{
int nHeight;
CPoint pttemp;
CString strtemp;
CFont *pFontOld;
// 数值显示
nHeight = m_nRadiusFrame / 5;
pttemp = m_rectValue.CenterPoint();
strtemp.Format(_T("%.*lf"), m_nValueDecimals, m_dCurrentValue);
m_font.DeleteObject() ;
m_font.CreateFont (nHeight, 0, 0, 0, 400,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, _T("Arial")) ;
pFontOld = pDC->SelectObject(&m_font);
pDC->SetBkColor(m_colorButton);
::SetTextAlign(pDC->m_hDC ,TA_TOP|TA_CENTER) ;
pDC->ExtTextOut(pttemp.x, pttemp.y,ETO_OPAQUE,NULL ,m_strUnits , NULL) ;
pDC->ExtTextOut(pttemp.x, pttemp.y+nHeight,ETO_OPAQUE,NULL ,strtemp , NULL) ;
// 恢复字体和背景色
pDC->SelectObject(pFontOld);
pDC->SetBkColor(m_colorWindow);
m_font.DeleteObject() ;
}
void CMeter::SetTicks(int nTicks)
{
m_nTicks = nTicks;
ReconstructControl();
}
void CMeter::SetSubTicks(int nSubTicks)
{
m_nSubTicks = nSubTicks;
ReconstructControl();
}
void CMeter::SetAngleRange(int nStartAngleDeg, int nEndAngleDeg)
{
m_nStartAngleDeg = nStartAngleDeg;
m_nEndAngleDeg = nEndAngleDeg;
ReconstructControl();
}
//设定报警上限
float CMeter::SetUpperValue(float fv)
{
fWarnupper = fv ;
return fWarnupper ;
}
//设定报警下限
float CMeter::SetLowerValue(float fLower)
{
fWarnlower = fLower ;
return fWarnlower ;
}
//计算报警状态
void CMeter::CalStatus()
{
if (m_dCurrentValue > fWarnupper || m_dCurrentValue < fWarnlower)
{
if (iStatus == 2)
{
SetStatus(1) ; //正常到报警
SetNeedleColor(m_colorTable[2]) ; //进入报警
}
}else if ( iStatus == 1) //从报警进入正常
{
SetStatus(2) ;
SetNeedleColor(m_colorTable[1]) ; //正常
}
}
void CMeter::SetStatus(int istus)
{
iStatus = istus ;
}
int CMeter::GetControlStatus()
{
return iStatus ;
}
CString CMeter::GetCurValue()
{
CString strTmp ;
strTmp.Format(_T("%.1f") , m_dCurrentValue) ;
return strTmp ;
}
CString CMeter::GetStrText()
{
return m_strUnits ;
}
void CMeter::SetDelayTime(float fv)
{
fDelaytime = fv ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -