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

📄 thermometer.cpp

📁 485通讯接口模块的编程应用
💻 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 + -