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

📄 datashow.cpp

📁 介绍一个动态数据显示类平时写程序时经常需要示波器显示数据。但是好的控件不是免费的。由于程序的需要
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	{
		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;

}

⌨️ 快捷键说明

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