www.gusucode.com > VC++开发的电路板画图设计软件源代码源码程序 > VC++开发的电路板画图设计软件源代码源码程序\code\WatchFace.cpp
//Download by http://www.NewXing.com // 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; }