⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dxf_graph.cpp

📁 演示vc与专业控制器的连接
💻 CPP
字号:
#include "StdAfx.h"
#include "DXF_Graph.h"

int DXF_Graph::Init()/*初始化矢量图平量*/
{
	m_RemoveY=0;
	m_RemoveX=0;
	
	return 0;
}

int DXF_Graph::SetDCObject(CDC *OUT_pDC)
{
    IN_pDC=OUT_pDC;/*传递CDC指针到模块内部*/
	return 0;
}

int DXF_Graph::SetWindowRange(CRect OUT_Rect)
{
	IN_Rect=OUT_Rect;   //传递图形显示区域到模块内部
	m_consultx=(float)(IN_Rect.left+20);  
	m_consulty=(float)(IN_Rect.bottom-20);
    
	return 0;
}

double DXF_Graph::GetGTrackRange(double MinX,double MaxX,double MinY,double MaxY)
{
	//根据显示区域的大小取得适当的图形显示比例,并将该比例保存用于图形还原
	double f1,f2;
	f1=(IN_Rect.Width()-30)/(MaxX-MinX);
	f2=(IN_Rect.Height()-30)/(MaxY-MinY);
	if(f1<f2)
		m_GScale=f1;
	else m_GScale=f2;
	m_OldScale=m_GScale;
	m_xMove=m_consultx-MinX*m_GScale;
	m_yMove=m_consulty-MinY*m_GScale;

	return m_GScale;
}

int DXF_Graph::SetGTrackRange(double MinX,double MinY,double Scale)
{
	//设置图形显示比例,并将该比例保存用于图形还原
	m_GScale=Scale;
	m_OldScale=Scale;
	m_xMove=m_consultx-MinX*m_GScale;
	m_yMove=m_consulty-MinY*m_GScale;
    
	return 0;
}

int DXF_Graph::SetGrid(int GridX, int GridY)
{
	Gx=GridX;
	Gy=GridY;
	int i,j;
	CPen Pen_Grid(PS_DOT,1,RGB(0,150,0));
	pOldPen=IN_pDC->SelectObject(&Pen_Grid);
    for(i=1;IN_Rect.top+GridY*i<IN_Rect.bottom;i++)
	{
		IN_pDC->MoveTo(IN_Rect.left,IN_Rect.top+GridY*i);
	    IN_pDC->LineTo(IN_Rect.right,IN_Rect.top+GridY*i);
	}
	for(j=1;IN_Rect.left+GridX*j<IN_Rect.right;j++)
	{
		IN_pDC->MoveTo(IN_Rect.left+GridX*j,IN_Rect.top);
		IN_pDC->LineTo(IN_Rect.left+GridX*j,IN_Rect.bottom);
	}
	IN_pDC->SelectObject(pOldPen);
	return 0;
}

int DXF_Graph::SetAxisText(CString strX,CString strY)
{
	IN_pDC->SetTextColor(RGB(255,255,255));
	IN_pDC->TextOut(IN_Rect.left+65,IN_Rect.bottom-32,strX);
	IN_pDC->TextOut(IN_Rect.left+20,IN_Rect.bottom-72,strY);
	return 0;
}

int DXF_Graph::SetAxisColor(COLORREF Color)
{	
	Axis_Color=Color;
	CPen Pen_Axis(PS_SOLID,1,Color);
	pOldPen=IN_pDC->SelectObject(&Pen_Axis);
    
	//画轴线
	IN_pDC->MoveTo(IN_Rect.left+15, IN_Rect.bottom);
	IN_pDC->LineTo(IN_Rect.left+15, IN_Rect.top);
    IN_pDC->MoveTo(IN_Rect.left,IN_Rect.bottom-15);
	IN_pDC->LineTo(IN_Rect.right,IN_Rect.bottom-15);

	//画箭头
	CPen ArrowPen(PS_SOLID,1,RGB(255,255,0));
	IN_pDC->SelectObject(&ArrowPen);
	IN_pDC->MoveTo(IN_Rect.left+15,IN_Rect.bottom-15);
	IN_pDC->LineTo(IN_Rect.left+15,IN_Rect.bottom-55);
	IN_pDC->LineTo(IN_Rect.left,IN_Rect.bottom-55);
	IN_pDC->LineTo(IN_Rect.left+25,IN_Rect.bottom-89);
	IN_pDC->LineTo(IN_Rect.left+50,IN_Rect.bottom-55);
	IN_pDC->LineTo(IN_Rect.left+35,IN_Rect.bottom-55);
	IN_pDC->LineTo(IN_Rect.left+35,IN_Rect.bottom-15);

	IN_pDC->MoveTo(IN_Rect.left+15,IN_Rect.bottom-15);
	IN_pDC->LineTo(IN_Rect.left+55,IN_Rect.bottom-15);
	IN_pDC->LineTo(IN_Rect.left+55,IN_Rect.bottom);
	IN_pDC->LineTo(IN_Rect.left+89,IN_Rect.bottom-25);
	IN_pDC->LineTo(IN_Rect.left+55,IN_Rect.bottom-50);
	IN_pDC->LineTo(IN_Rect.left+55,IN_Rect.bottom-35);
	IN_pDC->LineTo(IN_Rect.left+15,IN_Rect.bottom-35);

	IN_pDC->TextOut(IN_Rect.left+20,IN_Rect.bottom-32,"0");

	
	IN_pDC->SelectObject(pOldPen);
	return 0;
}

