www.gusucode.com > VC++数据曲线动态绘制显示类源码程序 > VC++数据曲线动态绘制显示类源码程序/code/DataShow.cpp

    // DataShow.cpp : implementation file
//
/************************************************************************/
/* 数据显示类:
   作者:南京航空航天大学能源与动力学院 庄三少
                                   2009年1月11日  
   Email:viualsan@yahoo.cn
     tel:13512524413 
友情发布:http://www.NewXing.com
说明:
   本类无任何限制,可自由改动传播。只需附上该段说明。                                                                  */
/************************************************************************/
#include "stdafx.h"
#include "DataShow.h"
#include <math.h>


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

/////////////////////////////////////////////////////////////////////////////
// CDataShow

CDataShow::CDataShow()
{

	m_IsTimeShow=true;
	m_time_color=RGB(255,0,255);
	m_IsNoteOn=true;
	m_sNote_text="南京航空航天大学创建于 1952 年 10 月,座落于六朝古都南京。目前有两校区.";
	m_IsEnlargeClose=false;
	m_IsSelect_enlarge=false;
	m_IsEnlarge=false;
	m_IsMove=false;
    m_captureNum=0;
	m_IsCaptureSaveBMP=3;
	m_IsCaptureSaveBMP=false;
	m_numofData=0;
	m_numOfBMP=0;
	m_lineStyle=0;
	m_lineWide=0;
	
	m_color_note=RGB(0,200,180);
	title_color=RGB(0,250,230);
	text_color=RGB(255,255,255);
	m_cross_color=RGB(0,255,255);
	m_selectRect_color=RGB(250,0,0);
	m_pMousePoint.x=0;
	m_pMousePoint.y=0;
	m_dNumOfData=0;
	m_selectRect_color=RGB(122,30,200);
	//初始化主框画笔

	m_pdc_framRect.new_brush.CreateSolidBrush(RGB(0,100,100));
	m_pdc_framRect.new_pen.CreatePen(0,0,RGB(255,255,0));

	//初始化数据框画笔
	m_pdc_data.new_brush.CreateSolidBrush(RGB(0,100,100));
	m_pdc_data.new_pen.CreatePen(0,0,RGB(255,255,0));
	m_datacolor=RGB(255,255,0);
	//参数化数据框画笔
	m_pdc_childRect.new_brush.CreateSolidBrush(RGB(0,0,0));
	m_pdc_childRect.new_pen.CreatePen(0,0,RGB(255,255,0));
	m_pdc_childRect.c=RGB(0,0,0);

	//参数化轴画笔

	m_pdc_axis.new_brush.CreateSolidBrush(RGB(0,100,100));
	m_pdc_axis.new_pen.CreatePen(0,0,RGB(255,255,0));
	//初始化网格画笔
	m_pdc_grid.new_pen.CreatePen(2,0,RGB(0,255,255));

	m_High=500;
	m_Low=0;
	m_Top=500;
	m_Bottom=0;


	///////////////////
	double dx=m_High/200.0;
	for (int i=0;i<200;i++)
	{
		m_Data_x[i]=dx*i;
		m_Data_y[i]=sin(m_Data_x[i]/30)*150;
		m_dNumOfData++;
	}

	m_start_POINT.x=m_Data_x[0];
	m_start_POINT.y=m_Data_y[0];
	m_end_point.x=m_Data_x[m_dNumOfData-1];
	m_end_point.y=m_Data_y[m_dNumOfData-1];


	m_IsCrossMove=true;
	m_sTitle_str="visualsan@yahoo.cn  TEL:13512524413 南京航空航天大学——庄三少";
	m_sAxis_xstr="时间轴";
	m_sAxis_ystr="数据轴";
	m_dNum=(m_High - m_Low)/10;
	m_dnum_top_bottom=(m_Top - m_Bottom)/10;
	m_bIsGridOn=false;
	m_GridControl=5;

	m_x_start=-100;
	m_y_start=-100;
	m_x_end=500;
	m_y_end=500;
	m_xFactor=(m_x_end-m_x_start)/double(m_High-m_Low);
	m_yFactor=(m_y_end-m_y_start)/double(m_Top-m_Bottom);
	m_pdc_data.c=m_pdc_childRect.c;
	m_pdc_data.new_brush.DeleteObject();
	m_pdc_data.new_brush.CreateSolidBrush(RGB(0,0,0));

	for (i=0;i<20;i++)
	{
		m_Text[i]="love";
	}
	
	
}

CDataShow::~CDataShow()
{
}


BEGIN_MESSAGE_MAP(CDataShow, CStatic)
	//{{AFX_MSG_MAP(CDataShow)
	ON_WM_TIMER()
	ON_WM_MOUSEMOVE()
	ON_WM_PAINT()
	ON_WM_CREATE()
	ON_WM_ERASEBKGND()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_RBUTTONDOWN()
	ON_WM_RBUTTONUP()
	ON_WM_MBUTTONDOWN()
	ON_WM_MBUTTONUP()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_RBUTTONDBLCLK()
	ON_COMMAND(IDC_SAVE_BMP, OnSaveBmp)
	ON_COMMAND(IDC_SAVE_DATA, OnSaveData)
    ON_COMMAND(IDC_SET_DATA_COLOR,OnSetDataColor)
	ON_COMMAND(IDC_SET_AXIS_COLOR,OnSetAxisColor)
	ON_COMMAND(IDC_SET_XYLEBAL_COLOR,OnSetXYlebalColor)
	ON_COMMAND(IDC_SET_GRID_COLOR,OnSetGridColor)

	ON_COMMAND(IDC_SET_BK_COLOR,OnSetBKColor)
	ON_COMMAND(IDC_SET_TITLE_COLOR,OnSetTitleColor)
	ON_COMMAND(IDC_SET_CROSSLINE_COLOR,OnSetCrossLineColor)
	ON_COMMAND(IDC_SET_FACE_COLOR,OnSetFaceColor)
	ON_COMMAND(IDC_DATA_INPUT,OnSetDataInput)
	ON_COMMAND(IDC_SET_GRID_ON_OFF,OnSetGridOnOff)
	ON_COMMAND(IDC_SET_NOTE_ON_OFF,OnSetNoteOnOff)
    ON_COMMAND(IDC_SET_NOTE_COLOR,OnSetNoteColor)
	ON_COMMAND(IDB_SET_TIME_SHOW,OnSetTimeShow)
    ON_COMMAND(IDB_SET_TIME_TEXT_COLOR,OnSetTimeColor)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDataShow message handlers

void CDataShow::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
if (nIDEvent==0)
{

	Invalidate();
}
if (nIDEvent==1)
{
	SaveBmpWithTheOfTime();
	if (m_numOfBMP>1000)
	{
		m_numOfBMP=0;
	}

}
if (nIDEvent==2)
{
	SaveDateAuto();

	if (m_numofData>1000)
	{
		m_numofData=0;
	}
}


