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

📄 printcoordinate.cpp

📁 这是一整套USB2.0试验程序
💻 CPP
字号:
// PrintCoordinate.cpp: implementation of the CPrintCoordinate class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "PrintCoordinate.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

CPrintCoordinate::CPrintCoordinate()
{
	m_nXmin=0;
	m_nXmax=1000;
	m_nYmin=0;
	m_nYmax=5000;
	IsPrinting=FALSE;
}

CPrintCoordinate::~CPrintCoordinate()
{

}

void CPrintCoordinate::InitRect(CDC *pDC,LPRECT lpRect)
{
//	m_rectDraw.left=0;
//	m_rectDraw.right=lpRect->right-lpRect->left;
//	m_rectDraw.top=0;
//	m_rectDraw.bottom=lpRect->bottom-lpRect->top;
	m_rectDraw=*lpRect;

	m_pDC=pDC;
	IsPrinting=pDC->IsPrinting();

	//Origin Point
	m_pointOrigin.x=m_rectDraw.left+(m_rectDraw.right-m_rectDraw.left)/20;
	m_pointOrigin.y=m_rectDraw.Height()/12;


	m_pDC->FillSolidRect(m_rectDraw,RGB(255,255,255));
}

void CPrintCoordinate::Release()
{
}

int CPrintCoordinate::BitBlt(LPRECT lpRect)
{
	return(m_pDC->BitBlt(lpRect->left,lpRect->top,
		lpRect->right-lpRect->left,lpRect->bottom-lpRect->top,
		m_pDC,0,0,SRCCOPY));
}

void CPrintCoordinate::SetXYRange(int xmin, int xmax, int ymin, int ymax)
{
	m_nXmin=xmin;m_nXmax=xmax;
	m_nYmin=ymin;m_nYmax=ymax;
}
//物理坐标点到画布坐标的转换
CPoint CPrintCoordinate::PointConv(CPoint point)
{
	CPoint pt;
	pt.x=((point.x-m_nXmin)/(m_nXmax-m_nXmin))*
		(m_rectDraw.Width()*4/5)+m_pointOrigin.x;
	pt.y=((point.y-m_nYmin)/(m_nYmax-m_nYmin))*
		(m_rectDraw.Height()*4/5)+m_pointOrigin.y;
	return pt;
}

//物理坐标点到画布坐标的转换
void CPrintCoordinate::Point_Conv(CPoint *point)
{
	int width=m_rectDraw.right-m_rectDraw.left;
	int height=m_rectDraw.top-m_rectDraw.bottom;

	if(point->x<m_nXmin)
		point->x=m_nXmin;
	else if(point->x>m_nXmax)
		point->x=m_nXmax;
	float x=(float)(point->x-m_nXmin)/(m_nXmax-m_nXmin);
	x=x*width;
	point->x=(int)x+m_rectDraw.left;

	if(point->y<m_nYmin)
		point->y=m_nYmin;
	else if(point->y>m_nYmax)
		point->y=m_nYmax;
	float y=(float)(point->y-m_nYmin)/(m_nYmax-m_nYmin);
	y=y*height;
	point->y=(int)y+m_rectDraw.bottom;
}


void CPrintCoordinate::DrawXAxis(COLORREF color)
{
	CPen pen(PS_SOLID,1,color);
	CPen *pOldPen=m_pDC->SelectObject(&pen);

	CPoint pt1,pt2;
	pt1.x=m_nXmin;
	pt1.y=m_nYmin;
	pt2.x=m_nXmax;
	pt2.y=m_nYmin;
	//Draw the line
	MoveTo(pt1);
	LineTo(pt2);
	//Restore the GDI resource
	m_pDC->SelectObject(pOldPen);
}

void CPrintCoordinate::MoveTo(CPoint pt)
{
	CPoint point=pt;
	Point_Conv(&point);
	m_pDC->MoveTo(point);
}

void CPrintCoordinate::LineTo(CPoint pt)
{
	CPoint point=pt;
	Point_Conv(&point);
	m_pDC->LineTo(point);
}

void CPrintCoordinate::TextOut(int x, int y, CString str)
{
	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	m_pDC->TextOut(point.x,point.y,str);
}

void CPrintCoordinate::DrawYAxis(COLORREF color)
{
	CPen pen(PS_SOLID,1,color);
	CPen *pOldPen=m_pDC->SelectObject(&pen);
	CPoint pt1,pt2;
	pt1.x=m_nXmin;
	pt1.y=m_nYmin;
	pt2.x=m_nXmin;
	pt2.y=m_nYmax;
	//Draw the line
	MoveTo(pt1);
	LineTo(pt2);
	//Restore the GDI resource
	m_pDC->SelectObject(pOldPen);
}

void CPrintCoordinate::DrawXGrid(int n,COLORREF color)
{
	if(n<1) n=1;
	else if(n>20) n=20;

	m_colorGrid=color;
	CPen *pPen=new CPen(PS_DOT,1,color);
	CPen *pOldPen=m_pDC->SelectObject(pPen);
	int width=m_nXmax-m_nXmin;
	CPoint pt;
	m_pDC->SelectObject(pPen);
	int x;
	for(int i=0;i<=n;i++)
	{
		x=width*i/n+m_nXmin;
		pt.x=x;
		pt.y=m_nYmin;
		MoveTo(pt);
		pt.y=m_nYmax;
		LineTo(pt);
	}
	m_pDC->SelectObject(pOldPen);
	delete pPen;
}

