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

📄 statistic_view.cpp

📁 一个开源的心电图测量仪驱动和应用软件,可记录
💻 CPP
字号:
// ECG_Statistic_View1.cpp: implementation of the ECG_Statistic_View class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Statistic_View.h"
#include "Person.h"
#include "Ecg_Info.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

Statistic_View::Statistic_View()
{

}

Statistic_View::~Statistic_View()
{

}
void Statistic_View::SetEcgDrawRect(CDC* pDC,CRect rDrawRect,int from,int to)
{
	//Before using this code you must specify
	//in your app the CRect&CClientDC
	//then pass them as parameters
	//in function SetEcgDrawrect
	///////////
/*	CRect rcClient;
	GetClientRect(rcClient);
	CClientDC dc(this);
*/	///////////
	dy = 25;
	//Set the rect for drawing
	m_rDrawRect = rDrawRect;
	//Get CDC pointer
	DC = pDC;
	i_from = from;
	i_to = to;
	Draw(1);
}

void Statistic_View::Draw(int d)
{
	int dx=0;
	if(d==-2)
		dx=65;
//	int DY = 100;
	//in to this class
	CBitmap Bitmap;
	CBitmap* pbmOld = NULL;//Pointer to the CBitmap object
	CDC dcMem;
	CRect BmpRect;
	BmpRect.SetRect(0,0,500*d,255*d);
	dcMem.CreateCompatibleDC(DC);//Greate painting object
	Bitmap.CreateCompatibleBitmap(DC,BmpRect.Width(),BmpRect.Height());
	//In to DCMem is getting the object bitmap
	pbmOld = dcMem.SelectObject(&Bitmap);
	//Creates the bitmap rectangle

	dcMem.PatBlt(0,0,500,255,WHITENESS);
	DrawGrid(&dcMem,BmpRect,1);
	DrawEcg(&dcMem,BmpRect,1);
	DrawFromTo(&dcMem,1);
	DrawText(&dcMem,1);

	//Shows the bitmap on the dlg screen dY=100
	DC->BitBlt(m_rDrawRect.left,m_rDrawRect.top,m_rDrawRect.right,
		m_rDrawRect.bottom,&dcMem,0,0,SRCCOPY);
	dcMem.SelectObject(pbmOld);
	dcMem.DeleteDC();

}

void Statistic_View::SetArr(double *QRS_COUNTsrc,double *PWTsrc,int lenght)
{
	if(lenght>2500)
		lenght = 2500;
	//Copy the info from pointer*source to ECG array
	for(int i=0;i<lenght;i++)
	{
		//Attencion *(ar+i)!!!
		///2 because bitmap is only 200 point height and must represent
		//up to 400 pulse and up to 400Wt power
		QRS_COUNT[i] = float(*(QRS_COUNTsrc+i)/2);
		PWT[i] = float(*(PWTsrc+i)/2);
	}

}

void Statistic_View::DrawGrid(CDC *pDC,CRect rRect,int d)
{
	int dx=0;
	if(d==-2)
	{
		dx=255;
	}
	CPen lpenR(PS_SOLID,1,RGB(180,220,180));//Select color green
	CPen* pOldpen = pDC->SelectObject(&lpenR);
	pDC->SelectObject(&lpenR);

	//draw lines horizontal
	for(int i=0;i<(200+dy)*d;i=i+25*d)
	{
		pDC->MoveTo(dx+rRect.left,i+dy+dx/2);
		pDC->LineTo(dx+rRect.right,i+dy+dx/2);
	}
	//draw vertical lines each one is equal to 1 min
	for(i=0;i<(500+dx)*d;i=i+(120)*d)
	{
		pDC->MoveTo(i+130,rRect.top+dy+dx/2);
		pDC->LineTo(i+130,rRect.bottom-dy-3-dx/2);
	}
	
	pDC->SelectObject(pOldpen);
	
	///////////////////////////////
	//printing bitmap
	for(i=0;i<10;i++)
	{
		pDC->MoveTo(255,-(100*i));
		pDC->LineTo(255+1500,-(100*i));
	}
	for(i=0;i<5;i++)
	{
		pDC->MoveTo(255+i*370,-100);
		pDC->LineTo(255+i*370,-900);
	}
	
}

