📄 coordinate.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 + -