void CPrintCoordinate::DrawYGrid(int n,COLORREF color)
{
	if(n<1) n=1;
	else if(n>20) n=20;

	m_colorGrid=color;
	CPen *pPen=new CPen(PS_DOT,1,color);
	CPen *pOldPen=m_pDC->SelectObject(pPen);
	int width=m_nYmax-m_nYmin;
	CPoint pt;
	int y;
	for(int i=0;i<=n;i++)
	{
		y=width*i/n+m_nYmin;
		pt.x=m_nXmin;
		pt.y=y;
		MoveTo(pt);
		pt.x=m_nXmax;
		LineTo(pt);
	}
	m_pDC->SelectObject(pOldPen);
	delete pPen;

}

void CPrintCoordinate::TextOutXCenterBottom(int x, int y, CString str)
{
	CFont font;
	//字体大小16磅
	font.CreateFont(16*20,0,0,
		0,400,FALSE,FALSE,0,
		ANSI_CHARSET,OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH | FF_SWISS,"Arial");
	CFont *pOldFont=m_pDC->SelectObject(&font);
	m_pDC->SetTextColor(m_colorGrid);

	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	CSize size=m_pDC->GetTextExtent(str);
	if(x==m_nXmin)	//the left of bottom
		point.x=point.x;
	else if(x==m_nXmax)
		point.x=point.x-size.cx;
	else 
		point.x=point.x-size.cx/2;
	point.y=point.y-size.cy/4;
	m_pDC->TextOut(point.x,point.y,str);
	m_pDC->SelectObject(pOldFont);
}

void CPrintCoordinate::TextOutYCenterLeft(int x, int y, CString str)
{
	CFont font;
	//字体大小16磅
	font.CreateFont(16*20,0,2700,
		0,400,FALSE,FALSE,0,
		ANSI_CHARSET,OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH | FF_SWISS,"Arial");
	CFont *pOldFont=m_pDC->SelectObject(&font);
	m_pDC->SetTextColor(m_colorGrid);

	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	CSize size=m_pDC->GetTextExtent(str);
	if(y==m_nYmin)
		point.y=point.y;
	else if(y==m_nYmax)
		point.y=point.y-size.cx;
	else
		point.y=point.y-size.cx/2;
	point.x-=size.cy;
	m_pDC->TextOut(point.x,point.y,str);
	m_pDC->SelectObject(pOldFont);
}
void CPrintCoordinate::TextOutXCenterTop(int x, int y, CString str)
{
	CFont font;
	//字体大小16磅
	font.CreateFont(16*20,0,0,
		0,400,FALSE,FALSE,0,
		ANSI_CHARSET,OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH | FF_SWISS,"Arial");
	CFont *pOldFont=m_pDC->SelectObject(&font);
	m_pDC->SetTextColor(m_colorGrid);

	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	CSize size=m_pDC->GetTextExtent(str);
	if(x==m_nXmin)	//the left of bottom
		point.x=point.x;
	else if(x==m_nXmax)
		point.x=point.x-size.cx;
	else 
		point.x=point.x-size.cx/2;
	point.y=point.y+size.cy;
	m_pDC->TextOut(point.x,point.y,str);
	m_pDC->SelectObject(pOldFont);
}

void CPrintCoordinate::TextOutYCenterRight(int x, int y, CString str)
{
	CFont font;
	//字体大小16磅
	font.CreateFont(16*20,0,900,
		0,400,FALSE,FALSE,0,
		ANSI_CHARSET,OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH | FF_SWISS,"Arial");
	CFont *pOldFont=m_pDC->SelectObject(&font);
	m_pDC->SetTextColor(m_colorGrid);

	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	CSize size=m_pDC->GetTextExtent(str);
	if(y==m_nYmin)
		point.y=point.y+size.cx;
	else if(y==m_nYmax)
		point.y=point.y;
	else
		point.y=point.y+size.cx/2;
	point.x=point.x+size.cy;
	m_pDC->TextOut(point.x,point.y,str);
	m_pDC->SelectObject(pOldFont);
}

void CPrintCoordinate::DrawBack(COLORREF color)
{
	m_colorBack=color;
	m_pDC->FillSolidRect(m_rectDraw,m_colorBack);
}

void CPrintCoordinate::TextOutYCenter(int x, int y, CString str)
{
	CFont font;
	//字体大小16磅
	font.CreateFont(16*20,0,2700,
		0,400,FALSE,FALSE,0,
		ANSI_CHARSET,OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH | FF_SWISS,"Arial");
	CFont *pOldFont=m_pDC->SelectObject(&font);
	m_pDC->SetTextColor(m_colorGrid);

	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	CSize size=m_pDC->GetTextExtent(str);
	point.y=point.y-size.cy/2;
	m_pDC->TextOut(point.x,point.y,str);
	m_pDC->SelectObject(pOldFont);
}

void CPrintCoordinate::TextOutXCenter(int x, int y, CString str)
{
	CFont font;
	//字体大小16磅
	font.CreateFont(16*20,0,0,
		0,400,FALSE,FALSE,0,
		ANSI_CHARSET,OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH | FF_SWISS,"Arial");
	CFont *pOldFont=m_pDC->SelectObject(&font);
	m_pDC->SetTextColor(m_colorGrid);

	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	CSize size=m_pDC->GetTextExtent(str);
	point.x=point.x-size.cx/2;
	m_pDC->TextOut(point.x,point.y,str);
	m_pDC->SelectObject(pOldFont);
}

void CPrintCoordinate::DrawPoly(unsigned short *data, int len, COLORREF color,int offset, int pos)
{
	CPoint point;
//	if(pos>=len)
//		return;
	CPen pen(PS_SOLID,0,color);
	CPen *pOldPen=m_pDC->SelectObject(&pen);
	point.x=pos;
	point.y=offset;
	MoveTo(point);
	point.y=*(data)+offset;
	LineTo(point);
	for(int i=0;i<len;i++)
	{
//		if((i+pos)>=len)
//			break;
		point.x=i+pos;
		point.y=*(data+i)+offset;
		LineTo(point);
	}
	m_pDC->SelectObject(pOldPen);
}
//显示Y方向的左坐标参考系
void CPrintCoordinate::DrawYRefLeft(float fmin, float fmax, int ndiv)
{
	CString str;
	str.Format("%.1f",fmin);
	TextOutYCenterLeft(m_nXmin,m_nYmin,str);
	str.Format("%.1f",fmax);
	TextOutYCenterLeft(m_nXmin,m_nYmax,str);
	ndiv=ndiv>4?4:ndiv;
	for(int i=1;i<ndiv;i++)
	{
		float f=(fmax-fmin)*i/ndiv+fmin;
		int y=m_nYmin+(m_nYmax-m_nYmin)*i/ndiv;
		str.Format("%.1f",f);
		TextOutYCenterLeft(m_nXmin,y,str);
	}
}
//显示X方向的下坐标参考系
void CPrintCoordinate::DrawXRefBottom(float fmin, float fmax, int ndiv)
{
	CString str;
	str.Format("%.1f",fmin);
	TextOutXCenterBottom(m_nXmin,m_nYmin,str);
	str.Format("%.1f",fmax);
	TextOutXCenterBottom(m_nXmax,m_nYmin,str);
	ndiv=ndiv>4?4:ndiv;
	for(int i=1;i<ndiv;i++)
	{
		float f=(fmax-fmin)*i/ndiv+fmin;
		int x=m_nXmin+(m_nXmax-m_nXmin)*i/ndiv;
		str.Format("%.1f",f);
		TextOutXCenterBottom(x,m_nYmin,str);
	}
}
//显示Y方向的右坐标参考系
void CPrintCoordinate::DrawYRefRight(float fmin, float fmax, int ndiv)
{
	CString str;
	str.Format("%.1f",fmin);
	TextOutYCenterRight(m_nXmax,m_nYmin,str);
	str.Format("%.1f",fmax);
	TextOutYCenterRight(m_nXmax,m_nYmax,str);
	ndiv=ndiv>4?4:ndiv;
	for(int i=1;i<ndiv;i++)
	{
		float f=(fmax-fmin)*i/ndiv+fmin;
		int y=m_nYmin+(m_nYmax-m_nYmin)*i/ndiv;
		str.Format("%.1f",f);
		TextOutYCenterRight(m_nXmax,y,str);
	}
}
//显示X方向的上坐标参考系
void CPrintCoordinate::DrawXRefTop(float fmin, float fmax, int ndiv)
{
	CString str;
	str.Format("%.1f",fmin);
	TextOutXCenterTop(m_nXmin,m_nYmax,str);
	str.Format("%.1f",fmax);
	TextOutXCenterTop(m_nXmax,m_nYmax,str);
	ndiv=ndiv>4?4:ndiv;
	for(int i=1;i<ndiv;i++)
	{
		float f=(fmax-fmin)*i/ndiv+fmin;
		int x=m_nXmin+(m_nXmax-m_nXmin)*i/ndiv;
		str.Format("%.1f",f);
		TextOutXCenterTop(x,m_nYmax,str);
	}
}

void CPrintCoordinate::SetXRange(int nXmin, int nXmax)
{
	m_nXmin=nXmin;
	m_nXmax=nXmax;
}

void CPrintCoordinate::SetYRange(int nYmin, int nYmax)
{
	m_nYmin=nYmin;
	m_nYmax=nYmax;
}

void CPrintCoordinate::LineTo(int x, int y, COLORREF color)
{
	CPen pen(PS_SOLID,0,color);
	CPen *pOldPen=m_pDC->SelectObject(&pen);

	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	m_pDC->LineTo(point);

	m_pDC->SelectObject(pOldPen);
}

void CPrintCoordinate::LineTo(CPoint pt, COLORREF color)
{
	LineTo(pt.x,pt.y,color);
}

⌨️ 快捷键说明

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