/*if ((m_IsCaptureSaveBMP)&&m_captureNum<=m_max_CapturePictre
	)
{
	CTime st=GetCurrentTime();
	CString filename,str;
	str.Format("H=%d Min=%d Sec=%d",st.GetHour(),st.GetMinute(),st.GetSecond());
	filename.Format("Num%d",m_numOfBMP++);
	filename=filename+",Time "+str+".bmp";	
	CaptureSaveBMP(filename);
	m_captureNum++;

}*/





	
	CStatic::OnTimer(nIDEvent);
}
void CDataShow::OnSetDataColor()
{
	SetColor("data");
}
void CDataShow::OnSetTimeColor()
{

	SetColor("time");
}
void CDataShow::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default


	if(m_IsSelect_enlarge&&!m_IsEnlargeClose)
	{
		if (!IsDataOut(point.x,point.y))//保证选择框不超出数据框范围
		{
			m_Select_Enlarge_p2=point;
		}
		
	}
	SetTimer(0,10,NULL);
	SetDataRect();
	Move(point);
	Enlarge(point);
	if (m_dataRect.left<point.x&&point.x<m_dataRect.right
		&&point.y>m_dataRect.top&&point.y<m_dataRect.bottom)
	{
		
		if (m_IsCrossMove)
		{
			if (GetNearPoint()!=-1&&GetNearPoint()!=m_dNumOfData)
			{
				SetNearMousePoint();
			}
			else{
	
		
				m_pMousePoint.x=point.x;
				m_pMousePoint.y=point.y;
			}
	}
	
	}
	Move(point);

	
	
	CStatic::OnMouseMove(nFlags, point);
}

void CDataShow::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

	m_High=(m_dataRect.right-m_dataRect.left);
	m_Low=0;
	m_Top=(-m_dataRect.top+m_dataRect.bottom-2*h);
	m_Bottom=0;
	m_dNum=(m_High - m_Low)/10;
	m_dnum_top_bottom=(m_Top - m_Bottom)/10;

	//CDC *pDC;
	//pDC=GetDC();
	
	GetClientRect(m_frameRect);
	CBitmap bitmap;
	bitmap.CreateCompatibleBitmap(&dc, m_frameRect.Width(), m_frameRect.Height());//生成空间的内存位图	
	CDC me;
	me.CreateCompatibleDC(NULL);//生成内存cd	
	me.SelectObject(&bitmap);
	
	me.SetBkMode(TRANSPARENT);//设置透明字体
	me.SetTextColor(RGB(255,0,0));
	////////////////////////添加绘图函数

	


//	EnlargeSelectLarge();

	SetAxisChange();
	Draw_frameRect(&me);
	Draw_childRect(&me);
	Draw_SelectArea(&me);
	Draw_MousePoint(&me);
	Draw_Title(&me);
	Draw_Axis(&me);
	Draw_Axis_xyLebal(&me);	
	Draw_Data(&me);			
	Draw_CrossLine(&me);
	Draw_Grid(&me);
	Draw_SelectRect(&me);
	Draw_NoteWord(&me);
//	TextControl(&me);


	


	

    
///////////////////////////////////////////////////////////////////////////
	me.SetROP2(R2_WHITE);
	dc.BitBlt(0, 0, m_frameRect.Width(), m_frameRect.Height(), &me, 0, 0, SRCCOPY);//拷备

	bitmap.DeleteObject();
	me.DeleteDC();
	
//	pDC->DeleteDC();

	
	// Do not call CStatic::OnPaint() for painting messages
}

int CDataShow::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CStatic::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	GetClientRect(m_frameRect);
	

	
	return 0;
}




BOOL CDataShow::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	
	return FALSE;
}



void CDataShow::Draw_frameRect(CDC *dc)
{
	
	GetClientRect(m_frameRect);
	dc->FillRect(m_frameRect,&m_pdc_framRect.new_brush);
	

}

//DEL void pdc::SetOldObject()
//DEL {
//DEL 	pDC->SelectObject(old_brush);
//DEL 	pDC->SelectObject(old_pen);
//DEL 
//DEL }

//DEL void pdc::SetNewObject()
//DEL {
//DEL 	old_pen=pDC->SelectObject(&new_pen);
//DEL 	old_brush=pDC->SelectObject(&new_brush);
//DEL 
//DEL }

//DEL pdc::~pdc()
//DEL {
//DEL 	SetOldObject();
//DEL }

//DEL pdc::pdc()
//DEL {
//DEL 
//DEL 
//DEL }



void CDataShow::Draw_childRect(CDC *dc)
{
	GetClientRect(m_frameRect);
	SetDataRect();
//	SetChildRectColor(RGB(0,0,0));
	dc->FillRect(m_dataRect,&m_pdc_childRect.new_brush);

}

void CDataShow::SetDataRect()
{
	
	w=m_frameRect.Width()/10.0;
	h=m_frameRect.Height()/10.0;
	if (w>20)
	{
		w=20;
	}
	if (h>10)
	{
		h=10;
	}
	if (w<10)
	{
		w=10;
	}
	if (h<5)
	{
		h=5;
	}
	m_dataRect.left=m_frameRect.left+w*3;
	m_dataRect.right=m_frameRect.right-w;
	m_dataRect.top=m_frameRect.top+h;
	m_dataRect.bottom=m_frameRect.bottom-h;

}

void CDataShow::SetFrameColor(COLORREF C)
{
	m_pdc_framRect.new_brush.DeleteObject();
	m_pdc_framRect.new_brush.CreateSolidBrush(C);


}

void CDataShow::SetChildRectColor(COLORREF C)
{

	m_pdc_childRect.new_brush.DeleteObject();
	m_pdc_childRect.new_brush.CreateSolidBrush(C);
	m_pdc_childRect.c=C;
	m_pdc_data.new_brush.DeleteObject();
	m_pdc_data.new_brush.CreateSolidBrush(C);

}

void CDataShow::Draw_MousePoint(CDC *pdc)
{
	CString str;
	str.Format("x=%.1f",double((m_pMousePoint.x-m_pOrth.x)*m_xFactor+m_x_start));
	pdc->TextOut(m_frameRect.left+5,m_frameRect.bottom-30,str);	
	str.Format("y=%.1f",double((-m_pMousePoint.y+m_pOrth.y)*m_yFactor+m_y_start));
	pdc->TextOut(m_frameRect.left+5,m_frameRect.bottom-50,str);

	





	if (m_IsTimeShow)
	{
	pdc->SetTextColor(m_time_color);
	pdc->TextOut(m_dataRect.right-120,m_pOrth.y-30,GetTimeFormat());
	}

	

}

void CDataShow::Draw_Title(CDC *pdc)
{
	CPen p;
	p.CreatePen(0,0,title_color);
	SetTitlePosition();
	pdc->SetTextColor(title_color);
	pdc->TextOut(m_pTextPosition.x,m_pTextPosition.y,m_sTitle_str);
	p.DeleteObject();

}

