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

📄 datashow.cpp

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

⌨️ 快捷键说明

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