📄 thermometer.cpp
字号:
// Thermometer.cpp : implementation file
//
#include "stdafx.h"
#include "DK20DieselizeDynamotor.h"
#include "Thermometer.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CThermometer
CThermometer::CThermometer()
{
m_colorBK =RGB(0,128,128) ;
m_colorRed = RGB(255 , 0 , 0 ) ;
m_colorGreen =RGB(0 , 255, 0 ) ;
m_colorYellow = RGB(255 , 128 ,0) ;
m_strName = "1111";
m_dMin = 0 ;
m_dMax = 100 ;
m_dCurval = 20 ;
VERIFY(m_font.CreateFont(
13, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
"Arial")); // lpszFacename
VERIFY(m_fontLarge.CreateFont(
15, // nHeight
0, // nWidth
0, // nEscapement
0, // nOrientation
FW_NORMAL|FW_BOLD, // nWeight
FALSE, // bItalic
FALSE, // bUnderline
0, // cStrikeOut
ANSI_CHARSET, // nCharSet
OUT_DEFAULT_PRECIS, // nOutPrecision
CLIP_DEFAULT_PRECIS, // nClipPrecision
DEFAULT_QUALITY, // nQuality
DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
"Arial")); // lpszFacename
bRed = 0;
btimer = 0;
}
CThermometer::~CThermometer()
{
m_font.DeleteObject() ;
m_fontLarge.DeleteObject() ;
}
BEGIN_MESSAGE_MAP(CThermometer, CStatic)
//{{AFX_MSG_MAP(CThermometer)
ON_WM_PAINT()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CThermometer message handlers
void CThermometer::OnPaint()
{
CPaintDC memDC(this); // device context for painting
CDC dc ;
CBitmap memBitmap ;
CRect rcClient ;
GetClientRect(&rcClient) ;
memBitmap.CreateCompatibleBitmap(&memDC , rcClient.Width(),rcClient.Height()) ;
dc.CreateCompatibleDC(&memDC) ;
CBitmap *oldBitmap = dc.SelectObject(&memBitmap) ;
dc.FillSolidRect(&rcClient , m_colorBK) ;
dc.SetBkMode(TRANSPARENT) ;
dc.SetTextColor(RGB(0,0,0)) ;
CFont *oldfont =dc.SelectObject(&m_font) ;
//底部圆的矩形 以实际创建控件宽度的 2/5为直径大小
rcCircle.left = rcClient.Width() * 0.6 ;
rcCircle.right = rcCircle.left + rcClient.Width() *0.4 ;
rcCircle.top = rcClient.bottom - rcClient.Width() * 0.4 ;
rcCircle.bottom = rcClient.bottom ;
//管的矩形大小 宽度为底部圆的 80%
rcCylinder.left = rcCircle.left + rcCircle.Width() * 0.5 / 2.0 ;
rcCylinder.right = rcCylinder.left + rcCircle.Width() * 0.5 ;
rcCylinder.top = rcClient.top + 5 ;
rcCylinder.bottom = rcCircle.top+ 10 ;
int iKedu = 0 ;
iKedu = ((rcCylinder.bottom - rcCylinder.top) - (rcCylinder.bottom - rcCylinder.top)%100 ) / 100 ;
//顶部圆口
CRect rcTopcircle ;
rcTopcircle = rcCylinder ;
rcTopcircle.bottom = rcTopcircle.top + 5 ;
rcTopcircle.top -= 5 ;
m_rcDraw =rcCylinder ;
if (m_dCurval>-10)
{
m_rcDraw.top = rcCylinder.Height()-m_dCurval*iKedu - 20 ;
}
else
{
m_rcDraw.top = rcCylinder.Height()+10*iKedu - 20 ;
}
if (m_dCurval<100)
{
m_rcDraw.top = rcCylinder.Height()-m_dCurval*iKedu - 20 ;
}
else
{
m_rcDraw.top = rcCylinder.Height()-110*iKedu - 20 ;
}
//绘制颜色更改部分
CBrush brush ;
COLORREF colorTmp ;
CBrush *oldBrush ;
switch(m_iStatus)
{
case 1:
colorTmp = m_colorRed ;
brush.CreateSolidBrush(colorTmp) ;
oldBrush = dc.SelectObject(&brush) ;
rcTopmovecircle.left = m_rcDraw.left ;
rcTopmovecircle.right = m_rcDraw.right ;
rcTopmovecircle.top = m_rcDraw.top -5 ;
rcTopmovecircle.bottom = m_rcDraw.top +5 ;
dc.FillSolidRect(m_rcDraw,colorTmp) ;
dc.Ellipse(&rcTopmovecircle) ;
if (btimer)
KillTimer(1) ;
btimer = 0 ;
break;
case 2:
colorTmp = m_colorGreen ;
brush.CreateSolidBrush(colorTmp) ;
oldBrush = dc.SelectObject(&brush) ;
rcTopmovecircle.left = m_rcDraw.left ;
rcTopmovecircle.right = m_rcDraw.right ;
rcTopmovecircle.top = m_rcDraw.top -5 ;
rcTopmovecircle.bottom = m_rcDraw.top +5 ;
dc.FillSolidRect(m_rcDraw,colorTmp) ;
dc.Ellipse(&rcTopmovecircle) ;
if (btimer)
KillTimer(1) ;
btimer = 0 ;
break;
default:
if (bRed)
{
colorTmp = m_colorRed ;
brush.CreateSolidBrush(colorTmp) ;
oldBrush = dc.SelectObject(&brush) ;
rcTopmovecircle.left = m_rcDraw.left ;
rcTopmovecircle.right = m_rcDraw.right ;
rcTopmovecircle.top = m_rcDraw.top -5 ;
rcTopmovecircle.bottom = m_rcDraw.top +5 ;
dc.FillSolidRect(m_rcDraw,colorTmp) ;
dc.Ellipse(&rcTopmovecircle) ;
}
else
{
colorTmp = m_colorYellow ;
brush.CreateSolidBrush(colorTmp) ;
oldBrush = dc.SelectObject(&brush) ;
rcTopmovecircle.left = m_rcDraw.left ;
rcTopmovecircle.right = m_rcDraw.right ;
rcTopmovecircle.top = m_rcDraw.top -5 ;
rcTopmovecircle.bottom = m_rcDraw.top +5 ;
dc.FillSolidRect(m_rcDraw,colorTmp) ;
dc.Ellipse(&rcTopmovecircle) ;
}
if (!btimer)
SetTimer(1,500,0) ;
btimer = 1 ;
}
//绘制顶部需要移动部分原型
//绘制标尺 最顶部,大约少了5个像素点用来绘制顶部的圆
CRect rcBC ,rcBCBQ;
rcBC = rcCylinder ;
rcBCBQ = rcCylinder ;
rcBC.left -= rcCylinder.Width() ;
rcBC.bottom -= 40 ;
rcBCBQ.left -= rcCylinder.Width()*2 ;
CString str ;
//dc.Rectangle(&rcBCBQ ) ;
for(int i = 0 ; i <=50 ; i++)//rcBC.Height() ; i >0 ; i-=3 )
{
if (i % 5 == 0 )
{
rcBCBQ = rcBC ;
rcBCBQ.top = rcBC.top +rcBC.Height()-2*i*iKedu;
rcBCBQ.bottom = rcBCBQ.top ;
rcBCBQ.InflateRect(15,5 , 0,5);
str.Format("%d" ,i*2) ;
dc.DrawText(str , &rcBCBQ , DT_LEFT) ;
dc.MoveTo(CPoint(rcBC.left , rcBC.top +rcBC.Height()-2*i*iKedu )) ;
dc.LineTo(CPoint(rcBC.left +10 , rcBC.top +rcBC.Height()-2*i*iKedu) ) ;
}
else
{
dc.MoveTo(CPoint(rcBC.left , rcBC.top+rcBC.Height()-2*i*iKedu)) ;
dc.LineTo(CPoint(rcBC.left +6 , rcBC.top+rcBC.Height()-2*i*iKedu )) ;
}
}
//绘制当前值
strCurval.Format("%.1f度" , m_dCurval) ; //\r\n%s\r\n
dc.SetTextColor(colorTmp) ;
CRect rcDrawtext ;
rcDrawtext.left =5 ;
rcDrawtext.right=rcClient.right ;
rcDrawtext.top = rcCircle.top ;
rcDrawtext.bottom = rcClient.bottom ;
m_rcDrawValue = rcDrawtext ;
CFont *oldfont2 = dc.SelectObject(&m_fontLarge) ;
CRect rcName;
rcName= rcDrawtext;
rcName.top -=35;
rcName.bottom-=35;
dc.DrawText(m_strName , &rcName, DT_VCENTER|DT_SINGLELINE) ;
dc.DrawText(strCurval , &rcDrawtext, DT_BOTTOM) ;
// dc.Ellipse(&rcDrawtext) ;
dc.SelectObject(oldfont2) ;
//绘制图形
dc.MoveTo(CPoint(rcCylinder.right ,rcCylinder.top)) ;
dc.LineTo(CPoint(rcCylinder.right ,rcCylinder.bottom)) ;
dc.MoveTo(CPoint(rcCylinder.left ,rcCylinder.bottom)) ;
dc.LineTo(CPoint(rcCylinder.left ,rcCylinder.top)) ;
dc.Ellipse(&rcCircle) ;
dc.Arc(&rcTopcircle , CPoint(rcTopcircle.CenterPoint().x,rcTopcircle.CenterPoint().y) , CPoint(rcTopcircle.CenterPoint().x,rcTopcircle.CenterPoint().y) ) ;
memDC.BitBlt(0,0,rcClient.Width() , rcClient.Height() , &dc , 0,0,SRCCOPY) ;
//清理资源
memDC.SelectObject(oldBitmap) ;
memBitmap.DeleteObject();
dc.SelectObject(oldBrush) ;
brush.DeleteObject() ;
dc.SelectObject(oldfont) ;
dc.DeleteDC() ;
}
void CThermometer::OnTimer(UINT nIDEvent)
{
bRed = !bRed ;
RefreshCircle() ;
CStatic::OnTimer(nIDEvent);
}
void CThermometer::SetCurValue(float fvalue)
{
m_dCurval = fvalue;
CalStatus();
}
void CThermometer::SetMaxValue(float fvalue)
{
m_dMax = fvalue;
}
void CThermometer::SetMinValue(float fvalue)
{
m_dMin = fvalue;
}
void CThermometer::SetStatus(int iStatus)
{
m_iStatus = iStatus ;
}
void CThermometer::CalStatus()
{
if (m_dCurval > m_dMax || m_dCurval < m_dMin)
{
if (m_iStatus == 2)
{
SetStatus(3) ; //正常到闪烁
RefreshCircle() ; //刷新
}
}else if ((m_dMax >=m_dCurval ) || (m_dCurval >= m_dMin)) //从报警进入正常
{
SetStatus(2) ;
RefreshCircle() ; //刷新
}
}
void CThermometer::RefreshCircle()
{
InvalidateRect(&m_rcDrawValue , FALSE) ;
InvalidateRect(&rcTopmovecircle , FALSE) ;
InvalidateRect(&rcCircle , FALSE) ;
InvalidateRect(&rcCylinder , FALSE) ;
}
void CThermometer::SetName(CString strName)
{
m_strName = strName;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -