📄 watchface.cpp
字号:
// WatchFace.cpp: implementation of the WatchFace class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "pointtest.h"
#include "WatchFace.h"
#include "math.h"
#define PI 3.1415926
#define FONTCOLOR RGB( 128,128,0 )
#define JIANTOUANGLE 15
#define JIANTOULONG 10
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
WatchFace::WatchFace()
{
m_Number = 0; //用于计算摆角
m_Width =200;
m_Hight = 100; //表面的宽和高
m_Center = m_Width/2; //表心
m_Angle = 0; //表针的摆角
m_Value = 0; //表值
m_Name = "A"; //表名
m_DianWei = "安培"; //单位
m_BigFlag = FALSE; //表针超过最大线
m_SmallFlag = FALSE; //表针超过最小线
m_BeginAngle = -150; //刻度盘的起始角和终止角
m_EndAngle = -30;
m_Down = -0.5;
m_Up = m_EndAngle+0.5; //电表值的上下线
m_PrevValue = m_Down; //上一次测量值
m_SmallAngle = m_BeginAngle+( m_Down-0.2 )/m_SingleExpress*m_SingleAngle;//表针的最小摆角
m_BigAngle = m_EndAngle+( 0.2 )/m_SingleExpress*m_SingleAngle; //表针的最大摆角
}
//void WatchFace::SetParam( int width,int hight,CString name,double singleangle,double express,CString units,double value )
void WatchFace::SetParam( CPoint point,int width,int hight,CString name,double bigValue,CString units,double value )
{
lefttop = point;
m_SingleExpress = bigValue/12;
m_SingleAngle = 10;
m_Width =width;
m_Hight = hight; //表面的宽和高
m_Center = CPoint( m_Width/2,m_Hight+10 ); //表心
m_Long = hight-7; //表针的长
m_BeginPoint = ArithPoint( m_Center,m_BeginAngle,m_Long );
m_EndPoint = ArithPoint( m_Center,m_EndAngle,m_Long ); //刻度盘的起始点和终止点
m_NamePoint = CPoint( m_Center.x-4,m_Center.y-50 ); //表名在表盘上的位置
m_Name = name;
// m_SingleAngle = singleangle;
// m_SingleExpress = express;
m_DianWei = units;
m_Value = value;
}
WatchFace::~WatchFace()
{
}
CPoint WatchFace::ArithPoint( CPoint point1,double angle,double l )
{
CPoint point;
point.x = int( ( cos( angle*PI/180 )*l )+point1.x );
point.y = int( ( sin( angle*PI/180 )*l )+point1.y );
return point;
}
void WatchFace::SetParam( double value )
{
m_Value = value;
}
void WatchFace::Draw( CDC *pDC,int i )
{
CDC *dc = new CDC;
CBitmap *bitmap = new CBitmap;
CBitmap *old ;
dc->CreateCompatibleDC( pDC );
bitmap->CreateCompatibleBitmap( pDC,m_Width,m_Hight );
old = dc->SelectObject( bitmap );
dc->PatBlt( 0,0,m_Width,m_Hight,WHITENESS );
if ( i == 1 )
{
Draw1( dc ); //机械式万用表
}
else
{
dc->FillSolidRect( 0,0,m_Width,m_Hight,RGB( 117,245,214 ) );
Draw2( dc ); //数字式万用表
}
pDC->BitBlt( lefttop.x,lefttop.y,m_Width,m_Hight,dc,0,0,SRCCOPY );
dc->SelectObject( old );
delete dc;
delete bitmap;
}
void WatchFace::Draw1( CDC *pDC )
{
COLORREF old=pDC->SetTextColor( RGB( 0,0,0 ) ); //显示字体颜色
int oldmode=pDC->SetBkMode( TRANSPARENT ); //设置背景为透明色
CPen pen,*pPen;
pen.CreatePen( PS_SOLID,1,RGB( 128,128,0 ) );
pPen = pDC->SelectObject( &pen );
pDC->SelectStockObject( NULL_BRUSH );
CRect rect2 = CRect( m_Center.x-26,m_Center.y-26,m_Center.x+26,m_Center.y+26 );
CPoint point1,point3;
pDC->Ellipse( rect2 );
pDC->TextOut( m_NamePoint.x,m_NamePoint.y,m_Name );
CRect rect = CRect( m_Center.x-(m_Hight ),m_Center.y-(m_Hight ),m_Center.x+( m_Hight ),m_Center.y+( m_Hight ) );
pDC->Arc( rect,m_EndPoint,m_BeginPoint );
point1 = ArithPoint( m_Center,m_BigAngle,50 );
pDC->Ellipse( point1.x-2,point1.y-2,point1.x+2,point1.y+2 );
point1 = ArithPoint( m_Center,m_SmallAngle,50 );
pDC->Ellipse( point1.x-2,point1.y-2,point1.x+2,point1.y+2 );
DrawKeDu( pDC ); //画刻度盘
DrawBiaoZhen( pDC ); //画表针
pDC->SelectObject( pPen );
DeleteObject( pen );
pDC->SetTextColor( old );
pDC->SetBkMode( oldmode );
}
void WatchFace::Draw2( CDC *pDC )
{
CFont font,*pOldFont;
font.CreateFont( m_Width/10,m_Hight/10,0,0,0,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,FALSE );
pOldFont = pDC->SelectObject( &font );
COLORREF old=pDC->SetTextColor( RGB( 128,128,0 ) ); //显示字体颜色
int oldmode=pDC->SetBkMode( TRANSPARENT ); //设置背景为透明色
if ( m_Name == "v"||m_Name == "V" )
{
pDC->TextOut( m_Width/20,m_Hight/20,"电压" );
}
else
{
if ( m_Name == "a"||m_Name == "A" )
{
pDC->TextOut( m_Width/20,m_Hight/20,"电流" );
}
else
{
if ( m_Name == "r"||m_Name == "R" )
{
pDC->TextOut( m_Width/20,m_Hight/20,"电阻" );
}
}
}
pDC->TextOut( m_Width-3*m_Width/10,m_Hight-2*m_Hight/10,m_DianWei );
pDC->SelectObject( pOldFont );
DeleteObject( font );
pDC->SetTextColor( old );
pDC->SetBkMode( oldmode );
CPoint point;
point= CPoint( m_Width/8,m_Hight/4 );
m_Num.SetParam( m_Value,point,6*m_Width/8,2*m_Hight/4,2,4 );
m_Num.Draw( pDC );
}
void WatchFace::DrawKeDu( CDC *pDC )
{
// CFont font,*pOldFont;
// font.CreateFont( 7,5,-i,0,0,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
// DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,FALSE );
// pOldFont = pDC->SelectObject( &font );
CFont* pOldFont = pDC->SelectObject( CFont::FromHandle( (HFONT)GetStockObject(DEFAULT_GUI_FONT) ) );
COLORREF old=pDC->SetTextColor( FONTCOLOR ); //显示字体颜色
int oldmode=pDC->SetBkMode( TRANSPARENT ); //设置背景为透明色
CPen pen,*pPen;
pen.CreatePen( PS_SOLID,1,RGB( 128,128,0 ) );
pPen = pDC->SelectObject( &pen );
CPoint point1,point2;
int j = 0;
for ( int i = int( m_BeginAngle );i<=int( m_EndAngle );i += int( m_SingleAngle ) )
{
point1 = ArithPoint( m_Center,double(i),m_Hight );
if ( ( i-int( m_BeginAngle) )%30 == 0 )
{
point2 = ArithPoint( m_Center,double( i ),m_Hight-10 );
char str[20];
sprintf( str,"%.1f",float( j*m_SingleExpress ) );
pDC->TextOut( point2.x-10,point2.y,str );
}
else
{
point2 = ArithPoint( m_Center,double( i ),m_Hight-5 );
}
j++;
pDC->MoveTo( point1 );
pDC->LineTo( point2 );
}
m_Up = ( --j )*m_SingleExpress;
pDC->TextOut( m_Width-30,m_Hight-20,m_DianWei );
pDC->SelectObject( pPen );
DeleteObject( pen );
pDC->SelectObject( pOldFont );
// DeleteObject( font );
pDC->SetTextColor( old );
pDC->SetBkMode( oldmode );
}
void WatchFace::DrawBiaoZhen( CDC *pDC ) //画表针
{
CPen pen,*pPen;
pen.CreatePen( PS_SOLID,1,RGB( 255,0,0 ) );
pPen = pDC->SelectObject( &pen );
double angle;
CPoint point1,point2;
angle = m_BeginAngle+m_Value/m_SingleExpress*m_SingleAngle;
if ( angle<m_SmallAngle )
{
angle = m_SmallAngle;
m_SmallFlag = TRUE;
}
else
{
if ( angle>m_BigAngle )
{
angle = m_BigAngle;
m_BigFlag = TRUE;
}
else
{
m_BigFlag = m_SmallFlag = FALSE;
}
}
point1 = ArithPoint( m_Center,angle,m_Long );
point2 = ArithPoint( m_Center,angle,26 );
DrawJianTou( point1,angle,pDC );
pDC->MoveTo( point2 );
pDC->LineTo( point1 );
/* if ( angle<m_BigAngle )
{
if ( m_Value<=m_Up )
{
DrawBaiDong( angle,pDC,m_PrevValue );
}
else
{
point1 = ArithPoint( m_Center,angle,m_Long );
point2 = ArithPoint( m_Center,angle,26 );
DrawJianTou( point1,angle,pDC );
pDC->MoveTo( point2 );
pDC->LineTo( point1 );
}
}
else
{
angle = m_BigAngle;
point1 = ArithPoint( m_Center,angle,m_Long );
point2 = ArithPoint( m_Center,angle,26 );
DrawJianTou( point1,angle,pDC );
pDC->MoveTo( point2 );
pDC->LineTo( point1 );
m_BigFlag = TRUE;
}*/
pDC->SelectObject( pPen );
DeleteObject( pen );
}
void WatchFace::DrawBaiDong( double angle,CDC *pDC,double m_PrevValue )
{
double tempAngle,tempPrevAngle;
CPoint point1,point2;
tempPrevAngle = m_BeginAngle+m_PrevValue/m_SingleExpress*m_SingleAngle;
tempAngle = (angle-m_BeginAngle)/( tempPrevAngle-m_BeginAngle );
while ( abs(int( tempAngle )) )
{
if ( m_Number == 0 )
{
point1 = ArithPoint( m_Center,angle+tempAngle,m_Long );
point2 = ArithPoint( m_Center,angle+tempAngle,26 );
DrawJianTou( point1,angle+tempAngle,pDC );
pDC->MoveTo( point2 );
pDC->LineTo( point1 );
tempAngle = tempAngle+0.1;
m_Number = 1;
}
else
{
point1 = ArithPoint( m_Center,angle-tempAngle,m_Long );
point2 = ArithPoint( m_Center,angle-tempAngle,26 );
DrawJianTou( point1,angle-tempAngle,pDC );
pDC->MoveTo( point2 );
pDC->LineTo( point1 );
tempAngle = tempAngle+0.1;
m_Number = 0;
}
}
m_PrevValue = m_Value;
}
void WatchFace::DrawJianTou( CPoint point,double angle,CDC *pDC ) //画箭头
{
CPoint Point1;
double jiao1;
CPen pen,*pPen ;
pen.CreatePen( PS_SOLID,1,RGB( 255,0,0 ) );
pPen = pDC->SelectObject( &pen );
jiao1 = -angle+JIANTOUANGLE;
jiao1 = jiao1*PI/180;
Point1.x = int( point.x-cos( jiao1 )*JIANTOULONG );
Point1.y = int( point.y+sin( jiao1 )*JIANTOULONG );
pDC->MoveTo( point );
pDC->LineTo( Point1 );
jiao1 = -angle-JIANTOUANGLE;
jiao1 = jiao1*PI/180;
Point1.x = int( point.x-cos( jiao1 )*JIANTOULONG );
Point1.y = int( point.y+sin( jiao1 )*JIANTOULONG );
pDC->MoveTo( point );
pDC->LineTo( Point1 );
pDC->SelectObject( pPen );
DeleteObject( pen );
}
double WatchFace::ToAngle( double value )
{
double tempangle;
tempangle = m_BeginAngle+value/m_SingleExpress*m_SingleAngle;
return tempangle;
}
double WatchFace::ToValue( double angle )
{
double tempValue;
tempValue = ( angle-m_BeginAngle )/m_SingleAngle*m_SingleExpress;
return tempValue;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -