www.gusucode.com > VC++开发的电路板画图设计软件源代码源码程序 > VC++开发的电路板画图设计软件源代码源码程序\code\Rheostat.cpp

    //Download by http://www.NewXing.com
// Rheostat.cpp: implementation of the CRheostat class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Pointtest.h"
#include "Rheostat.h"
#include "math.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CRheostat::CRheostat(int nType,CBaseList* pBaseList) : CBase(ID_RHEOSTAT,pBaseList)
{
	left = CPoint(0,0);
	right = CPoint(0,0);
	Content_Of_Ob = "RH";
	AddString(ID_RHEOSTAT);
	MaxValue = 20;
	Value = 20;
}
CRheostat::CRheostat(CBase* pp1,CBase* pp2,CBaseList* pBaseList) : CBase(ID_RHEOSTAT,pBaseList)
{
	p1 = pp1;
	p2 = pp2;
	AddSon(p1);
	AddSon(p2);
	left = CPoint(0,0);
	right = CPoint(0,0);
	Content_Of_Ob = "RH";
	AddString(ID_RHEOSTAT);
	MaxValue = 20;
	Value = 20;
}
CRheostat::~CRheostat()
{

}
void CRheostat::Draw(CDC* pDC)
{
	if(IsSelected()){
		CPen pen(PS_SOLID, 2,RED);
		CPen *Oldpen = pDC->SelectObject(&pen);
		pDC->SetBkMode(TRANSPARENT);
		pDC->MoveTo(left);
		pDC->LineTo(p1->CenterPoint);
		pDC->MoveTo(right);
		pDC->LineTo(p2->CenterPoint);
		pDC->MoveTo(aa);
		pDC->LineTo(dd);
		pDC->LineTo(bb);
		pDC->LineTo(cc);
		pDC->LineTo(aa);
		//draw arrow
		pDC->MoveTo(slid4);
		pDC->LineTo(slid[0]);
		pDC->Polygon(slid,3);
		pDC->MoveTo(slid5);
		pDC->LineTo(slid4);
		pDC->MoveTo(slid5);
		pDC->LineTo(p1->CenterPoint);

		pDC->SelectObject(Oldpen);
	}else{
		CPen pen(PS_SOLID, 2,BLACK);
		CPen *Oldpen = pDC->SelectObject(&pen);
		pDC->SetBkMode(TRANSPARENT);
		pDC->MoveTo(left);
		pDC->LineTo(p1->CenterPoint);
		pDC->MoveTo(right);
		pDC->LineTo(p2->CenterPoint);
		pDC->MoveTo(aa);
		pDC->LineTo(dd);
		pDC->LineTo(bb);
		pDC->LineTo(cc);
		pDC->LineTo(aa);
		//arrow
		pDC->MoveTo(slid4);
		pDC->LineTo(slid[0]);
		pDC->Polygon(slid,3);
		pDC->MoveTo(slid5);
		pDC->LineTo(slid4);
		pDC->MoveTo(slid5);
		pDC->LineTo(p1->CenterPoint);

		pDC->SelectObject(Oldpen);
	}
	TextOut(pDC);
}
void CRheostat::SetPoint(CPoint pp)
{
	TextPoint = left = right = CenterPoint = pp;
	left = pp - CPoint(20,0);
	right = pp + CPoint(20,0);
	slid4 = slid[0] = left;
	p1->CenterPoint = pp - CPoint(30,0);
	p2->CenterPoint = pp + CPoint(29,0);
	cc = aa = left;
	dd = bb = right;
	aa.Offset(CSize(0,10));
	cc.Offset(CSize(0,-10));
	bb.Offset(CSize(0,-10));
	dd.Offset(CSize(0,10));
	slid4.Offset(CSize(0,25));
	slid[0].Offset(CSize(0,10));
	slid[1] = Conv_coord(Found_Left(slid[0]),FALSE);
	slid[2] = Conv_coord(Found_Right(slid[0]),FALSE);
	slid5.x = p1->CenterPoint.x;
	slid5.y = slid4.y;
	RotateCell(TotalAngle);
}
void CRheostat::OffSet(CSize size)
{
	CenterPoint.Offset(size);
	left.Offset(size);
	right.Offset(size);
	p1->OffSet(size);
	p2->OffSet(size);
	aa.Offset(size);
	bb.Offset(size);
	cc.Offset(size);
	dd.Offset(size);
	OffSetSlid(size);
}
CRect CRheostat::GetGraphRect()
{
	CPoint up_left,down_right;
	up_left = down_right = CenterPoint;
	up_left.Offset(-20,-10);
	down_right.Offset(20,10);
	return CRect(up_left,down_right);	
}
void CRheostat::RotateCell(double angle)
{
	left = Rotate(angle,left);
	right = Rotate(angle,right);
	p1->CenterPoint = Rotate(angle,p1->CenterPoint);
	p2->CenterPoint = Rotate(angle,p2->CenterPoint);
	aa = Rotate(angle,aa);
	bb = Rotate(angle,bb);
	cc = Rotate(angle,cc);
	dd = Rotate(angle,dd);
	slid[0] = Rotate(angle,slid[0]);
	slid[1] = Rotate(angle,slid[1]);
	slid[2] = Rotate(angle,slid[2]);
	slid4 = Rotate(angle,slid4);
	slid5 = Rotate(angle,slid5);
}
//找三角形左边点
CPoint CRheostat::Found_Left(CPoint pp)
{
	double a;
	pp = Conv_coord(pp,TRUE);
	a = atan2(pp.y,pp.x);
	pp.x-=int(10*cos(a-PI/9));
	pp.y-=int(10*sin(a-PI/9));
	return pp;
}
//找三角形右边点
CPoint CRheostat::Found_Right(CPoint pp)
{
	double a;
	pp = Conv_coord(pp,TRUE);
	a = atan2(pp.y,pp.x);
	pp.x-=int(10*cos(a+PI/9));
	pp.y-=int(10*sin(a+PI/9));
	return pp;
}
//画箭头
CPoint CRheostat::Conv_coord(CPoint p,BOOL Real_or_Visual)
{
	CPoint q;
	if(Real_or_Visual){
		q.x = p.x - slid4.x;
		q.y = slid4.y - p.y;
	}else{
		q.x = p.x + slid4.x;
		q.y = slid4.y- p.y;
	}
	return q;
}
BOOL CRheostat::Pt_In_Arrow(CPoint pp)//判断点是否在箭头内
{
	BOOL result = FALSE;
	CRgn crgn;
	crgn.CreatePolygonRgn(slid,3,ALTERNATE);//建立多边形区域
	result = crgn.PtInRegion(pp);
	crgn.DeleteObject();
	return result;
}
void CRheostat::SetEValue()
{
	int angle = round(TotalAngle*180/PI);
	int a = angle%180;
	if(!a){
		GetValue(TRUE);
	}else{
		GetValue(FALSE);
	}
}
void CRheostat::MovePoint(CPoint pp,CSize size)//移动箭头
{
	int angle = round(TotalAngle*180/PI);
	int a = angle%180;
	if(!a){
		if(CheckInRegn(pp,TRUE)){
			OffSetX(size);
		}
		GetValue(TRUE);
	}else{
		if(CheckInRegn(pp,FALSE)){
			OffSetY(size);
		}
		GetValue(FALSE);
	}
}
void CRheostat::OffSetSlid(CSize size)//move slide bar
{
	slid[0].Offset(size);
	slid[1].Offset(size);
	slid[2].Offset(size);
	slid4.Offset(size);
	slid5.Offset(size);
}
void CRheostat::OffSetX(CSize size)//沿X移动箭头
{
	int m_left,m_right;
	if(left.x<right.x){
		m_left = left.x;
		m_right = right.x;
	}else{
		m_left = right.x;
		m_right = left.x;
	}
	slid[0].Offset(CSize(size.cx,0));
	slid[1].Offset(CSize(size.cx,0));
	slid[2].Offset(CSize(size.cx,0));
	slid4.Offset(CSize(size.cx,0));
	if(slid[0].x < m_left){
		CSize offsize((m_left - slid[0].x),0);
		slid[0].Offset(offsize);
		slid[1].Offset(offsize);
		slid[2].Offset(offsize);
		slid4.Offset(offsize);
	}
	if(slid[0].x > m_right){
		CSize offsize(-(slid[0].x - m_right),0);
		slid[0].Offset(offsize);
		slid[1].Offset(offsize);
		slid[2].Offset(offsize);
		slid4.Offset(offsize);
	}
}
void CRheostat::OffSetY(CSize size)//沿Y移动箭头
{
	int m_up,m_down;
	if(right.y>left.y){
		m_up = left.y;
		m_down = right.y;
	}else{
		m_up = right.y;
		m_down = left.y;
	}
	slid[0].Offset(CSize(0,size.cy));
	slid[1].Offset(CSize(0,size.cy));
	slid[2].Offset(CSize(0,size.cy));
	slid4.Offset(CSize(0,size.cy));
	if(slid[0].y < m_up){
		CSize offsize(0,(m_up - slid[0].y));
		slid[0].Offset(offsize);
		slid[1].Offset(offsize);
		slid[2].Offset(offsize);
		slid4.Offset(offsize);
	}
	if(slid[0].y > m_down){
		CSize offsize(0,-(slid[0].y - m_down));
		slid[0].Offset(offsize);
		slid[1].Offset(offsize);
		slid[2].Offset(offsize);
		slid4.Offset(offsize);
	}
}
BOOL CRheostat::CheckInRegn(CPoint pp,BOOL x_or_y)//判断鼠标点是否在区域内
{
	BOOL result = FALSE;
	int m_left,m_right;
	int m_up,m_down;
	if(left.x<right.x){
		m_left = left.x;
		m_right = right.x;
	}else{
		m_left = right.x;
		m_right = left.x;
	}
	if(right.y>left.y){
		m_up = left.y;
		m_down = right.y;
	}else{
		m_up = right.y;
		m_down = left.y;
	}
	if(x_or_y){
		if(m_left<=pp.x&&pp.x<=m_right){
			result = TRUE;
		}else if(m_left>pp.x||pp.x>m_right){
			result = FALSE;
		}
	}else{
		if(m_up<=pp.y&&pp.y<=m_down){
			result = TRUE;
		}else if(m_up>pp.y||pp.y>m_down){
			result = FALSE;
		}
	}
	return result;
}
void CRheostat::GetValue(BOOL x_or_y)//取得当前电阻值
{
	int aa;
	if(x_or_y){
		aa = right.x-slid[0].x;
		Value = (float)fabs(MaxValue*(float)aa/40);
	}else{
		aa = right.y-slid[0].y;
		Value = (float)fabs(MaxValue*(float)aa/40);
	}
}