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