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;
}