void CDataShow::SetTitlePosition()
{
	SetDataRect();
/*	CPaintDC dc(this);
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);
    int text_height_ ,text_width_,l;
	l=m_sTitle_str.GetLength();
	text_height_ = tm.tmHeight + tm.tmExternalLeading; // Height of font
    text_width_ = tm.tmMaxCharWidth; // width of widest char in font
	if (l<100)
	{

        for (int i=0;i<=l*text_width_/m_dataRect.Width();i++)
        {*/

		m_pTextPosition.x=(m_dataRect.left+m_dataRect.right)/2-4*m_sTitle_str.GetLength();//((text_width_*m_sTitle_str.GetLength())/(l*text_width_/m_dataRect.Width()+1))/2*text_width_;
		m_pTextPosition.y=m_dataRect.top+h;//+text_height_*i;
	/*	}
	}
	else
	{
		
	}*/

}
void  CDataShow::Draw_Axis(CDC*pDC)
{
	
	pDC->SetTextColor(text_color);
	pDC->SelectObject(&m_pdc_axis.new_pen);
	CRect rect;
	SetDataRect();
	rect=m_dataRect;
	CString str;
	int i;
	int m_left,m_top,m_right,m_bottom;
	
    int m_Interval = (m_High - m_Low)/10;
	m_dNum=m_Interval;
	if (m_Interval < 1)  m_Interval = 1;
		
    m_left = rect.left+20;
	m_top = rect.top+10;
	m_right = rect.right-10;
	m_bottom = rect.bottom-40;
	
	
	
	int m_IntervalPan = (m_right - m_left)/10;
	if (m_IntervalPan < 1 ) m_IntervalPan =1;
	
	
	
	// 选中当前红色画笔,并保存以前的画笔
//	CGdiObject* pOldPen = pDC->SelectObject(pPenRed);
	
	// 绘制坐标轴
	pDC->MoveTo(m_left,m_top);
	
	// 垂直轴
	pDC->LineTo(m_left,m_bottom);
	
	// 水平轴
	pDC->LineTo(m_right,m_bottom);
	
	m_pOrth.x=m_left;
	m_pOrth.y=m_bottom;

	// 写X轴刻度值
	for(i=0;i<10;i++)
	{
		//str.Format(_T("%d"),m_Min+i*m_Interval);
		str.Format(_T("%.1f"),GetAxisPosition(i,"x"));
		pDC->TextOut(m_left+double(i*m_IntervalPan),m_bottom+3,str);		
	}
	//str.Format(_T("%d"),m_Max);
	str.Format(_T("%.1f"),m_x_end);
	pDC->TextOut(m_left+10*m_IntervalPan,m_bottom+3,str);		
//////////////////////////////////////////////////////////////////	

	m_Interval = (m_High - m_Low)/10;
	
	// 绘制X轴刻度
	for (i = 0; i < 20; i ++)
	{
		if ((i%2) == 0)
		{
			// 10的倍数
			pDC->MoveTo(i*m_Interval/2 + m_pOrth.x, m_bottom);
			pDC->LineTo(i*m_Interval/2 + m_pOrth.x, m_bottom+8);
		}
		else
		{
			// 10的倍数
			pDC->MoveTo(i*m_Interval/2 +m_pOrth.x, m_bottom);
			pDC->LineTo(i*m_Interval/2 + m_pOrth.x, m_bottom+3);
		}
	}
	
	// 绘制Y轴箭头
	pDC->MoveTo(m_right-5,m_bottom-5);
	pDC->LineTo(m_right,m_bottom);
	pDC->LineTo(m_right-5,m_bottom+5);
	
	// 绘制X轴箭头	
	pDC->MoveTo(m_left-5,m_top+5);
	pDC->LineTo(m_left,m_top);
	pDC->LineTo(m_left+5,m_top+5);
	

	
	// 绘制Y轴网格 选择绿色画笔
   // pDC->SelectObject(pPenGreen);	
    //

//////////////////////////////////////////////////////////////////
    //数组赋值

	m_Interval=(-m_Bottom+m_Top)/10;
	m_dnum_top_bottom=m_Interval;
	CFont* pFont = pDC->GetCurrentFont();
	LOGFONT logFont ;
	pFont->GetLogFont(&logFont);
	logFont.lfEscapement = 900 ;//900/10 = 90
	HFONT   hFont=CreateFontIndirect(&logFont);   
	pDC->SelectObject(hFont);
	// 写y轴刻度值
	for(i=0;i<10;i++)
	{
		//str.Format(_T("%d"),m_Min+i*m_Interval);
		str.Format(_T("%.1f"),GetAxisPosition(i,"y"));
		pDC->TextOut(m_pOrth.x-20,m_bottom-(i)*m_Interval+10,str);		
	}

    
		
	// 绘制y轴刻度
	for (i=0;i<20;i++)
	{
		if (i%2 == 0)
		{
			// 10的倍数
			pDC->MoveTo(m_pOrth.x, m_Bottom+i*m_Interval/2);
			pDC->LineTo(m_pOrth.x-8, m_Bottom+i*m_Interval/2);
		}
		else
		{
			
			pDC->MoveTo(m_pOrth.x, m_Bottom+i*m_Interval/2);
			pDC->LineTo(m_pOrth.x-5, m_Bottom+i*m_Interval/2);
		}
	}

	DeleteObject(hFont);
	pDC->SelectObject(pFont);
	pFont->DeleteObject();

	
}

void CDataShow::SetAxisColor(COLORREF C)
{
	m_pdc_axis.new_pen.DeleteObject();
	m_pdc_axis.new_pen.CreatePen(0,0,C);


}

void CDataShow::SetXYLebalColor(COLORREF C)
{
	m_axis_xyLebal.new_pen.DeleteObject();
	m_axis_xyLebal.new_pen.CreatePen(0,0,C);

}

void CDataShow::Draw_Axis_xyLebal(CDC *pdc)
{

	SetDataRect();

	CFont* pFont = pdc->GetCurrentFont();
	LOGFONT logFont ;
	pFont->GetLogFont(&logFont);
	logFont.lfEscapement = 900 ;//900/10 = 90
	HFONT   hFont=CreateFontIndirect(&logFont);   
///////////////x轴文字输出	
	pdc->TextOut((m_dataRect.left+m_dataRect.right)/2-4*m_sAxis_xstr.GetLength(),m_pOrth.y+h+20,m_sAxis_xstr);
////////////////////y轴文字输出
	pdc->SelectObject(hFont);
    pdc->TextOut(m_pOrth.x+5,(m_dataRect.bottom+m_dataRect.top)/2.5+4*m_sAxis_ystr.GetLength(),m_sAxis_ystr);
	
	
	DeleteObject(hFont);
	pdc->SelectObject(pFont);
	pFont->DeleteObject();
	
//	delete hFont;


}

void CDataShow::Draw_Data(CDC *pDC)
{

	int a,b;
	pDC->SelectObject(&m_pdc_data.new_pen);
	pDC->SetTextColor(m_datacolor);
	pDC->SelectObject(&m_pdc_data.new_brush);
	if (m_lineStyle>=4)
	{
		m_pdc_data.new_pen.DeleteObject();
		m_pdc_data.new_pen.CreatePen(m_lineStyle-3,m_lineWide,m_datacolor);
		pDC->SelectObject(&m_pdc_data.new_pen);
	}
	
	bool bs=true;
	int m_i=0;
	while ((m_i<m_dNumOfData)) 
	{
		
		if (!IsDataOut(m_pOrth.x+m_Data_x[m_i],m_pOrth.y-m_Data_y[m_i]))
		{
			pDC->MoveTo(m_pOrth.x+m_Data_x[m_i],m_pOrth.y-m_Data_y[m_i]);
			break;
		}
		m_i++;
		
	}
	
//	pDC->MoveTo(m_pOrth.x+m_Data_x[0],m_pOrth.y-m_Data_y[0]);
	for (int i=m_i;i<m_dNumOfData;i++)
	{
		if(!IsDataOut(m_pOrth.x+m_Data_x[i],m_pOrth.y-m_Data_y[i]))
		{	
			switch (m_lineStyle)
			{
		
			    case 0:
			    	pDC->LineTo(m_pOrth.x+m_Data_x[i],m_pOrth.y-m_Data_y[i]);
		     		break;
				case 1:
					pDC->TextOut(m_pOrth.x+m_Data_x[i]-1,m_pOrth.y-m_Data_y[i]-1,"*");
		    		break;
			    
				case 2:
					
				
					pDC->Ellipse(m_pOrth.x+m_Data_x[i]-2,m_pOrth.y-m_Data_y[i]-2
						,m_pOrth.x+m_Data_x[i]+2,m_pOrth.y-m_Data_y[i]+2);
					//pDC->TextOut(m_pOrth.x+m_Data_x[i]-1,
					//	m_pOrth.y-m_Data_y[i]-1,"0");
		   			break;
				case 3:
					pDC->Rectangle(m_pOrth.x+m_Data_x[i]-2,m_pOrth.y-m_Data_y[i]-2
						,m_pOrth.x+m_Data_x[i]+2,m_pOrth.y-m_Data_y[i]+2);

					break;
				case 4:
				case 5:
				case 6:
					pDC->LineTo(m_pOrth.x+m_Data_x[i],m_pOrth.y-m_Data_y[i]);
					break;
	
			}
			//
		    
	    
		}
	
		

//	
	}


}

