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

📄 datashow.cpp

📁 介绍一个动态数据显示类平时写程序时经常需要示波器显示数据。但是好的控件不是免费的。由于程序的需要
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// DataShow.cpp : implementation file
//
/************************************************************************/
/* 数据显示类:
   作者:南京航空航天大学能源与动力学院 庄三少
                                   2009年1月11日  
   Email:viualsan@yahoo.cn
     tel:13512524413 
   说明:
      本类无任何限制,可自由改动传播。只需附上该段说明。                                                                  */
/************************************************************************/
#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);

⌨️ 快捷键说明

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