CPoint DXF_Graph::GetCoordinateOrigin()
{
	/*取得x,y两轴线的交点,用于时间速度显示模块计算画图起点*/
	Point.x=IN_Rect.left+15;
	Point.y=IN_Rect.bottom-15;
	m_TVLastX_1=Point.x;
	m_TVLastY_1=Point.y;
	m_TVLastX_2=Point.x;
	m_TVLastY_2=Point.y;
	m_TVLastX_3=Point.x;
	m_TVLastY_3=Point.y;
	return Point;
}

int DXF_Graph::SetBackColor(COLORREF Color)
{
	Back_Color=Color;
	IN_pDC->FillSolidRect(IN_Rect,Back_Color);
	return 0;
}

float DXF_Graph::ChangeCoordinate(float X,int y)
{
	float Changedx;
    if(y==0)//对X坐标作坐标转换
	{
		Changedx=(float)((X+m_RemoveX)*m_GScale+m_xMove);
		return Changedx;
	}
	if(y==1)//对Y坐标作坐标转换
	{
		Changedx=(float)(2*m_consulty-(X+m_RemoveY)*m_GScale-m_yMove);
		return Changedx;
	}
	else return 99999;
}

int DXF_Graph::MoveToPoint(float XPos, float YPos)
{
	CPen Pen_MtoP(PS_SOLID,1,RGB(255,255,255));
	pOldPen=IN_pDC->SelectObject(&Pen_MtoP);
 	IN_pDC->MoveTo((int)((XPos+m_RemoveX)*m_GScale+m_xMove),(int)(2*m_consulty-(YPos+m_RemoveY)*m_GScale-m_yMove));
    IN_pDC->SelectObject(pOldPen);
    m_xpos=(float)((XPos+m_RemoveX)*m_GScale+m_xMove);/*保存该点信息,用于与下一点比较,进行截图处理*/
	m_ypos=(float)(2*m_consulty-(YPos+m_RemoveY)*m_GScale-m_yMove);
	return 0;
}

int DXF_Graph::LineToPoint(float XPos, float YPos,COLORREF Color)/*直接画线,不考虑越界。该函数主要用于时时采样电机位置画图*/
{
	CPen Pen_LtoP(PS_SOLID,1,Color);
	pOldPen=IN_pDC->SelectObject(&Pen_LtoP);
	IN_pDC->LineTo((int)((XPos+m_RemoveX)*m_GScale+m_xMove),(int)(2*m_consulty-(YPos+m_RemoveY)*m_GScale-m_yMove));
	IN_pDC->SelectObject(pOldPen);
	return 0;
}