bool CDataShow::IsDataOut(double x,double y)
{

	if (x>m_dataRect.right||x<m_dataRect.left||y<m_dataRect.top||y>m_dataRect.bottom)
	{
		return true;
	}
	return false;

}

void CDataShow::Draw_CrossLine(CDC *pDC)
{

	CPen p;
	p.CreatePen(0,0,m_cross_color);
	pDC->SelectObject(&p);
	int x,y;
	x=m_pMousePoint.x;
	y=m_pMousePoint.y;
	CPoint w_s,w_e,h_s,h_e;
	w_s.x=m_pOrth.x;
	w_s.y=y;
	w_e.x=m_dataRect.right-w;
	w_e.y=y;

	h_s.x=x;
	h_s.y=m_pOrth.y;
	h_e.x=x;
	h_e.y=m_dataRect.top+h;

	pDC->MoveTo(w_s);
	pDC->LineTo(w_e);

	pDC->MoveTo(h_s);
	pDC->LineTo(h_e);

	p.DeleteObject();



}

double CDataShow::GetDistance(CPoint p, double x, double y)
{
	
	return sqrtl((p.x-x)*(p.x-x)+(p.y-y)*(p.y-y));

}



int CDataShow::GetNearPoint()
{

	for (int i=0;i<m_dNumOfData;i++)
	{
		double x,y;
		x=m_Data_x[i];
		y=m_Data_y[i];
	//	x=(x-m_x_start)/m_xFactor;
	//	y=(y-m_y_start)/m_yFactor;
		if (abs(GetDistance(m_pMousePoint,double(x+m_pOrth.x),double(-y+m_pOrth.y)))<5)
		{
			return i;
		}
		
	}
	
	return -1;

}

void CDataShow::SetNearMousePoint()
{
	if (GetNearPoint()!=-1&&GetNearPoint()!=m_dNumOfData)
	{
		m_pMousePoint.x=double(m_Data_x[GetNearPoint()])+m_pOrth.x;
		m_pMousePoint.y=double(m_Data_y[GetNearPoint()])+m_pOrth.y;

	}
	CString s;
	s.Format("%d",GetNearPoint());
	//GetDC()->TextOut(0,0,s);

}





void CDataShow::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	if (m_IsSelect_enlarge==false)
	{
		
	    m_pMousePoint=point;
		m_IsCrossMove=true;	
        
	}
	if (!IsDataOut(point.x,point.y))//保证选择框不超出数据框范围
	{
	
		m_Select_Enlarge_p1=point;
	
	}
		m_IsEnlargeClose=false;
	

	CStatic::OnLButtonDown(nFlags, point);
}

void CDataShow::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if (m_IsSelect_enlarge==false)
	{
	
		m_IsCrossMove=false;
	}
	
	
	m_IsEnlargeClose=true;

	CStatic::OnLButtonUp(nFlags, point);
}

void CDataShow::SetText(CString str, CString name)
{
	if (name=="x")
	{
		m_sAxis_xstr=str;
	}
	else
	if (name=="y")
	{
		m_sAxis_ystr=str;
	}
	else
	{

		m_sTitle_str=str;
	}

}

bool CDataShow::SaveBmp()
{
	//定义图形大小
	CFileDialog dlg(false,NULL,"数据",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		"bmp文件(*.bmp)|*.bmp|",
		NULL);
	char title[]= {"保存数据文件"};
	dlg.m_ofn.lpstrTitle= title;
	if (dlg.DoModal()!= IDOK) return false;

	CString filename = dlg.GetFileName() + ".bmp";	
	int iWidth = m_frameRect.Width();
	int iHeight = m_frameRect.Height();
    int iPixel  = 16;
	//图形格式参数
    LPBITMAPINFO lpbmih = new BITMAPINFO;
    lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    lpbmih->bmiHeader.biWidth = iWidth;
    lpbmih->bmiHeader.biHeight = iHeight;
    lpbmih->bmiHeader.biPlanes = 1;
    lpbmih->bmiHeader.biBitCount = iPixel;
    lpbmih->bmiHeader.biCompression = BI_RGB;
    lpbmih->bmiHeader.biSizeImage = 0;
    lpbmih->bmiHeader.biXPelsPerMeter = 0;
    lpbmih->bmiHeader.biYPelsPerMeter = 0;
    lpbmih->bmiHeader.biClrUsed = 0;
    lpbmih->bmiHeader.biClrImportant = 0;
	
    //创建位图数据
    HDC hdc,hdcMem;
    HBITMAP hBitMap = NULL;
    CBitmap *pBitMap = NULL;
    CDC *pMemDC =NULL;
    BYTE *pBits;
	
    hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
    hdcMem = CreateCompatibleDC(hdc);
    hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
    pBitMap = new CBitmap;
    pBitMap->Attach(hBitMap);
    //pMemDC = new CDC;
	pMemDC=new CDC;
    pMemDC->Attach(hdcMem);
    pMemDC->SelectObject(pBitMap);
	//
	CRect rc(0,0,iWidth,iHeight);
    //添加自绘图形 	
	pMemDC->SetBkMode(TRANSPARENT);//设置透明字体
	pMemDC->SetTextColor(RGB(255,0,0));


	Draw_frameRect(pMemDC);
	Draw_childRect(pMemDC);
	Draw_SelectArea(pMemDC);
	Draw_MousePoint(pMemDC);
	Draw_Title(pMemDC);
	Draw_Axis(pMemDC);
	Draw_Axis_xyLebal(pMemDC);
	Draw_Data(pMemDC);			
	Draw_CrossLine(pMemDC);
	Draw_SelectRect(pMemDC);
    Draw_Grid(pMemDC);
	Draw_NoteWord(pMemDC);
	

	
    //保存到文件并创建位图结构
    BITMAPFILEHEADER bmfh;
    ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
    *((char *)&bmfh.bfType) = 'B';
    *(((char *)&bmfh.bfType) + 1) = 'M';
    bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
	
    TCHAR szBMPFileName[128];
    int iBMPBytes = iWidth * iHeight * iPixel / 8;
    strcpy(szBMPFileName,filename);
    CFile file;
    if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
    {
        file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
        file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
        file.Write(pBits,iBMPBytes);
        file.Close();
    }
	
    pMemDC->DeleteDC();
    delete pMemDC;	pMemDC  = NULL;
    delete pBitMap; pBitMap = NULL;
    delete lpbmih;  lpbmih  = NULL;

	return true;

}