void Statistic_View::DrawEcg(CDC *pDC, CRect rRect,int d)
{
		int dx=0;
	if(d==-2)
		dx=65;
/*	int i=0;
	int di=0;
	for(i=0;i<500;i++)
	{
		di = i*5;
		if(di<i_from)
		{
			pDC->MoveTo(i,30 - int(QRS_COUNT[di]));
			pDC->LineTo(i+1,30 - int(QRS_COUNT[di+5]));
		}
		if(di>i_from)
		{
			CPen lpenR(PS_SOLID,1,RGB(255,0,0));//Select color green
			CPen* pOldpen = pDC->SelectObject(&lpenR);
			pDC->SelectObject(&lpenR);
			pDC->MoveTo(i,30 - int(QRS_COUNT[di]));
			pDC->LineTo(i+1,30 - int(QRS_COUNT[di+5]));
			pDC->SelectObject(pOldpen);
		}
		if(di>i_to)
		{
	//		CPen lpenR(PS_SOLID,1,RGB(0,255,0));//Select color green
	//		CPen* pOldpen = pDC->SelectObject(&lpenR);
	//		pDC->SelectObject(&lpenR);
			pDC->MoveTo(i,30 - int(QRS_COUNT[di]));
			pDC->LineTo(i+1,30 - int(QRS_COUNT[di+5]));

	//		pDC->SelectObject(pOldpen);
		}		
	}	*/	
}

void Statistic_View::SetInfo(CString s_info)
{
	s_BmpInfo = s_info;
}

void Statistic_View::DrawText(CDC *pDC,int d)
{
	int dx=0;
	int d1=1;
	int d2=1;
	if(d==-2)
	{
		d=-4;
		dx=255;
		d1=8;
		d2=4;
	}
	CString str;
	CFont Font;
	Font.CreateFont(4*d1,4*d2,0,0,FW_DONTCARE,FALSE,FALSE,0,
		DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,
		CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH|FF_DONTCARE,
		"MS Sans Serif");
	CFont* pOldFont = pDC->SelectObject(&Font);
	//Output the info string
	pDC->TextOut(2+dx,240*d,s_BmpInfo);
	//Output the hart rate 0-50...400beet/min
	dx=dx*5;
	for(int i=0;i<=200;i=i+25)
	{
		str.Format("%d",i*2);
		pDC->TextOut(476+dx,d*(200+dy-i-6),str);
	}
	for(i=0;i<5;i++)
	{
		str.Format("%d min",i*60);
		pDC->TextOut(i*120-i*8+dx*d,1*d,str);
		pDC->TextOut(255+350*i,-50,str);
	}
	//return the old font
	pDC->SelectObject(pOldFont);
}

void Statistic_View::DrawFromTo(CDC *pDC,int d)
{
	int dx=0;
	if(d==-2)
		dx=65;
	//draws the spesific array from position to position
	if(i_to>2500)
		i_to=2500;
	int i=0;
	for(i=i_from;i<i_to;i++)
	{
		pDC->MoveTo(d*(i*2-i_from+dx),d*(200+dy - int(QRS_COUNT[i])));
		pDC->LineTo(d*(i*2+1-i_from+dx),d*(200+dy - int(QRS_COUNT[i+1])));
	}
	//
	CPen lpenR(PS_SOLID,1,RGB(255,0,0));//Select color green
	CPen* pOldpen = pDC->SelectObject(&lpenR);
	pDC->SelectObject(&lpenR);
	for(i=i_from;i<i_to;i++)
	{
		pDC->MoveTo(d*(i*2-i_from+dx),d*(200+dy - int(PWT[i])));
		pDC->LineTo(d*(i*2+1-i_from+dx),d*(200+dy - int(PWT[i+1])));
	}
	pDC->SelectObject(pOldpen);

	//
	//Print
	for(i=0;i<2500-1;i++)
	{
		pDC->MoveTo(255+i*6,-900+PWT[i]*4);
		pDC->LineTo(255+i*6+6,-900+PWT[i+1]*4);
	}
	for(i=0;i<2500-1;i++)
	{
		pDC->MoveTo(255+i*6,-900+QRS_COUNT[i]*4);
		pDC->LineTo(255+i*6+6,-900+QRS_COUNT[i+1]*4);
	}
}

void Statistic_View::PrintBMP(CPerson* lpperson,CEcg_Info* einfo)
{
	//Problem with device pDC
	//Do not know how to enlarge the picture
	CPrintDialog dlgPrint(FALSE,PD_ALLPAGES,NULL);
	if(dlgPrint.DoModal()==IDOK)
	{
		CDC dcPrint;
		dcPrint.Attach(dlgPrint.GetPrinterDC());
		DOCINFO PrintJob;
		PrintJob.cbSize = sizeof(PrintJob);
		PrintJob.lpszDocName = "BMP printing";
		PrintJob.lpszOutput = NULL;
		PrintJob.lpszDatatype = NULL;
		PrintJob.fwType = NULL;

		dcPrint.SetMapMode(MM_LOMETRIC);
		if(dcPrint.StartDoc(&PrintJob)>=0)
		{
			int k=-2;
			CRect BmpRect;
			//enlarge width from 500->1000
			BmpRect.SetRect(0,0,500*2,255*2);
			dcPrint.StartPage();
			//Draw ECG information
			DrawGrid(&dcPrint,BmpRect,-2);
			DrawEcg(&dcPrint,BmpRect,-2);
//			DrawQRS(&dcPrint);
			DrawFromTo(&dcPrint,-2);
			DrawText(&dcPrint,-2);

			//Draw person info
			int y = DrawPersonalInfo(&dcPrint,255,-1200,lpperson);
			//Draw ECG_Info
			DrawECGInformation(&dcPrint,255,y,einfo);
			
			
			dcPrint.EndPage();
			dcPrint.EndDoc();
		}
		
		dcPrint.DeleteDC();
	}

}

int Statistic_View::DrawPersonalInfo(CDC *pDC, int x, int y,CPerson* lpperson)
{
	//Print current time
	COleDateTime curtime;
	curtime = COleDateTime::GetCurrentTime();
	y = y-40;
	pDC->TextOut(x,y,"   Printed date: "+
				curtime.Format("%dd.%mm.%Yy - %Xh"));
	//print the person information
	//Print EGN 
	y = y-80;
	pDC->TextOut(x,y,"                 Personal Info");
	y = y-45;
	pDC->TextOut(x,y,"            EGN: "+lpperson->sEGN);
	//Print birthdate
	y = y-40;
	//Format age etring
	CString sage;
	sage.Format(" - %dy.",curtime.GetYear()-lpperson->Birth_Date.GetYear());
	pDC->TextOut(x,y,"      birthdate: "+lpperson->Birth_Date.Format("%dd.%mm.%Yy")+
		sage);
	//Print name
	y =y-40;
	pDC->TextOut(x,y,"           name: "+lpperson->sName_1+" "+
		lpperson->sName_2+" "+lpperson->sName_3);
	//Print sex
	y = y-40;
	pDC->TextOut(x,y,"            sex: "+lpperson->Sex);
	//Print address
	y = y-40;
	pDC->TextOut(x,y,"        address: "+lpperson->sAddress);
	//Print phone
	y = y-40;
	pDC->TextOut(x,y,"          phone: "+lpperson->sPhone);
	return y;
}

