gusucode.com > 一个用于远场涡流检测的数据采集系统的界面编程 > 一个用于远场涡流检测的数据采集系统的界面编程/vc/pulseeddyView.cpp
// pulseeddyView.cpp : implementation of the CPulseeddyView class // #include "stdafx.h" #include "pulseeddy.h" #include "math.h" #include "C:\Art\PCI2000\INCLUDE\PCI2000.H" #include "pulseeddySet.h" #include "pulseeddyDoc.h" #include "pulseeddyView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif HANDLE hEvent; HANDLE hFileObject; #define MAX_SEGMENT 32 #define Pi 3.14 int m=0; int km; int zerotime1; int jj=0; int ggd; int waveflag; float avemax1,avemax2,avemax3,avemax4,avemax5,avemax6,avemax7,avemax8; int perx,pery; int maxduan; int maxdian; int zijie; int MB; int m_Height; int m_Width; float maxzhi1; float yuanzhi; float maxzhi=0; int SAMPLEDIAN=2048; WORD InUserRegion[MAX_SEGMENT][2048]; // 缓冲队列 CString strNewFileName; float InUser[4096]; float InUser1[2048]; float Real[2048]; float Imag[2048]; int CurrentIndex; // AD数据处理线程当前缓冲区索引号 int CurrentIndex1=0; int ReadIndex; // AD数据采集线程当前缓冲区索引号 int SegmentCounts; // 记录共有多少段缓冲区没有来得及处 PCI2000_PARA_AD Para; float max1=0; float m1; float FuZhi[1024]; UINT ReadThread(PVOID hWnd);//数据线程 UINT DrawWindowProc(PVOID hWnd); ///////////////////////////////////////////////////////////////////////////// // CPulseeddyView IMPLEMENT_DYNCREATE(CPulseeddyView, CRecordView) BEGIN_MESSAGE_MAP(CPulseeddyView, CRecordView) //{{AFX_MSG_MAP(CPulseeddyView) ON_BN_CLICKED(IDC_BEGSAM, OnBegsam) ON_BN_CLICKED(IDC_STOPSAM, OnStopsam) ON_BN_CLICKED(IDC_TIMEBO, OnTimebo) ON_BN_CLICKED(IDC_TEPIN, OnTepin) ON_BN_CLICKED(IDC_MAXVAL, OnMaxval) ON_BN_CLICKED(IDC_MAXVALTIME, OnMaxvaltime) ON_BN_CLICKED(IDC_ZEROTIME, OnZerotime) ON_BN_CLICKED(IDC_PINPUTU, OnPinputu) ON_BN_CLICKED(IDC_CUNPAN, OnCunpan) ON_BN_CLICKED(IDC_PHASETU, OnPhasetu) ON_WM_TIMER() ON_WM_PAINT() ON_BN_CLICKED(IDC_STOPWAVE, OnStopwave) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPulseeddyView construction/destruction CPulseeddyView::CPulseeddyView() : CRecordView(CPulseeddyView::IDD) { //{{AFX_DATA_INIT(CPulseeddyView) m_pSet = NULL; m_shutongdao = 1; m_motongdao = 1; m_pinlv = 100000; m_zengyi = 1; //}}AFX_DATA_INIT // TODO: add construction code here } CPulseeddyView::~CPulseeddyView() { } void CPulseeddyView::DoDataExchange(CDataExchange* pDX) { CRecordView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPulseeddyView) DDX_Control(pDX, IDC_EDIT5, m_ctrlPicture); //DDX_Control(pDX, IDC_LIST1, m_shuzixianshi); DDX_Text(pDX, IDC_EDIT1, m_shutongdao); DDX_Text(pDX, IDC_EDIT2, m_motongdao); DDX_Text(pDX, IDC_EDIT3, m_pinlv); DDX_Text(pDX, IDC_EDIT4, m_zengyi); //}}AFX_DATA_MAP } BOOL CPulseeddyView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CRecordView::PreCreateWindow(cs); } void CPulseeddyView::OnInitialUpdate() { m_pSet = &GetDocument()->m_pulseeddySet; CRecordView::OnInitialUpdate(); GetParentFrame()->RecalcLayout(); ResizeParentToFit(); m_bFirstCreateDeviceFile=TRUE; // 一开始,为第一次创建文件对象 } ///////////////////////////////////////////////////////////////////////////// // CPulseeddyView printing BOOL CPulseeddyView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CPulseeddyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CPulseeddyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CPulseeddyView diagnostics #ifdef _DEBUG void CPulseeddyView::AssertValid() const { CRecordView::AssertValid(); } void CPulseeddyView::Dump(CDumpContext& dc) const { CRecordView::Dump(dc); } CPulseeddyDoc* CPulseeddyView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPulseeddyDoc))); return (CPulseeddyDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CPulseeddyView database support CRecordset* CPulseeddyView::OnGetRecordset() { return m_pSet; } ///////////////////////////////////////////////////////////////////////////// // CPulseeddyView message handlers void CPulseeddyView::OnBegsam() { // TODO: Add your control notification handler code here CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp(); m_ReadThread=AfxBeginThread(ReadThread,NULL, THREAD_PRIORITY_ABOVE_NORMAL, 0, CREATE_SUSPENDED); m_ReadThread->m_bAutoDelete=false; m_DrawWindowThread=AfxBeginThread(DrawWindowProc,NULL, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); m_DrawWindowThread->m_bAutoDelete=false; hEvent = PCI2000_CreateSystemEvent(); UpdateData(TRUE); int DeviceID = 0; PCI2000_PARA_AD Para; bDeviceRun=1; app->k_run1=1; km=0; ggd=0; app->kb=0; MB=0; Para.FirstChannel = m_shutongdao; Para.LastChannel =m_motongdao; Para.Frequence = m_pinlv; Para.Gains = m_zengyi; Para.TriggerMode = PCI2000_IN_TRIGGER; hDevice =PCI2000_CreateDevice(DeviceID); if(hDevice==INVALID_HANDLE_VALUE) { MessageBox("创建设备对象失败...","提醒您...", MB_ICONSTOP); } CString RootDir; TCHAR exeFullPath[MAX_PATH] ; GetModuleFileName(NULL,exeFullPath,MAX_PATH); RootDir=(const char*)exeFullPath; CString sPath; int nPos; nPos=RootDir.ReverseFind ('\\'); sPath=RootDir.Left (nPos); strNewFileName=sPath+_T("\\Data.txt"); CProgressCtrl* pMB=(CProgressCtrl*)(GetDlgItem(IDC_PROGRESS2_MB)); CProgressCtrl* pKB=(CProgressCtrl*)(GetDlgItem(IDC_PROGRESS1_KB)); CEdit* pWroteMB=(CEdit*)(GetDlgItem(IDC_MB)); CEdit* pWroteKB=(CEdit*)(GetDlgItem(IDC_KB)); ULONG DiskFreeBytes=PCI2000_GetDiskFreeBytes(strNewFileName.Left(3)); ULONG m_RemainMB=(ULONG)(DiskFreeBytes/(1024*1024*2)); CString str; if(m_RemainMB<2) { MessageBox("硬盘剩余空间不足2M,存盘操作不能进行...","提醒您...",MB_ICONSTOP); return; } pMB->SetRange32(0,10); pMB->SetPos(0); pKB->SetRange(0,512); pKB->SetPos(0); pWroteMB->SetWindowText("0"); pWroteKB->SetWindowText("0"); if(!m_bFirstCreateDeviceFile) { if(!PCI2000_ReleaseFile(hFileObject)) { MessageBox("释放文件对象失败...","提醒您...",MB_ICONSTOP); } } hFileObject = PCI2000_CreateFileObject(hDevice, strNewFileName, PCI2000_modeCreate|PCI2000_modeWrite); // 创建文件对象 app->k_hFileObject=hFileObject; if(hFileObject == INVALID_HANDLE_VALUE) { MessageBox("创建文件对象失败...","提醒您...",MB_ICONSTOP); } m_bFirstCreateDeviceFile=FALSE; if(!PCI2000_InitDeviceProAD(hDevice, &Para)) { MessageBox("不明确的初始化错误...","提醒您..."); } app->k_hDevice=hDevice; app->k_run=1; BOOL bDeviceRun=TRUE; ULONG LinearAddr, PhysAddr; if(!PCI2000_GetDeviceAddr(hDevice, &LinearAddr,&PhysAddr,0)) { AfxMessageBox("baibai"); } PCI2000_WriteRegisterULong(hDevice, LinearAddr,0x290,0x0000); m_ReadThread->ResumeThread(); m_DrawWindowThread->ResumeThread(); SetTimer(1,10,NULL); } UINT ReadThread(PVOID hWnd) { int DeviceID = 0; HANDLE hDevice; HANDLE hFileObject; CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp(); hDevice=app->k_hDevice; ReadIndex = 0; SegmentCounts = 0; int bDeviceRun; while(app->k_run) { long PerLsbVolt; PerLsbVolt =10000.0/4096; bDeviceRun=app->k_run; while(TRUE) { if(PCI2000_GetDevStatusAD_Half(hDevice)) { break; } else { Sleep(1); } } if(!PCI2000_ReadDeviceProAD_Half(hDevice, InUserRegion[ReadIndex], SAMPLEDIAN))//2048// // 从设备上读取8192个字的数据 { AfxMessageBox("读数据出错..."); return FALSE; } SetEvent(hEvent); ReadIndex++; if(ReadIndex==MAX_SEGMENT) { ReadIndex=0; } SegmentCounts++; } if(!PCI2000_ReleaseDeviceProAD(hDevice)) { AfxMessageBox("释放AD部件失败"); } if(!PCI2000_ReleaseDevice(hDevice)) { AfxMessageBox("关闭设备失败..."); } AfxMessageBox("数据采集完毕,可以分析处理!"); return 1; } UINT DrawWindowProc(PVOID hWnd) { CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp(); int i, j; int h=0; CurrentIndex=0; HANDLE hDevice; HANDLE hFileObject; hDevice=app->k_hDevice; hFileObject=app->k_hFileObject; while(app->k_run) { WaitForSingleObject(hEvent, INFINITE); j=SegmentCounts; for(i=0; i<j; i++) { PCI2000_WriteFile(hFileObject, InUserRegion[CurrentIndex],4096); CurrentIndex++; h++; app->zijie=h; app->kb++; if(CurrentIndex==MAX_SEGMENT) { CurrentIndex=0; } } SegmentCounts=SegmentCounts-j; if(SegmentCounts<0) SegmentCounts=0; } return TRUE; } void CPulseeddyView::OnStopsam() { // TODO: Add your control notification handler code here CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp(); app->k_run=0; app->k_stop1=2; KillTimer(1); } void CPulseeddyView::OnTimebo() { // TODO: Add your control notification handler code here SetTimer(2,50,NULL); km=0; yuanzhi=0; waveflag=1; } void CPulseeddyView::OnStopwave() { // TODO: Add your control notification handler code here KillTimer(2); } void CPulseeddyView::OnTepin() { // TODO: Add your control notification handler code here int N=SAMPLEDIAN; float PerLsbVolt =10000.0/4096; int a1=0; /////////////////////// m_pSet->MoveFirst(); CString nn; for(int b=0;b<SAMPLEDIAN/2;b++) { Real[b]=m_pSet->m_IData; Imag[b]=0; m_pSet->MoveNext(); } /////////////////////// //**倒序 int Lh=N/2; int j=Lh,N1=N-2; for(int i=1;i<=N1;i++) { if(i<j)//**交换数据,包括实部和虚部 { float a1,a2; a1=Real[i]; a2=Imag[i]; Real[i]=Real[j]; Imag[i]=Imag[j]; Real[j]=a1; Imag[j]=a2; } int t; t=Lh; while(j>=t)//**求解倒序值 { j=j-t; t/=2; } j+=t; } //**FFT变换 int B; int M; if(SAMPLEDIAN/2==1024) M=10; else if(SAMPLEDIAN/2==2048) M=11; else if(SAMPLEDIAN/2==4096) M=12; else if(SAMPLEDIAN/2==8192) M=13; int m_H; for(int L=1;L<=M;L++)//**循环M次 { B=(int)pow(2,L-1); for(int J=0;J<=B-1;J++)//**旋转因子的个数对应蝶形运算 { int P; P=(int)pow(2,M-L)*J;//**旋转因子指数的计算 for(int k=J;k<N-1;k+=(int)pow(2,L)) { float WReal,WImag; float c,s,arg; int k2; k2=k+B;//**蝶形的第二个坐标 arg=(float)(2*Pi*P)/N; c=(float)cos(arg); s=(float)sin(arg); WReal=Real[k2]*c-Imag[k2]*s; WImag=Imag[k2]*c+Real[k2]*s; //**实现同址运算 Real[k2]=Real[k]-WReal; Imag[k2]=Imag[k]-WImag; Real[k]=Real[k]+WReal; Imag[k]=Imag[k]+WImag; } } } ///////////////////////////////////// for( i=0;i<SAMPLEDIAN/2;i++) FuZhi[i]=0; for(int k=0;k<SAMPLEDIAN/2;k++) { FuZhi[k]=(float)sqrt(Real[k]*Real[k]+Imag[k]*Imag[k]); float nn=FuZhi[k]; if(max1<=nn) { max1=nn; m_H=k; } } float h; h=2*(m_H/SAMPLEDIAN)*m_pinlv; m_H=m_H*10; char str[500]; CString string; sprintf(str, "特征频率点的时间为:%dus 特征频率为:%fhz ",m_H,h); string=string+str; MessageBox(string,"提醒您..."); } void CPulseeddyView::OnMaxval() { CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp(); m_pSet->MoveFirst(); float maxval=0; for(int b=0;b<app->zijie;b++) { if(maxval<(m_pSet->m_RData)) { maxval=m_pSet->m_RData; maxduan=b; } m_pSet->MoveNext(); } char str[500]; CString string; sprintf(str, "磁场垂直分量的最大值为:%fmv ",maxval ); string=string+str; MessageBox(string,"提醒您..."); } void CPulseeddyView::OnMaxvaltime() { // TODO: Add your control notification handler code here m_File.Open(strNewFileName, PCI2000_modeRead); int dian=maxduan*4096; m_File.Seek(dian,CFile::begin); m_File.Read(m_InUserRegion,2048*2); float PerLsbVolt; PerLsbVolt =10000.0/4096; for(int b1=0;b1<SAMPLEDIAN;b1++) { float c1= ((m_InUserRegion[b1]&0x0FFF)*PerLsbVolt-5000);//0x800 InUser[b1]=c1; } float maxvalue=0; for(int j=0;j<2048;j++) { if(maxvalue<=InUser[j]) { maxvalue=InUser[j]; maxdian=j; } else maxvalue=maxvalue; } for(int k=(maxdian-30);k<maxdian;k++) { if(abs(InUser[k+1]-InUser[k])>=20) { zerotime1=k; break; } } int zhi=(maxdian-zerotime1)*10; m_File.Close(); char str[500]; CString string; sprintf(str, "最大值出现的时间为:%dus ",zhi); string=string+str; MessageBox(string,"提醒您..."); } void CPulseeddyView::OnZerotime() { // TODO: Add your control notification handler code here int zerotime2=0; int zerotime; for(int k=maxdian;k<SAMPLEDIAN;k++) { if(InUser[k]<=0) { zerotime2=k; break; } } zerotime=(zerotime2-zerotime1)*10; char str[500]; sprintf(str, "过零点的时间为:%dus",zerotime); MessageBox(str,"提醒您..."); } void CPulseeddyView::OnPinputu() { // TODO: Add your control notification handler code here float PerLsbVolt = 10000/4096; static CPoint pointxy[32][2048]; int ChannelCount=1; int Center=100; CDC* pDC=m_ctrlPicture.GetDC(); CRect ClientRect; m_ctrlPicture.GetClientRect(&ClientRect); CBrush brwhite(RGB(255,255,255)); CBrush*poldbrush=NULL; poldbrush=pDC->SelectObject(&brwhite); pDC->Rectangle(ClientRect); pDC->SelectObject(poldbrush); CPen penred(PS_SOLID,1,RGB(255,0,0)); CPen*poldpen=NULL; poldpen= pDC->SelectObject(&penred); //////////////////////////////////////// //画坐标轴 //x轴 pDC->MoveTo(0,100); pDC->LineTo(ClientRect.Width()+1,100); pDC->LineTo(ClientRect.Width()-5,105); pDC->MoveTo(ClientRect.Width()+1,100); pDC->LineTo(ClientRect.Width()-5,95); pDC->SetTextColor(RGB(255,0,0)); pDC->TextOut(2,105,"0"); pDC->TextOut(ClientRect.Width()-30,105,"频率"); //Y轴 pDC->MoveTo(0,105); pDC->LineTo(0,0); pDC->LineTo(5,5); pDC->MoveTo(0,0); pDC->MoveTo(0,5); pDC->TextOut(5,5,"幅值"); pDC->TextOut(250,150,"频谱图"); //////////////////////////////////////// int k=0; for(int j=0; j<ChannelCount; j++) { int x=ClientRect.left; pointxy[j][0].x=ClientRect.left; pointxy[j][0].y=(int)(Center-80*(FuZhi[k]/max1)); for(int i=1; i<=ClientRect.Width(); i++) { pointxy[j][i].x=x+i; int nn=(int)(SAMPLEDIAN/ClientRect.Width()); if(nn>=1) k=k+nn; else k=k+1; pointxy[j][i].y=(int)(Center-80*(FuZhi[k]/max1)); } pDC->Polyline(pointxy[j], ClientRect.Width()+1); } pDC->SelectObject(poldpen); } void CPulseeddyView::OnPhasetu() { // TODO: Add your control notification handler code here float PerLsbVolt = 10000/4096; static CPoint pointxy[32][2048]; int ChannelCount=1; int Center=100; CDC* pDC=m_ctrlPicture.GetDC(); CRect ClientRect; m_ctrlPicture.GetClientRect(&ClientRect); CBrush brwhite(RGB(255,255,255)); CBrush*poldbrush=NULL; poldbrush=pDC->SelectObject(&brwhite); pDC->Rectangle(ClientRect); pDC->SelectObject(poldbrush); CPen penred(PS_SOLID,1,RGB(255,0,0)); CPen*poldpen=NULL; poldpen= pDC->SelectObject(&penred); //////////////////////////////////////// //画坐标轴 //x轴 pDC->MoveTo(0,100); pDC->LineTo(ClientRect.Width()+1,100); pDC->LineTo(ClientRect.Width()-5,105); pDC->MoveTo(ClientRect.Width()+1,100); pDC->LineTo(ClientRect.Width()-5,95); pDC->SetTextColor(RGB(255,0,0)); pDC->TextOut(2,105,"0"); pDC->TextOut(ClientRect.Width()-30,105,"时间"); //Y轴 pDC->MoveTo(0,105); pDC->LineTo(0,0); pDC->LineTo(5,5); pDC->MoveTo(0,0); pDC->MoveTo(0,5); pDC->TextOut(5,5,"相位"); pDC->TextOut(250,150,"相位图"); //////////////////////////////////////// float phase[2048],max=0; for(int i=0;i<SAMPLEDIAN;i++) phase[i]=0; for(int k=0;k<SAMPLEDIAN;k++) { phase[k]=atan(Imag[k]/Real[k]); if(Real[k]>=0&&Imag[k]>=0) { } if(Real[k]>0&&Imag[k]<0) { } if(Real[k]<0&&Imag[k]<0) { phase[k]=phase[k]-3.1416; } if(Real[k]<0&&Imag[k]>0) { phase[k]=phase[k]+3.1416; } if(max<phase[k]) { max=phase[k]; } } ///////////////////////////////// k=0; for(int j=0; j<ChannelCount; j++) { int x=ClientRect.left; pointxy[j][0].x=ClientRect.left; pointxy[j][0].y=(int)(Center-80*(phase[k]/max)); for(int i=1; i<=ClientRect.Width(); i++) { pointxy[j][i].x=x+i; int nn=(int)(SAMPLEDIAN/ClientRect.Width()); if(nn>=1) k=k+nn; else k=k+1; pointxy[j][i].y=(int)(Center-80*(phase[k]/max)); } pDC->Polyline(pointxy[j], ClientRect.Width()+1); } pDC->SelectObject(poldpen); CurrentIndex1++; if(CurrentIndex1==MAX_SEGMENT) CurrentIndex1=0; } void CPulseeddyView::OnCunpan() { // TODO: Add your control notification handler code here CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp(); int kk; if(!m_bFirstCreateDeviceFile) { if(!PCI2000_ReleaseFile(hFileObject)) { MessageBox("关闭文件失败","提醒您..."); } else m_bFirstCreateDeviceFile=TRUE; } for(int k=0;k<app->zijie;k++) { kk=4096*m; if(kk==0) { m_File.Open(strNewFileName, PCI2000_modeRead); m_pSet->MoveFirst(); while( !m_pSet->IsEOF()) { m_pSet->Delete(); m_pSet->MoveNext(); } m_pSet->MoveFirst(); } m_File.Seek(kk,CFile::begin); m_File.Read(m_InUserRegion,2048*2); //int k=0; //float f1=0; float PerLsbVolt; PerLsbVolt =10000.0/4096; for(int b1=0;b1<SAMPLEDIAN;b1++) { float c1= ((m_InUserRegion[b1]&0x0FFF)*PerLsbVolt-5000);//0x800 InUser[b1]=c1; } float maxvalue=0; for(int j=0;j<2048;j++) { if(maxvalue<=InUser[j]) maxvalue=InUser[j]; else maxvalue=maxvalue; } m_pSet->AddNew(); m_pSet->m_RData=maxvalue; m_pSet->m_ID=m; m_pSet->Update(); m_pSet->MoveNext(); m++; } m_File.Close(); /*CString sPath; int nPos; CString FileAddress,name; name=strNewFileName; nPos=name.ReverseFind ('\\'); sPath=name.Left (nPos); FileAddress=sPath+_T("\\Data1.txt"); m_pSet->MoveFirst(); for(int i=0;i<app->zijie;i++) { InUser[i]=m_pSet->m_RData; m_pSet->MoveNext(); } CFile writefile(FileAddress,CFile::modeCreate|CFile::modeWrite); for( i=0;i<1;i++) { int zz=app->zijie; writefile.Write(InUser,zz*sizeof(float)); } /////////////////////////////////////////////////////////////////////////// writefile.Close();*/ CString sPath; int nPos; CString FileAddress,name; name=strNewFileName; nPos=name.ReverseFind ('\\'); sPath=name.Left (nPos); FileAddress=sPath+_T("\\Data1.dat"); CFile writefile(FileAddress,CFile::modeCreate|CFile::modeWrite); for( int i=0;i<1;i++) { writefile.Write(InUser,2048*sizeof(float)); } writefile.Close(); MessageBox("存盘完毕!","提醒您..."); m=0; } void CPulseeddyView::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp(); float PerLsbVolt; PerLsbVolt =10000.0/4096; int Center=150; CDC* pDC=m_ctrlPicture.GetDC(); if(nIDEvent==2) { huifangwave(); } if(nIDEvent==1) { if(km==0) { yuanzhi=0; CRect ClientRect; m_ctrlPicture.GetClientRect(&ClientRect); CBrush brwhite(RGB(255,255,255)); CBrush*poldbrush=NULL; poldbrush=pDC->SelectObject(&brwhite); pDC->Rectangle(ClientRect); pDC->SelectObject(poldbrush); m_Height=ClientRect.Height(); m_Width=ClientRect.Width(); pery=(int)(m_Height/10); perx=(int)(m_Width/20); int y1=pery; int x1=perx; for(int i=0;i<10;i++) { pDC->MoveTo(0,y1); pDC->LineTo(m_Width,y1); y1+=pery; } for( i=0;i<20;i++) { pDC->MoveTo(x1,0); pDC->LineTo(x1,m_Height); x1+=perx; } Sleep(500); } for(int b1=0;b1<SAMPLEDIAN;b1++) { float c1= ((InUserRegion[CurrentIndex][b1]&0x0FFF)*PerLsbVolt-5000);//0x800 InUser1[b1]=c1; } for(int j=0;j<2048;j++) { if(maxzhi<=InUser1[j]) maxzhi=InUser1[j]; else maxzhi=maxzhi; } ggd++; if(ggd==1) avemax1=maxzhi; if(ggd==2) avemax2=maxzhi+avemax1; if(ggd==3) avemax3=maxzhi+avemax2; if(ggd==4) avemax4=maxzhi+avemax3; if(ggd==5) { avemax5=maxzhi+avemax4; } if(ggd==6) { avemax6=maxzhi+avemax5; } if(ggd==7) { avemax7=maxzhi+avemax6; } if(ggd==8) { maxzhi=(maxzhi+avemax7)/20; } if(km==0) { maxzhi1=maxzhi; } if(ggd==8) { CPen penred(PS_SOLID,1,RGB(255,0,0)); CPen*poldpen=NULL; poldpen= pDC->SelectObject(&penred); maxzhi=maxzhi-maxzhi1; float jnjn=maxzhi; pDC->MoveTo(km,150-yuanzhi); km++; pDC->LineTo(km,150-maxzhi); yuanzhi=maxzhi; maxzhi=0; ggd=0; if(km>=m_Width) km=0; pDC->SelectObject(poldpen); } jindu(); } CRecordView::OnTimer(nIDEvent); } void CPulseeddyView::OnPaint() { CPaintDC dc(this); CWnd*pWnd=GetDlgItem(IDC_EDIT5); CDC*pDC=pWnd->GetDC(); pWnd->Invalidate(); pWnd->UpdateWindow(); CRect ClientRect; m_ctrlPicture.GetClientRect(&ClientRect); m_Height=ClientRect.Height(); m_Width=ClientRect.Width(); pery=(int)(m_Height/10); perx=(int)(m_Width/20); int y1=pery; int x1=perx; for(int i=0;i<10;i++) { pDC->MoveTo(0,y1); pDC->LineTo(m_Width,y1); y1+=pery; } for( i=0;i<20;i++) { pDC->MoveTo(x1,0); pDC->LineTo(x1,m_Height); x1+=perx; } } void CPulseeddyView::jindu() { CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp(); CProgressCtrl* pMB=(CProgressCtrl*)(GetDlgItem(IDC_PROGRESS2_MB)); CProgressCtrl* pKB=(CProgressCtrl*)(GetDlgItem(IDC_PROGRESS1_KB)); CEdit* pWroteMB=(CEdit*)(GetDlgItem(IDC_MB)); CEdit* pWroteKB=(CEdit*)(GetDlgItem(IDC_KB)); CString str; if(app->kb>=512) { MB++; pMB->SetPos(MB); str.Format("%d",MB); pWroteMB->SetWindowText(str); app->kb=0; } pKB->SetPos(app->kb); str.Format("%d",app->kb); pWroteKB->SetWindowText(str); } void CPulseeddyView::huifangwave() { CPulseeddyApp *app=(CPulseeddyApp*)AfxGetApp(); CDC* pDC=m_ctrlPicture.GetDC(); if(waveflag==1&&km==0) { m_pSet->MoveFirst(); CRect ClientRect; m_ctrlPicture.GetClientRect(&ClientRect); CBrush brwhite(RGB(255,255,255)); CBrush*poldbrush=NULL; poldbrush=pDC->SelectObject(&brwhite); pDC->Rectangle(ClientRect); pDC->SelectObject(poldbrush); m_Height=ClientRect.Height(); m_Width=ClientRect.Width(); pery=(int)(m_Height/10); perx=(int)(m_Width/20); int y1=pery; int x1=perx; for(int i=0;i<10;i++) { pDC->MoveTo(0,y1); pDC->LineTo(m_Width,y1); y1+=pery; } for( i=0;i<20;i++) { pDC->MoveTo(x1,0); pDC->LineTo(x1,m_Height); x1+=perx; } } avemax1=m_pSet->m_RData; m_pSet->MoveNext(); m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); avemax2=m_pSet->m_RData; m_pSet->MoveNext(); m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); avemax3=m_pSet->m_RData; m_pSet->MoveNext(); m_pSet->MoveNext(); m_pSet->MoveNext(); m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); avemax4=m_pSet->m_RData; m_pSet->MoveNext(); m_pSet->MoveNext(); m_pSet->MoveNext(); m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); avemax5=m_pSet->m_RData; m_pSet->MoveNext(); m_pSet->MoveNext(); m_pSet->MoveNext(); m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); avemax6=m_pSet->m_RData; m_pSet->MoveNext(); m_pSet->MoveNext(); m_pSet->MoveNext(); m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); avemax7=m_pSet->m_RData; m_pSet->MoveNext(); m_pSet->MoveNext(); m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); avemax8=m_pSet->m_RData; m_pSet->MoveNext(); m_pSet->MoveNext(); m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); //m_pSet->MoveNext(); maxzhi=(avemax1+avemax2+avemax3+avemax4+avemax5+avemax6+avemax7+avemax8)/10; if(km==0) maxzhi1=maxzhi; CPen penred(PS_SOLID,1,RGB(255,0,0)); CPen*poldpen=NULL; poldpen= pDC->SelectObject(&penred); maxzhi=(maxzhi-maxzhi1)/2; float mm=maxzhi; pDC->MoveTo(km,150-yuanzhi); km++; int kk=km; pDC->LineTo(km,150-maxzhi); yuanzhi=maxzhi; maxzhi=0; pDC->SelectObject(poldpen); if(km>=m_Width) { km=0; waveflag=2; CRect ClientRect; m_ctrlPicture.GetClientRect(&ClientRect); CBrush brwhite(RGB(255,255,255)); CBrush*poldbrush=NULL; poldbrush=pDC->SelectObject(&brwhite); pDC->Rectangle(ClientRect); pDC->SelectObject(poldbrush); m_Height=ClientRect.Height(); m_Width=ClientRect.Width(); pery=(int)(m_Height/10); perx=(int)(m_Width/20); int y1=pery; int x1=perx; for(int i=0;i<10;i++) { pDC->MoveTo(0,y1); pDC->LineTo(m_Width,y1); y1+=pery; } for( i=0;i<20;i++) { pDC->MoveTo(x1,0); pDC->LineTo(x1,m_Height); x1+=perx; } } Sleep(50); int dd=km*30; int ff=(app->zijie)-dd; if(ff<30) { KillTimer(2); MessageBox("波形回放完毕!","提醒您..."); } }