void CDataShow::LoadData()
{
	
	CFileDialog dlg(true,NULL,"数据",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		"data文件(*.data)|*.data|",
		NULL);
	char title[]= {"打开数据文件"};
	dlg.m_ofn.lpstrTitle= title;
	if (dlg.DoModal()!= IDOK) return;
	CString filename = dlg.GetFileName() ;	
	FILE *f;
	f=fopen(filename,"r");
	if (f==NULL)
	{
		AfxMessageBox("打开文件错误");
		return;
	}
	fscanf(f,"%d",&m_dNumOfData);
	for (int i=0;i<m_dNumOfData;i++)
	{
		fscanf(f,"%f",&m_Data_x[i]);
		fscanf(f,"%f",&m_Data_y[i]);
	}
    fclose(f);
	m_start_POINT.x=m_Data_x[0];
	m_start_POINT.y=m_Data_y[0];
	m_end_point.x=m_Data_x[m_dNumOfData-1];
	m_end_point.y=m_Data_y[m_dNumOfData-1];
	DataChange("in");
	

}

void CDataShow::SaveData()
{
	DataChange("out");
	KillTimer(0);
	FILE *f;
	CFileDialog dlg(false,NULL,"数据",OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		"data文件(*.data)|*.data|",
		NULL);
	char title[]= {"保存数据文件"};
	dlg.m_ofn.lpstrTitle= title;
	if (dlg.DoModal()!= IDOK)
	{
		DataChange("in");
		return;
	}
	CString filename = dlg.GetFileName() + ".data";	
	f=fopen(filename,"w");
	fprintf(f,"%d\n",m_dNumOfData);
	for(int i=0;i<m_dNumOfData;i++)
	{
		fprintf(f,"%f  %f\n",m_Data_x[i],m_Data_y[i]);
		
	}
	fclose(f);
	DataChange("in");
	SetTimer(0,100,NULL);

}

void CDataShow::Grid(CString IsOn)
{
	if (IsOn=="on"||IsOn=="oN"||IsOn=="On")
	{
		m_bIsGridOn=true;
		
	}
	else
	{
		m_bIsGridOn=false;
	}

}

void CDataShow::Draw_Grid(CDC *pDC)
{

	if (m_bIsGridOn)
	{
		pDC->SelectObject(m_pdc_grid.new_pen);
        double x,y;
	
		for (int i=1;i<=m_dNum;i++)
		{
			if((i%m_GridControl)==0)
			{
				x=i*10+m_pOrth.x;
	     		y=m_pOrth.y;
    			pDC->MoveTo(x,y);
    			x=i*10+m_pOrth.x;
    			y=m_dataRect.top+h;
    			pDC->LineTo(x,y);
			}

		}

		for (i=1;i<=m_dnum_top_bottom;i++)
		{
			if((i%m_GridControl)==0)
			{
				x=m_pOrth.x;
		    	y=m_pOrth.y-i*10;
		    	pDC->MoveTo(x,y);
		    	x=m_dataRect.right-w;
		    	pDC->LineTo(x,y);
			
			}
			
		}


	}
}

void CDataShow::SetGridDensity(int density)
{
	if (density>0)
	m_GridControl=density;

}

void CDataShow::SetGridColor(COLORREF C)
{
	m_pdc_grid.new_pen.DeleteObject();
	m_pdc_grid.new_pen.CreatePen(2,0,C);

}
void CDataShow::OnSetNoteOnOff()
{
	if (m_IsNoteOn)
	{
		SetNoteWordOn(true);
		m_IsNoteOn=false;
	}
	else
	{
	   SetNoteWordOn(false);
	   m_IsNoteOn=true;
	  }
	
	
}
void CDataShow::OnSetTimeShow()
{
	if (m_IsTimeShow)
	{
		SetTimeShow(true);
		m_IsTimeShow=false;
	}
	else
	{
		SetTimeShow(false);
		m_IsTimeShow=true;
	}
}
void CDataShow::SetDataColor(COLORREF C)
{
	m_pdc_data.new_pen.DeleteObject();
	m_pdc_data.new_pen.CreatePen(0,m_lineWide,C);
	m_pdc_data.c=C;
	m_pdc_data.new_brush.DeleteObject();
	m_pdc_data.new_brush.CreateSolidBrush(m_pdc_childRect.c);
	m_datacolor=C;

}

void CDataShow::SetTextColor(COLORREF C)
{
	text_color=C;

}

void CDataShow::SetCrossColor(COLORREF C)
{
	m_cross_color=C;

}

void CDataShow::SetTitleColor(COLORREF C)
{

	title_color=C;
}

void CDataShow::SetData(double *x, double *y, int n)
{
	if (n<=2000)
	{
		m_dNumOfData=n;
		for (int i=0;i<m_dNumOfData;i++)
		{
			m_Data_x[i]=x[i];
			m_Data_y[i]=y[i];
		}
		DataChange("in");
	}

}

void CDataShow::Init()
{
	SetTimer(0,10,NULL);
//	Invalidate();

}



void CDataShow::SetAxisChange()
{
	
	m_xFactor=double(m_x_end-m_x_start)/double(m_High-m_Low);
	m_yFactor=double(m_y_end-m_y_start)/double(m_Top-m_Bottom);

}

void CDataShow::Draw_SelectRect(CDC *pdc)
{

	if (GetNearPoint()!=-1&&GetNearPoint()!=m_dNumOfData)
	{

		CPen p;
		CBrush b;
		b.CreateSolidBrush(m_selectRect_color);
		p.CreatePen(0,0,m_selectRect_color);
		pdc->SelectObject(&p);
		pdc->SelectObject(&b);
		pdc->Rectangle(m_pMousePoint.x-3,m_pMousePoint.y-3,m_pMousePoint.x+3,m_pMousePoint.y+3);
		p.DeleteObject();
		b.DeleteObject();
		m_IsCaptureSaveBMP=true;
			
	}
	else
     m_IsCaptureSaveBMP=false;

}

int CDataShow::SetDrawLineStyle(int style,int lineWide)
{

	m_lineStyle=style;
	m_lineWide=lineWide;
	if ((style<0||style>=7))
	{
		m_lineStyle=0;
		
	}
	if ((lineWide<0||lineWide>20))
	{
		m_lineWide=0;
		
	}
	m_pdc_data.new_pen.DeleteObject();
	if (style>=4)
	{
	m_pdc_data.new_pen.CreatePen(m_lineStyle-3,m_lineWide,m_datacolor);
	}
	else
		m_pdc_data.new_pen.CreatePen(0,m_lineWide,m_datacolor);
	
	return style;

}

void CDataShow::SaveBmp(double second,bool stop)
{
	if (stop==true)
	{
		KillTimer(1);

	
	}
	else
	{

		SetTimer(1,second*1000,NULL);
	}


SaveBmpWithTheOfTime();


}

void CDataShow::SaveBmpWithTheOfTime()
{
	KillTimer(0);
	CTime st=CTime::GetCurrentTime();
	CString filename,str;
	str.Format("H=%d Min=%d Sec=%d",st.GetHour(),st.GetMinute(),st.GetSecond());
	filename.Format("Num%d",m_numOfBMP++);
	filename=filename+",Time "+str+".bmp";	

	int iWidth = m_frameRect.Width();
	int iHeight = m_frameRect.Height();
    int iPixel  = 16;
	//图形格式参数
    LPBITMAPINFO lpbmih = new BITMAPINFO;
    lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    lpbmih->bmiHeader.biWidth = iWidth;
    lpbmih->bmiHeader.biHeight = iHeight;
    lpbmih->bmiHeader.biPlanes = 1;
    lpbmih->bmiHeader.biBitCount = iPixel;
    lpbmih->bmiHeader.biCompression = BI_RGB;
    lpbmih->bmiHeader.biSizeImage = 0;
    lpbmih->bmiHeader.biXPelsPerMeter = 0;
    lpbmih->bmiHeader.biYPelsPerMeter = 0;
    lpbmih->bmiHeader.biClrUsed = 0;
    lpbmih->bmiHeader.biClrImportant = 0;
	
    //创建位图数据
    HDC hdc,hdcMem;
    HBITMAP hBitMap = NULL;
    CBitmap *pBitMap = NULL;
    CDC *pMemDC =NULL;
    BYTE *pBits;
	
    hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
    hdcMem = CreateCompatibleDC(hdc);
    hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
    pBitMap = new CBitmap;
    pBitMap->Attach(hBitMap);
    //pMemDC = new CDC;
	pMemDC=new CDC;
    pMemDC->Attach(hdcMem);
    pMemDC->SelectObject(pBitMap);
	//
	CRect rc(0,0,iWidth,iHeight);
    //添加自绘图形 	
	pMemDC->SetBkMode(TRANSPARENT);//设置透明字体
	pMemDC->SetTextColor(RGB(255,0,0));
	
	
	Draw_frameRect(pMemDC);
	Draw_childRect(pMemDC);
	Draw_SelectArea(pMemDC);
	Draw_MousePoint(pMemDC);
	Draw_Title(pMemDC);
	Draw_Axis(pMemDC);
	Draw_Axis_xyLebal(pMemDC);
	Draw_Data(pMemDC);			
	Draw_CrossLine(pMemDC);
	Draw_SelectRect(pMemDC);
    Draw_Grid(pMemDC);
	Draw_NoteWord(pMemDC);
	
	
    //保存到文件并创建位图结构
    BITMAPFILEHEADER bmfh;
    ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
    *((char *)&bmfh.bfType) = 'B';
    *(((char *)&bmfh.bfType) + 1) = 'M';
    bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
	
    TCHAR szBMPFileName[128];
    int iBMPBytes = iWidth * iHeight * iPixel / 8;
    strcpy(szBMPFileName,filename);
    CFile file;
    if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
    {
        file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
        file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
        file.Write(pBits,iBMPBytes);
        file.Close();
    }
	
    pMemDC->DeleteDC();
    delete pMemDC;	pMemDC  = NULL;
    delete pBitMap; pBitMap = NULL;
    delete lpbmih;  lpbmih  = NULL;
	Sleep(200);
	SetTimer(0,100,NULL);

}

void CDataShow::SaveData(double second, bool stop)
{
	if (stop==true)
	{
		KillTimer(2);
	}
	else
	{
		if (second<=0)
		{
			second=0;
		}
		SetTimer(2,second*1000,NULL);
	}

}

void CDataShow::SaveDateAuto()
{
	KillTimer(0);
	DataChange("out");
	FILE *f;
	CTime st=GetCurrentTime();
	CString filename,str;
	str.Format("H=%d Min=%d Sec=%d",st.GetHour(),st.GetMinute(),st.GetSecond());
	filename.Format("Num%d",m_numofData++);
	filename=filename+",Time "+str+".data";	
	f=fopen(filename,"w");
	if (f==NULL)
	{
		AfxMessageBox("文件保存失败!");
		DataChange("in");
		return;
	}
	fprintf(f,"%d\n",m_dNumOfData);
	for(int i=0;i<m_dNumOfData;i++)
	{
		fprintf(f,"%f  %f\n",m_Data_x[i],m_Data_y[i]);
		
	}
	fclose(f);
	DataChange("in");
	Sleep(200);
	SetTimer(0,100,NULL);

}

double CDataShow::GetAxisPosition(int n, CString name)
{
	if (name=="x")
	{
		double dx;
		dx=(m_x_end-m_x_start)/10;
		return m_x_start+dx*n;
	}
	else
	{
		double dy;
		dy=(m_y_end-m_y_start)/10;
		return m_y_start+dy*n;

	}

}

void CDataShow::SetAxisRange(double start, double ed, CString name)
{
	DataChange("out");
	if (name=="x")
	{
		m_x_start=start;
		m_x_end=ed;
	}
	else
	{
		m_y_start=start;
		m_y_end=ed;

	}
	SetAxisChange();
	DataChange("in");

}

void CDataShow::DataChange(CString name)
{
	if (name=="in")//写入除变换因子
	{

		for (int i=0;i<m_dNumOfData;i++)
		{
		m_Data_x[i]=(m_Data_x[i]-m_x_start)/m_xFactor;
		m_Data_y[i]=(m_Data_y[i]-m_y_start)/m_yFactor;
		}
	}
	else//读出时恢复
	{
		for (int i=0;i<m_dNumOfData;i++)
		{
			m_Data_x[i]=(m_Data_x[i])*m_xFactor+m_x_start;
			m_Data_y[i]=(m_Data_y[i])*m_yFactor+m_y_start;
		}

	}

}

void CDataShow::CaptureSaveBMP(CString filename)
{
	
	int iWidth = m_frameRect.Width();
	int iHeight = m_frameRect.Height();
    int iPixel  = 16;
	//图形格式参数
    LPBITMAPINFO lpbmih = new BITMAPINFO;
    lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    lpbmih->bmiHeader.biWidth = iWidth;
    lpbmih->bmiHeader.biHeight = iHeight;
    lpbmih->bmiHeader.biPlanes = 1;
    lpbmih->bmiHeader.biBitCount = iPixel;
    lpbmih->bmiHeader.biCompression = BI_RGB;
    lpbmih->bmiHeader.biSizeImage = 0;
    lpbmih->bmiHeader.biXPelsPerMeter = 0;
    lpbmih->bmiHeader.biYPelsPerMeter = 0;
    lpbmih->bmiHeader.biClrUsed = 0;
    lpbmih->bmiHeader.biClrImportant = 0;
	
    //创建位图数据
    HDC hdc,hdcMem;
    HBITMAP hBitMap = NULL;
    CBitmap *pBitMap = NULL;
    CDC *pMemDC =NULL;
    BYTE *pBits;
	
    hdc = CreateIC(TEXT("DISPLAY"),NULL,NULL,NULL);
    hdcMem = CreateCompatibleDC(hdc);
    hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void **)&pBits,NULL,0);
    pBitMap = new CBitmap;
    pBitMap->Attach(hBitMap);
    //pMemDC = new CDC;
	pMemDC=new CDC;
    pMemDC->Attach(hdcMem);
    pMemDC->SelectObject(pBitMap);
	//
	CRect rc(0,0,iWidth,iHeight);
    //添加自绘图形 	
	pMemDC->SetBkMode(TRANSPARENT);//设置透明字体
	pMemDC->SetTextColor(RGB(255,0,0));
	
	
	Draw_frameRect(pMemDC);
	Draw_childRect(pMemDC);
	Draw_MousePoint(pMemDC);
	Draw_Title(pMemDC);
	Draw_Axis(pMemDC);
	Draw_Axis_xyLebal(pMemDC);
	Draw_Data(pMemDC);			
	Draw_CrossLine(pMemDC);
	Draw_SelectRect(pMemDC);
    Draw_Grid(pMemDC);
	
	
    //保存到文件并创建位图结构
    BITMAPFILEHEADER bmfh;
    ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
    *((char *)&bmfh.bfType) = 'B';
    *(((char *)&bmfh.bfType) + 1) = 'M';
    bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    bmfh.bfSize = bmfh.bfOffBits + (iWidth * iHeight) * iPixel / 8;
	
    TCHAR szBMPFileName[128];
    int iBMPBytes = iWidth * iHeight * iPixel / 8;
    strcpy(szBMPFileName,filename);
    CFile file;
    if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
    {
        file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
        file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
        file.Write(pBits,iBMPBytes);
        file.Close();
    }
	
    pMemDC->DeleteDC();
    delete pMemDC;	pMemDC  = NULL;
    delete pBitMap; pBitMap = NULL;
    delete lpbmih;  lpbmih  = NULL;


}

