www.pudn.com > wendu.rar > Temperature.cpp


// Temperature.cpp: implementation of the CTemperature class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "wendu.h" 
#include "Temperature.h" 
#include "MemDC.h" 
#include "math.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CTemperature::CTemperature() 
{ 
	    Scale=8; 
		Subscale=5; 
        ValueBound=140; 
        clrText=RGB(25, 255, 255); 
        clrBar=RGB(0, 0, 255); 
	// 关键代码 
	// 初始化关键代码的 C_S 结构 
	InitializeCriticalSection(&g_csData); 
} 
 
CTemperature::~CTemperature() 
{ 
 
} 
 
void CTemperature::DrawFrame(CDC *pDC) 
{ 
	// 用关键代码同步 
	EnterCriticalSection(&g_csData); 
 
		CPen pen(PS_SOLID,1,RGB(255,0,0)); 
		pDC->SelectObject(&pen); 
	 
	//给各坐标点赋值 
		Point1_X=temprect.left+temprect.Width()*3/7; 
        Point1_Y=temprect.top+temprect.Width()/10; 
        Point2_X=temprect.left+temprect.Width()*4/7; 
        Point2_Y=Point1_Y; 
        RadiusStartPoint_X=Point1_X; 
        RadiusStartPoint_Y=temprect.top+temprect.Height()-temprect.Width()/3; 
        RadiusEndPoint_X=Point2_X; 
        RadiusEndPoint_Y=RadiusStartPoint_Y; 
		R=temprect.Width()/7; 
        RadiusCenterPoint_X=temprect.left+temprect.Width()/2; 
        RadiusCenterPoint_Y=RadiusStartPoint_Y+R*sqrt(3.0)/2; 
        CurveStartPoint_X=Point2_X; 
        CurveStartPoint_Y=RadiusEndPoint_Y-temprect.Width()/14; 
        CurveEndPoint_X=CurveStartPoint_X; 
        CurveEndPoint_Y=temprect.top+temprect.Width()/8; 
        CurveLength=CurveStartPoint_Y-CurveEndPoint_Y; 
 
        TCHAR ScaleValue[MAX_PATH*sizeof(TCHAR)+1]; 
	    ZeroMemory(&ScaleValue, sizeof(ScaleValue)); 
 
		pDC->SetBkMode(TRANSPARENT); 
		pDC->SetTextColor(clrText); 
        //填充图形 
  	    CBrush BarBush; 
	    CBrush *pBarBush; 
	    BarBush.CreateSolidBrush(clrBar);//实体画刷 
	    pBarBush=pDC->SelectObject(&BarBush); 
 
	    pDC->Rectangle(Point1_X,Point1_Y,Point2_X,RadiusStartPoint_Y); 
	    pDC->Ellipse(RadiusCenterPoint_X-R,RadiusCenterPoint_Y-R,RadiusCenterPoint_X+R,RadiusCenterPoint_Y+R); 
 
	 
	    BarBush.DeleteObject(); 
        pDC->SelectObject(pBarBush); 
 
 
 
        //绘制温度计图形		 
		/*pDC->MoveTo(Point1_X,Point1_Y); 
		pDC->LineTo(RadiusStartPoint_X,RadiusStartPoint_Y); 
		pDC->MoveTo(Point2_X,Point2_Y); 
		pDC->LineTo(RadiusEndPoint_X,RadiusEndPoint_Y); 
		pDC->MoveTo(Point1_X,Point1_Y); 
		pDC->LineTo(Point2_X,Point2_Y); 
	    pDC->MoveTo(RadiusStartPoint_X,RadiusStartPoint_Y); 
		pDC->AngleArc(RadiusCenterPoint_X,RadiusCenterPoint_Y,R,120,300);*/ 
 
		for(int i=0; i<=(Scale-1)*Subscale ; i++) 
		{ 
			if(i%Subscale==0) 
			{ 
				pDC->MoveTo(CurveStartPoint_X,CurveStartPoint_Y-i*CurveLength/((Scale-1)*Subscale)); 
				pDC->LineTo(CurveStartPoint_X+temprect.Width()/20,CurveStartPoint_Y-i*CurveLength/((Scale-1)*Subscale)); 
		        //显示刻度值 
	            _stprintf(ScaleValue, _TEXT ("%3.0f"), ValueBound*i/((Scale-1)*Subscale)); 
	            pDC->TextOut(CurveStartPoint_X+temprect.Width()/15,CurveStartPoint_Y-(i+1)*CurveLength/((Scale-1)*Subscale), ScaleValue); 
                 
			} 
			if(i%Subscale!=0) 
			{ 
				pDC->MoveTo(CurveStartPoint_X,CurveStartPoint_Y-i*CurveLength/((Scale-1)*Subscale)); 
				pDC->LineTo(CurveStartPoint_X+temprect.Width()/30,CurveStartPoint_Y-i*CurveLength/((Scale-1)*Subscale)); 
 
			} 
		} 
	// 离开关键代码 
	LeaveCriticalSection(&g_csData); 
} 
 
void CTemperature::DrawBackground(CDC *pDC) 
{ 
        pDC->FillSolidRect(&temprect,RGB(0,0,0)); 
 
} 
 
void CTemperature::OnPaint() 
{ 
//	UpdateData(TRUE); 
        CPaintDC dc(this); 
        //选定画笔 
		CPen pen(PS_SOLID,1,RGB(255,0,0)); 
		dc.SelectObject(&pen); 
        //获得控件区域 
	    GetClientRect(&temprect); 
 
	    // 创建内存 DC 
        CMemDC *pMemDC=new CMemDC(&dc,&temprect); 
 
		CPoint orgBrushOrigin=pMemDC->GetBrushOrg(); 
 
		if(m_dcBackground.GetSafeHdc()==NULL||m_pBitmapBackground.m_hObject==NULL) 
		{ 
          m_dcBackground.CreateCompatibleDC(&dc); 
		  m_pBitmapBackground.CreateCompatibleBitmap(&dc,temprect.Width(),temprect.Height()); 
		  m_pBitmapOldBackground=m_dcBackground.SelectObject(&m_pBitmapBackground); 
          DrawBackground(&m_dcBackground); 
		} 
		  pMemDC->BitBlt(0,0,temprect.Width(),temprect.Height(),&m_dcBackground,0,0,SRCCOPY); 
          DrawFrame(pMemDC); 
 
		pMemDC->SetBrushOrg(orgBrushOrigin.x,orgBrushOrigin.y); 
		delete pMemDC; 
}