int Statistic_View::DrawECGInformation(CDC *pDC, int x, int y, CEcg_Info *einfo)
{
	//Print ecg statistical info
		CString mean,dev,max,min;
		//Printed heart rate mean dev max min
		mean.Format("%d",einfo->HeartRate.iMean);
		dev.Format("%d",einfo->HeartRate.iDev);
		max.Format("%d",einfo->HeartRate.iMax);
		min.Format("%d",einfo->HeartRate.iMin);

		y = y-80;
		//Print velo test begin and date and time
		pDC->TextOut(x,y,"          Velo Test ECG Info - Date & Time ... "+
			einfo->velo_test_date.Format("%dd.%mm.%Yy"));

		y = y-60;
		pDC->TextOut(x,y,"              Pulse-rate/min:"+mean+
			" (+-"+dev+") ... max:"+max+" min:"+min);
		//Printed QRS_ms mean dev max min
		mean.Format("%d",einfo->QRS_ms.iMean);
		dev.Format("%d",einfo->QRS_ms.iDev);
		max.Format("%d",einfo->QRS_ms.iMax);
		min.Format("%d",einfo->QRS_ms.iMin);

		y = y-40;
		pDC->TextOut(x,y,"        QRS/ms interval mean:"+mean+
			" (+-"+dev+") ... max:"+max+" min:"+min);
		//Printed PR_ms mean dev max min
		mean.Format("%d",einfo->PR_ms.iMean);
		dev.Format("%d",einfo->PR_ms.iDev);
		max.Format("%d",einfo->PR_ms.iMax);
		min.Format("%d",einfo->PR_ms.iMin);

		y = y-40;
		pDC->TextOut(x,y,"        PR/ms  interval mean:"+mean+
			" (+-"+dev+") ... max:"+max+" min:"+min);
		//Printed QT_QTc_ms rate mean dev max min
		mean.Format("%d",einfo->QT_QTc_ms.iMean);
		dev.Format("%d",einfo->QT_QTc_ms.iDev);
		max.Format("%d",einfo->QT_QTc_ms.iMax);
		min.Format("%d",einfo->QT_QTc_ms.iMin);

		y = y-40;
		pDC->TextOut(x,y,"     QT_QTc/ms interval mean:"+mean+
			" (+-"+dev+") ... max:"+max+" min:"+min);

		//Printed Blood preasure info
		mean.Format("%d",einfo->BloodPreasure.iMean);
		dev.Format("%d",einfo->BloodPreasure.iDev);
		max.Format("%d",einfo->BloodPreasure.iMax);
		min.Format("%d",einfo->BloodPreasure.iMin);

		y = y-40;
		pDC->TextOut(x,y,"          BloodPreasure mean:"+mean+
			" (+-"+dev+") ... max:"+max+" min:"+min);

		//Printed power PWt info
		mean.Format("%d",einfo->Pwt.iMean);
		dev.Format("%d",einfo->Pwt.iDev);
		max.Format("%d",einfo->Pwt.iMax);
		min.Format("%d",einfo->Pwt.iMin);

		y = y-40;
		pDC->TextOut(x,y,"                    Pwt mean:"+mean+
			" (+-"+dev+") ... max:"+max+" min:"+min);

		//Printed power temperature info
		mean.Format("%d",einfo->Temperature.iMean);
		dev.Format("%d",einfo->Temperature.iDev);
		max.Format("%d",einfo->Temperature.iMax);
		min.Format("%d",einfo->Temperature.iMin);

		y = y-40;
		pDC->TextOut(x,y,"            Temperature mean:"+mean+
			" (+-"+dev+") ... max:"+max+" min:"+min);
		y = y-45;
		//Print information about confirmation of the raport
		pDC->TextOut(x,y,"              report confirm:"+
			einfo->Confirm_By);

		return y;
}

⌨️ 快捷键说明

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