void CDataShow::SetMaxCapturePicture(int max_p)
{
	if (max_p<=0)
	{
		m_max_CapturePictre=1;
	}
	else
		m_max_CapturePictre=max_p;

}

void CDataShow::Move(CPoint p)
{
	if (m_IsMove)
	{

		double dx,dy;
	dx=(p.x-m_move_formerpoint.x)*m_xFactor/50;
	dy=(-p.y+m_move_formerpoint.y)*m_yFactor/50;
	SetAxisRange(m_x_start-dx,m_x_end-dx,"x");
	SetAxisRange(m_y_start-dy,m_y_end-dy,"y");

	}

}

void CDataShow::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	
//	m_IsSelect_enlarge=FALSE;
	
	m_move_formerpoint=point;
	m_IsMove=true;
	CStatic::OnRButtonDown(nFlags, point);
}

void CDataShow::OnRButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	m_move_formerpoint=m_pOrth;
	m_IsMove=false;
	CStatic::OnRButtonUp(nFlags, point);
}



void CDataShow::OnMButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	m_enlarge_point=point;
	m_IsEnlarge=true;
	
	CStatic::OnMButtonDown(nFlags, point);
}

void CDataShow::OnMButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	
	m_IsEnlarge=false;
	CStatic::OnMButtonUp(nFlags, point);
}

void CDataShow::Enlarge(CPoint p)
{
	if (m_IsEnlarge)
	{
		
		double dx,dy;
		dx=(p.x-m_enlarge_point.x);
		dy=(-p.y+m_enlarge_point.y);
		if (dx<0)
		{
		SetAxisRange(m_x_start*(1+0.005),m_x_end*(1+0.005),"x");
		}
		else
			SetAxisRange(m_x_start*(1-0.005),m_x_end*(1-0.005),"x");
		if (dy<0)
		{
		SetAxisRange(m_y_start*(1+0.005),m_y_end*(1+0.005),"y");
		}
		else
			SetAxisRange(m_y_start*(1-0.005),m_y_end*(1-0.005),"y");

		
	}

}



void CDataShow::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default


	if (m_IsSelect_enlarge==true)
	{
		m_IsSelect_enlarge=false;
	}
	else
	m_IsSelect_enlarge=true;
	m_Select_Enlarge_p1=point;
	m_Select_Enlarge_p2=point;
	
	
	CStatic::OnLButtonDblClk(nFlags, point);
}

void CDataShow::Draw_SelectArea(CDC *pDC)
{
	if (m_IsSelect_enlarge)
	{
		CPen P;
		P.CreatePen(0,0,m_selectRect_color);
		CBrush b;
		b.CreateSolidBrush(m_pdc_childRect.c);
    	pDC->SelectObject(&b);
    	pDC->SelectObject(&P);
    	pDC->Rectangle(m_Select_Enlarge_p1.x,m_Select_Enlarge_p1.y,m_Select_Enlarge_p2.x,m_Select_Enlarge_p2.y);
		P.DeleteObject();
		b.DeleteObject();
		
	//	AfxMessageBox("dr_c");
		
		
	}
	
}

void CDataShow::SetSelectRectColor(COLORREF C)
{
	m_selectRect_color=C;
}

void CDataShow::EnlargeSelectLarge()
{

	    if (m_IsSelect_enlarge&&m_IsEnlargeClose)
	    {
	   
		double x1,x2,y1,y2;
		x1=m_Select_Enlarge_p1.x-m_pOrth.x;
		y1=m_Select_Enlarge_p1.y-m_pOrth.x;
		x2=m_Select_Enlarge_p2.x-m_pOrth.y;
		y2=m_Select_Enlarge_p2.y-m_pOrth.y;

		x1=(x1)*m_xFactor+m_x_start;
		y1=(y1)*m_yFactor+m_y_start;

		x2=(x2)*m_xFactor+m_x_start;
		y2=(y2)*m_yFactor+m_y_start;

		SetAxisRange(y1,y2,"y");
		SetAxisRange(x1,x2,"x");
		m_IsEnlargeClose=false;
		}

	

}

void CDataShow::OnRButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
//	m_IsEnlargeClose=true;
	CMenu PopupMenu;
	POINT curPos;
	GetCursorPos(&curPos);
	PopupMenu.CreatePopupMenu();
	
	PopupMenu.AppendMenu(MF_ENABLED, IDC_DATA_INPUT, _T("&I数据导入"));		
	PopupMenu.AppendMenu(MF_ENABLED, IDC_SAVE_DATA, _T("&D保存数据"));
	PopupMenu.AppendMenu(MF_ENABLED, IDC_SAVE_BMP, _T("&B保存当前图片"));
	if (!m_bIsGridOn)
	{
		PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_GRID_ON_OFF, _T("&O网格控制:on"));
	}
	else
		PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_GRID_ON_OFF, _T("&O网格控制:off"));

	if (!m_IsNoteOn)
	{
		PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_NOTE_ON_OFF, _T("&N文字说明:on"));
	}
	else
		PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_NOTE_ON_OFF, _T("&N文字说明:off"));
	if (!m_IsTimeShow)
	{
		PopupMenu.AppendMenu(MF_ENABLED, IDB_SET_TIME_SHOW, _T("&S显示时间:on"));
	}
	else
		PopupMenu.AppendMenu(MF_ENABLED, IDB_SET_TIME_SHOW, _T("&S显示时间:off"));


	PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_TITLE_COLOR, _T("&T颜色:标题"));
	PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_AXIS_COLOR, _T("&A颜色:坐标轴"));
	PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_GRID_COLOR, _T("&G颜色:网格"));
	PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_DATA_COLOR, _T("&Q颜色:数据曲线"));
	PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_XYLEBAL_COLOR, _T("&X颜色:坐标文字"));
	PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_BK_COLOR, _T("&G颜色:主框背景"));
    PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_FACE_COLOR, _T("&F颜色:曲线背景"));
    PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_CROSSLINE_COLOR, _T("&S颜色:十字线"));
    PopupMenu.AppendMenu(MF_ENABLED, IDC_SET_NOTE_COLOR, _T("&W颜色:说明文字"));
	PopupMenu.AppendMenu(MF_ENABLED, IDB_SET_TIME_TEXT_COLOR, _T("&W颜色:时间显示"));

	PopupMenu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, curPos.x, curPos.y, this);	
	PopupMenu.DestroyMenu();
	CString str;
	//str.Format("%d",PopupMenu.GetMenuState)
	CStatic::OnRButtonDblClk(nFlags, point);
}

void CDataShow::Draw_Text(CDC*pDC,CString str)
{
	pDC->SetBkMode(TRANSPARENT);
	pDC->SelectObject(m_pdc_data.new_pen);
	pDC->TextOut(m_text_point[m_numOf_Text++].x,m_text_point[m_numOf_Text].y,str);

}

void CDataShow::TextControl(CDC *pDC)
{

	for (int i=0;i<m_numOf_Text;i++)
	{
		Draw_Text(pDC,m_Text[i]);
	}

}

//DEL void CDataShow::DataOutputControl(double n,CString in_or_out)
//DEL {
//DEL 
//DEL 	if (in_or_out=="in")
//DEL 	{
//DEL 	for (int i=0;i<m_dNumOfData;i++)
//DEL 	{
//DEL 		m_Data_x[i]=m_Data_x[i]*n;
//DEL 		m_Data_y[i]=m_Data_y[i]*n;
//DEL 
//DEL 	}
//DEL 	m_High=m_High*n;
//DEL 	m_Low=m_Low*n;
//DEL 	m_Top=m_Top*n;
//DEL 	m_Bottom=m_Bottom*n;
//DEL 
//DEL 	m_dataRect.right=m_dataRect.Width()*n;
//DEL 	m_dataRect.bottom=m_dataRect.Height()*n;
//DEL 	m_frameRect.right=m_frameRect.Width()*n;
//DEL 	m_frameRect.bottom=m_frameRect.Height()*n;
//DEL 	h*=n;
//DEL 	w*=n;
//DEL 	}
//DEL 	else
//DEL 	{
//DEL 		for (int i=0;i<m_dNumOfData;i++)
//DEL 		{
//DEL 			m_Data_x[i]=m_Data_x[i]/n;
//DEL 			m_Data_y[i]=m_Data_y[i]/n;
//DEL 			
//DEL 		}
//DEL 		m_High=m_High/n;
//DEL 		m_Low=m_Low/n;
//DEL 		m_Top=m_Top/n;
//DEL 		m_Bottom=m_Bottom/n;
//DEL 		m_dataRect.right+=m_dataRect.Width()*n;
//DEL 		m_dataRect.bottom+=m_dataRect.Height()*n;
//DEL 		m_frameRect.right+=m_frameRect.Width()*n;
//DEL 		m_frameRect.bottom+=m_frameRect.Height()*n;
//DEL 		h*=n;
//DEL     	w*=n;
//DEL 
//DEL 	}
//DEL 
//DEL }

void CDataShow::OnSetAxisColor()
{
	SetColor("axis");
}
void CDataShow::OnSetXYlebalColor()
{
	
	SetColor("xy");
}
void CDataShow::OnSetGridColor()
{
	SetColor("grid");
}
void CDataShow::OnSetBKColor(){
	SetColor("bk");
}
void CDataShow::OnSetTitleColor()
{
	SetColor("title");
}

 void CDataShow::OnSetCrossLineColor()
{
	 SetColor("crossline");
}
void CDataShow::OnSetFaceColor()
{
	SetColor("face");
}
  void CDataShow::OnSetDataInput()
{
	LoadData();
}
  void CDataShow::OnSetNoteColor()
  {
	 SetColor("note");
  }

void CDataShow::OnSetGridOnOff()
{
	if (m_bIsGridOn)
	{
		Grid("off");
		m_bIsGridOn=false;
	}
	else{
	
		Grid("off");
		m_bIsGridOn=true;
	}
}


void CDataShow::OnSaveBmp() 
{
	// TODO: Add your command handler code here
	SaveBmp();
}

void CDataShow::OnSaveData() 
{
	// TODO: Add your command handler code here
	SaveData();
	
}

void CDataShow::SetColor(CString name)
{
	
	
		CColorDialog dlg;
		if (dlg.DoModal()==IDOK)
		{
			if (name=="data")
				SetDataColor(dlg.GetColor());
			if (name=="axis")
				SetAxisColor(dlg.GetColor());
			if (name=="xy")
			{
				SetTextColor(dlg.GetColor());
			}
			if (name=="face")
			{
				SetChildRectColor(dlg.GetColor());
			}
			if (name=="crossline")
			{
				SetCrossColor(dlg.GetColor());
			}
			if (name=="title")
			{
				SetTitleColor(dlg.GetColor());
			}
			if (name=="bk")
			{
				SetFrameColor(dlg.GetColor());
			}

			if (name=="grid")
			{
				SetGridColor(dlg.GetColor());
			}
			if (name=="note")
			{
				SetNoteColor(dlg.GetColor());
			}
			if (name=="time")
			{
				SetTimeTextColor(dlg.GetColor());
			}
		}
		
		
	

}

void CDataShow::Draw_NoteWord(CDC *pDC)
{
	SetNotePoint();
	if (m_IsNoteOn)
	{
	CString in[100],out,st;
	out=m_sNote_text;
	st=out;
	int n;
	n=(m_dataRect.right-m_pNote_point.x)/8;
	pDC->SetTextColor(m_color_note);
	pDC->TextOut(m_pNote_point.x+13*5,m_pNote_point.y-20,"NOTE");
	int len=m_sNote_text.GetLength();
	int count=len/n;
	for(int i=0;i<count;i++)
	{   
		in[i]="";

    	for(int j=i*n;j<=i*n+n-2;j=j+2)
		{
	       in[i]=in[i]+st.GetAt(j)+st.GetAt(j+1);
	        out.Delete(0,2);
	  	}
		
		
		  
	}
			
	in[count]=out;

    for(i=0;i<=count;i++)
	pDC->TextOut(m_pNote_point.x,m_pNote_point.y+2*h*i,in[i]);
	}
	

	

}

void CDataShow::SetNoteText(CString note)
{
	m_sNote_text=note;	

}

void CDataShow::SetNotePoint()
{
	double x,y;
	x=m_dataRect.right-m_dataRect.Width()/2.5;
	y=m_dataRect.top+8*h;
	m_pNote_point.x=x;
	m_pNote_point.y=y;

}

void CDataShow::SetNoteWordOn(bool IsOn)
{
	m_IsNoteOn=IsOn;

}

void CDataShow::SetNoteColor(COLORREF C)
{
	m_color_note=C;

}

CString CDataShow::GetTimeFormat()
{

	CTime t;
	t=CTime::GetCurrentTime();
	CString y,mo,h,m,s;
	int x;
	x=t.GetHour();
	
	h.Format("%d",t.GetHour());
	if (x<10)
	{
		h="0"+h;
	}
	m.Format("%d",t.GetMinute());
	if (t.GetMinute()<10)
	{
		m="0"+m;
	}
	s.Format("%d",t.GetSecond());
	if (t.GetSecond()<10)
	{
		s="0"+s;
	}
	y.Format("%d",t.GetYear());
	mo.Format("%d",t.GetMonth());
	if (t.GetMonth()<10)
	{
		mo="0"+mo;
	}

	return y+"-"+mo+"-"+h+":"+m+":"+s;

}

void CDataShow::SetTimeTextColor(COLORREF C)
{

	m_time_color=C;

}

void CDataShow::SetTimeShow(bool IsShow)
{
	m_IsTimeShow=IsShow;

}