int DXF_Graph::LineToPoint(float XPos, float YPos,COLORREF Color,DWORD CurType)//画线,考虑越界。
{
	float itemX,itemY,x,y;
	CPen Pen_LtoP(PS_SOLID,1,Color);
	pOldPen=IN_pDC->SelectObject(&Pen_LtoP);
	x=ChangeCoordinate(XPos,0);
	y=ChangeCoordinate(YPos,1);
	if((x>=(float)IN_Rect.left && x<=(float)IN_Rect.right) && //当前点在显示区域内部
		(y<=(float)IN_Rect.bottom && y>=(float)IN_Rect.top))
	{
		if(CurType==0x00030001)//当前点为直线,分为2种情况:1:上一点在显示区域外部,2:上一点在显示区域内部
		{
			/*上一点在显示区域外部*/
			if(((float)IN_Rect.top>=m_ypos && (float)IN_Rect.top<=y) &&
				(m_xpos>=((float)IN_Rect.left-(x-(float)IN_Rect.left)*((float)IN_Rect.top-m_ypos)/(y-(float)IN_Rect.top)) &&
				m_xpos<=((float)IN_Rect.right-(x-(float)IN_Rect.right)*((float)IN_Rect.top-m_ypos)/(y-(float)IN_Rect.top))))
			{
				itemX=(float)IN_Rect.top*(m_xpos-x)/(m_ypos-y)+(x*m_ypos-y*m_xpos)/(m_ypos-y);
				itemY=(float)IN_Rect.top;
				IN_pDC->MoveTo((int)itemX,(int)itemY);
				IN_pDC->LineTo((int)x,(int)y);
				m_xpos=x;
				m_ypos=y;
			}
			/*上一点在显示区域外部*/
			if(((float)IN_Rect.bottom>=y && (float)IN_Rect.bottom<=m_ypos) &&
				(m_xpos>=((float)IN_Rect.left-(x-(float)IN_Rect.left)*((float)IN_Rect.bottom-m_ypos)/(y-(float)IN_Rect.bottom)) &&
				m_xpos<=((float)IN_Rect.right-(x-(float)IN_Rect.right)*((float)IN_Rect.bottom-m_ypos)/(y-(float)IN_Rect.bottom))))
			{
				itemX=(float)IN_Rect.bottom*(m_xpos-x)/(m_ypos-y)+(x*m_ypos-y*m_xpos)/(m_ypos-y);
				itemY=(float)IN_Rect.bottom;
				IN_pDC->MoveTo((int)itemX,(int)itemY);
				IN_pDC->LineTo((int)x,(int)y);
				m_xpos=x;
				m_ypos=y;
			}
			/*上一点在显示区域外部*/
			if(((float)IN_Rect.right>=x && (float)IN_Rect.right<=m_xpos) &&
				(m_ypos>=((float)IN_Rect.top-(y-(float)IN_Rect.top)*((float)IN_Rect.right-m_xpos)/(x-(float)IN_Rect.right)) &&
				m_ypos<=((float)IN_Rect.bottom-(y-(float)IN_Rect.bottom)*((float)IN_Rect.right-m_xpos)/(x-(float)IN_Rect.right))))
			{
				itemX=(float)IN_Rect.right;
				itemY=(float)IN_Rect.right*(m_ypos-y)/(m_xpos-x)+(y*m_xpos-x*m_ypos)/(m_xpos-x);
				IN_pDC->MoveTo((int)itemX,(int)itemY);
				IN_pDC->LineTo((int)x,(int)y);
				m_xpos=x;
				m_ypos=y;
			}
			/*上一点在显示区域外部*/
			if(((float)IN_Rect.left>=m_xpos && (float)IN_Rect.left<=x) &&
				(m_ypos>=((float)IN_Rect.top-(y-(float)IN_Rect.top)*((float)IN_Rect.left-m_xpos)/(x-(float)IN_Rect.left)) &&
				m_ypos<=((float)IN_Rect.bottom-(y-(float)IN_Rect.bottom)*((float)IN_Rect.left-m_xpos)/(x-(float)IN_Rect.left))))
			{
				itemX=(float)IN_Rect.left;
				itemY=(float)IN_Rect.left*(m_ypos-y)/(m_xpos-x)+(y*m_xpos-x*m_ypos)/(m_xpos-x);
				IN_pDC->MoveTo((int)itemX,(int)itemY);
				IN_pDC->LineTo((int)x,(int)y);
				m_xpos=x;
				m_ypos=y;
			}
			/*上一点在显示区域内部*/
			else
			{
				IN_pDC->LineTo((int)x,(int)y);
				m_xpos=x;
				m_ypos=y;
			}
		}
		else//当前数据单元不是直线单元且当前点在显示区域内部
		{
			IN_pDC->LineTo((int)x,(int)y);
			m_xpos=x;
			m_ypos=y;
		}
	}
	else//当前点在显示区域外部
	{
		if(CurType==0x00030001)
		{
			if((m_xpos>=(float)IN_Rect.left && m_xpos<=(float)IN_Rect.right) && 
		        (m_ypos<=(float)IN_Rect.bottom && m_ypos>=(float)IN_Rect.top))
			{
                if(((float)IN_Rect.left>=x && (float)IN_Rect.left<=m_xpos) &&
					(y>=((float)IN_Rect.top-(m_ypos-(float)IN_Rect.top)*((float)IN_Rect.left-x)/(m_xpos-(float)IN_Rect.left)) &&
					y<=((float)IN_Rect.bottom-(m_ypos-(float)IN_Rect.bottom)*((float)IN_Rect.left-x)/(m_xpos-(float)IN_Rect.left))))
				{
					itemX=(float)IN_Rect.left;
					itemY=(float)IN_Rect.left*(m_ypos-y)/(m_xpos-x)+(y*m_xpos-x*m_ypos)/(m_xpos-x);
					IN_pDC->LineTo((int)itemX,(int)itemY);
					IN_pDC->MoveTo((int)x,(int)y);
					m_xpos=x;
					m_ypos=y;
				}
				if(((float)IN_Rect.right>=m_xpos && (float)IN_Rect.right<=x) &&
					(y>=((float)IN_Rect.top-(m_ypos-(float)IN_Rect.top)*((float)IN_Rect.right-x)/(m_xpos-(float)IN_Rect.right)) &&
					y<=((float)IN_Rect.bottom-(m_ypos-(float)IN_Rect.bottom)*((float)IN_Rect.right-x)/(m_xpos-(float)IN_Rect.right))))
				{
					itemX=(float)IN_Rect.right;
					itemY=(float)IN_Rect.right*(m_ypos-y)/(m_xpos-x)+(y*m_xpos-x*m_ypos)/(m_xpos-x);
					IN_pDC->LineTo((int)itemX,(int)itemY);
					IN_pDC->MoveTo((int)x,(int)y);
					m_xpos=x;
					m_ypos=y;
				}
				if(((float)IN_Rect.top>=y && (float)IN_Rect.top<=m_ypos) &&
					(x>=((float)IN_Rect.left-(m_xpos-(float)IN_Rect.left)*((float)IN_Rect.top-y)/(m_ypos-(float)IN_Rect.top)) &&
					x<=((float)IN_Rect.right-(m_xpos-(float)IN_Rect.right)*((float)IN_Rect.top-y)/(y-(float)IN_Rect.top))))
				{
					itemX=(float)IN_Rect.top*(m_xpos-x)/(m_ypos-y)+(x*m_ypos-y*m_xpos)/(m_ypos-y);
					itemY=(float)IN_Rect.top;
					IN_pDC->LineTo((int)itemX,(int)itemY);
					IN_pDC->MoveTo((int)x,(int)y);
					m_xpos=x;
					m_ypos=y;
				}
				if(((float)IN_Rect.bottom>=m_ypos && (float)IN_Rect.bottom<=y) &&
					(x>=((float)IN_Rect.left-(m_xpos-(float)IN_Rect.left)*((float)IN_Rect.bottom-y)/(m_ypos-(float)IN_Rect.bottom)) &&
					x<=((float)IN_Rect.right-(m_xpos-(float)IN_Rect.right)*((float)IN_Rect.bottom-y)/(m_ypos-(float)IN_Rect.bottom))))
				{
					itemX=(float)IN_Rect.bottom*(m_xpos-x)/(m_ypos-y)+(x*m_ypos-y*m_xpos)/(m_ypos-y);
					itemY=(float)IN_Rect.bottom;
					IN_pDC->LineTo((int)itemX,(int)itemY);
					IN_pDC->MoveTo((int)x,(int)y);
					m_xpos=x;
					m_ypos=y;
				}
			}
			else//先前点不在显示区域内
			{
				/*IN_pDC->MoveTo((int)x,(int)y);
				m_xpos=x;
				m_ypos=y;*/
			}
		}
		else//not line
		{
			IN_pDC->MoveTo((int)x,(int)y);
			m_xpos=x;
			m_ypos=y;
		}
	}
    return 0;
}

int DXF_Graph::ReMove(CString dirIndex)
{
    if(dirIndex=="MG_RIGHT")
	{
		m_RemoveX+=10;
	}
	if(dirIndex=="MG_LEFT")
	{
		m_RemoveX-=10;
	}
	if(dirIndex=="MG_UP")
	{
		m_RemoveY+=10;
	}
	if(dirIndex=="MG_DOWN")
	{
		m_RemoveY-=10;
	}
	return 0;
}

int DXF_Graph::ChangeTOBack()
{
    m_RemoveY=0;
	m_RemoveX=0;
    m_GScale=m_OldScale;
	
	return 0;
}
     
	 

	 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -