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

📄 coordinate.cpp

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

#include "stdafx.h"
#include "Coordinate.h"

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

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

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

CCoordinate::~CCoordinate()
{

}

void CCoordinate::InitRect(LPRECT lpRect)
{
	CWnd *pWnd=::AfxGetApp()->GetMainWnd();
	CDC *pDC=pWnd->GetDC();
	m_rectDraw.left=0;
	m_rectDraw.right=lpRect->right-lpRect->left;
	m_rectDraw.top=0;
	m_rectDraw.bottom=lpRect->bottom-lpRect->top;

	//Create the Virtual Draw Aera
	bmpMap.CreateCompatibleBitmap(pDC,m_rectDraw.Width(),m_rectDraw.Height());
	memDC.CreateCompatibleDC(pDC);
	memDC.SelectObject(bmpMap);

	//Origin Point
	m_pointOrigin.x=m_rectDraw.Width()/20;
	m_pointOrigin.y=m_rectDraw.Height()/12;

	memDC.FillSolidRect(m_rectDraw,RGB(12,122,122));
}

void CCoordinate::Release()
{
	bmpMap.DeleteObject();
	memDC.DeleteDC();
}

int CCoordinate::BitBlt(CDC *pDC,LPRECT lpRect)
{
	//Display the coordinate in Screen 
	return(pDC->BitBlt(lpRect->left,lpRect->top,
		lpRect->right-lpRect->left,lpRect->bottom-lpRect->top,
		&memDC,0,0,SRCCOPY));
}

void CCoordinate::SetXYRange(int xmin, int xmax, int ymin, int ymax)
{
	m_nXmin=xmin;m_nXmax=xmax;
	m_nYmin=ymin;m_nYmax=ymax;
}
//物理坐标点到画布坐标的转换
CPoint CCoordinate::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 CCoordinate::Point_Conv(CPoint *point)
{
	float x=(float)(point->x-m_nXmin)/(m_nXmax-m_nXmin);
	x=x*(m_rectDraw.Width()*9/10)+m_pointOrigin.x;
	//limit the x range
	if(x>(float)(m_rectDraw.Width()*19/20))
		x=(float)m_rectDraw.Width()*19/20;
	else if(x<(float)m_rectDraw.Width()/20)
		x=(float)m_rectDraw.Width()/20;
	point->x=(int)x;

	float y=(float)(point->y-m_nYmin)/(m_nYmax-m_nYmin);
 	y=y*(m_rectDraw.Height()*5/6)+m_pointOrigin.y;
	y=(float)m_rectDraw.Height()-y;
	//limit the y range
	if(y>(float)m_rectDraw.Height()*11/12)
		y=(float)m_rectDraw.Height()*11/12;
	else if(y<(float)m_rectDraw.Height()/12)
		y=(float)m_rectDraw.Height()/12;
	point->y=(int)y;
}


void CCoordinate::DrawXAxis(COLORREF color)
{
	CPen pen(PS_SOLID,1,color);
	CPen *pOldPen=memDC.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
	memDC.SelectObject(pOldPen);
}

void CCoordinate::MoveTo(CPoint pt)
{
	CPoint point=pt;
	Point_Conv(&point);
	memDC.MoveTo(point);
}

void CCoordinate::LineTo(CPoint pt)
{
	CPoint point=pt;
	Point_Conv(&point);
	memDC.LineTo(point);
}

void CCoordinate::TextOut(int x, int y, CString str)
{
	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	memDC.TextOut(point.x,point.y,str);
}

void CCoordinate::DrawYAxis(COLORREF color)
{
	CPen pen(PS_SOLID,1,color);
	CPen *pOldPen=memDC.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
	memDC.SelectObject(pOldPen);
}

void CCoordinate::DrawXGrid(COLORREF color, int n)
{
	m_nXmin=0;
	m_nXmax=1000;
	m_nYmin=0;
	m_nYmax=5000;
	if(n<1) n=1;
	else if(n>20) n=20;

	m_colorGrid=color;
	CPen *pPen=new CPen(PS_DOT,1,color);
	CPen *pOldPen=memDC.SelectObject(pPen);
	int width=m_nXmax-m_nXmin;
	CPoint pt;
	memDC.SelectObject(pPen);
/*	CString str;
	CFont font;
	//字体大小16磅
	font.CreateFont(16,0,0,
		0,400,FALSE,FALSE,0,
		ANSI_CHARSET,OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH | FF_SWISS,"Arial");
	CFont *pOldFont=memDC.SelectObject(&font);
	memDC.SetTextColor(color);
	str.Format("%d",m_nXmin);
	TextOutXCenter(m_nXmin,m_nYmin,str);
*/	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);
	}
//	str.Format("%d",m_nXmax);
//	TextOutXCenter(x,m_nYmin,str);

	//Restore the GDI resource
//	memDC.SelectObject(pOldFont);
	memDC.SelectObject(pOldPen);
	delete pPen;
}

void CCoordinate::DrawYGrid(COLORREF color, int n)
{
	m_nXmin=0;
	m_nXmax=1000;
	m_nYmin=0;
	m_nYmax=5000;
	if(n<1) n=1;
	else if(n>20) n=20;

	m_colorGrid=color;
	CPen *pPen=new CPen(PS_DOT,1,color);
	CPen *pOldPen=memDC.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);
	}
	memDC.SelectObject(pOldPen);
	delete pPen;

}

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

	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	CSize size=memDC.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;
	memDC.TextOut(point.x,point.y,str);
	memDC.SelectObject(pOldFont);
}

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

	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	CSize size=memDC.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;
	memDC.TextOut(point.x,point.y,str);
	memDC.SelectObject(pOldFont);
}
void CCoordinate::TextOutXCenterTop(int x, int y, CString str,COLORREF textColor)
{
	CFont font;
	//字体大小16磅
	font.CreateFont(16,0,0,
		0,400,FALSE,FALSE,0,
		ANSI_CHARSET,OUT_DEFAULT_PRECIS,
		CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH | FF_SWISS,"Arial");
	CFont *pOldFont=memDC.SelectObject(&font);
	memDC.SetTextColor(textColor);

	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	CSize size=memDC.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;
	memDC.TextOut(point.x,point.y,str);
	memDC.SelectObject(pOldFont);
}

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

	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	CSize size=memDC.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=point.x+size.cy/4;
	memDC.TextOut(point.x,point.y,str);
	memDC.SelectObject(pOldFont);
}

void CCoordinate::DrawBack(COLORREF color)
{
	m_colorBack=color;
	memDC.FillSolidRect(m_rectDraw,m_colorBack);
}

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

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

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

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

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

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

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

void CCoordinate::LineTo(int x, int y, COLORREF color)
{
	CPen pen(PS_SOLID,0,color);
	CPen *pOldPen=memDC.SelectObject(&pen);
	
	CPoint point=CPoint(x,y);
	Point_Conv(&point);
	memDC.LineTo(point);

	memDC.SelectObject(pOldPen);
}

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

int CCoordinate::SetBkMode(int nBkMode)
{
	memDC.SetBkMode(nBkMode);
	return 0;
}

void CCoordinate::SetPixel(int x, int y, COLORREF cr)
{
	SetPixel(CPoint(x, y), cr);
}

void CCoordinate::SetPixel(CPoint pt, COLORREF cr)
{
	Point_Conv(&pt);
	memDC.SetPixel(pt, cr);
}

BOOL CCoordinate::Pie(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, COLORREF cr)
{
	return Pie(CRect(x1, y1, x2, y2), CPoint(x3, y3), CPoint(x4, y4), cr);
}

BOOL CCoordinate::Pie(LPCRECT lpRect, POINT ptStart, POINT ptEnd, COLORREF cr)
{
	CPen pen(PS_SOLID, 1, cr);
	CBrush brush(cr);
	CBrush *br = (CBrush *)memDC.SelectObject(&brush);
	CPen *pn = (CPen *)memDC.SelectObject(&pen);
	if(memDC.Pie(lpRect, ptStart, ptEnd))
	{
		memDC.SelectObject(br);
		memDC.SelectObject(pn);
		return TRUE;
	}
	else
	{
		memDC.SelectObject(br);
		memDC.SelectObject(pn);
		return FALSE;
	}
}

BOOL CCoordinate::Pie(int x, int y, COLORREF cr, int offsetx, int offsety)
{
	CPoint pt = CPoint(x, y);
	Point_Conv(&pt);
	int x1 = pt.x;
	int y1 = pt.y - offsety;
	int x2 = pt.x + 2 * offsetx;
	int y2 = pt.y + offsety;
	return Pie(x1, y1, x2, y2, pt.x, pt.y, pt.x, pt.y, cr);
}

BOOL CCoordinate::Pie(CPoint ptStart, COLORREF cr, int offsetx, int offsety)
{
	Point_Conv(&ptStart);
	int x1 = ptStart.x;
	int y1 = ptStart.y - offsety;
	int x2 = ptStart.x + 2 * offsetx;
	int y2 = ptStart.y + offsety;
	return Pie(CRect(x1, y1, x2, y2), ptStart, ptStart, cr);
}

⌨️ 快捷键说明

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