基本信息
源码名称:CCD通讯 示例源码(c++)
源码大小:0.43M
文件格式:.rar
开发语言:C/C++
更新时间:2018-01-18
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍
CCD通讯


// CCDView.cpp : implementation of the CCCDView class
//

#include "stdafx.h"
#include "CCD.h"
#include "SetDlg.h"
#include "CCDDoc.h"
#include "CCDView.h"

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

#define DEFSCALE 0.5
#define MAX 65535
#define MAXX 5000
#define DEFSIZE 50
#define MIDDATA 30000
/////////////////////////////////////////////////////////////////////////////
// CCCDView

IMPLEMENT_DYNCREATE(CCCDView, CScrollView)

BEGIN_MESSAGE_MAP(CCCDView, CScrollView)
	//{{AFX_MSG_MAP(CCCDView)
	ON_WM_TIMER()
	ON_COMMAND(ID_START, OnStart)
	ON_COMMAND(ID_PAUSE, OnPause)
	ON_COMMAND(ID_STOP, OnStop)
	ON_COMMAND(ID_SET, OnSet)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CCCDView construction/destruction


CCCDView::CCCDView()
{
	RESET=1;
	pData1=NULL;
	pData2=NULL;

	CWinApp* pApp = AfxGetApp();
	m_nBaseAddr=pApp->GetProfileInt("CCD","BaseAddr",0);
	m_nPixelNum1=pApp->GetProfileInt("CCD","PixelNum1",1000);
	m_nPixelNum2=pApp->GetProfileInt("CCD","PixelNum2",1000);
	m_time=pApp->GetProfileInt("CCD","Time",500);
	m_UserScale=pApp->GetProfileInt("CCD","UserScale",1);
	m_ShowType=pApp->GetProfileInt("CCD","ShowType",0);

	hMod=LoadLibrary("ADA11GH2-AT.dll");
	if(hMod!=NULL)
	pfunc=(CCD_DATA)GetProcAddress(hMod,"CCD_DataAcquisition");
	else
	{
		MessageBox("Can't load dll function!\r\nPrograme will stop!","Warning");
		exit(0);
	}
	// TODO: add construction code here

}

CCCDView::~CCCDView()
{
	if(hMod!=NULL)
		FreeLibrary(hMod);

    CWinApp* pApp = AfxGetApp();

	pApp->WriteProfileInt("CCD","BaseAddr",m_nBaseAddr);
	pApp->WriteProfileInt("CCD","PixelNum1",m_nPixelNum1);
	pApp->WriteProfileInt("CCD","PixelNum2",m_nPixelNum2);
	pApp->WriteProfileInt("CCD","Time",m_time);
	pApp->WriteProfileInt("CCD","UserScale",m_UserScale);
	pApp->WriteProfileInt("CCD","ShowType",m_ShowType);

}

BOOL CCCDView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CCCDView drawing

void CCCDView::OnDraw(CDC* pDC)
{
	CCCDDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(m_nNum)
	{
		CRect rect;
		GetClientRect(&rect);
		
		int rectx=rect.Width();
		int recty=rect.Height();

		CPen pen1,pen2;
		CPen *OldPen;
		CString str;
		pen1.CreatePen(PS_DOT,1,RGB(125,125,125));
		pen2.CreatePen(PS_SOLID,1,RGB(0,0,255));

		int i,j,k;

		if(m_ShowType)
		{
			CSize sizeTotal;
			sizeTotal.cx=rect.Width();
			sizeTotal.cy=(m_nNum 2)*10;
			SetScrollSizes(MM_TEXT, sizeTotal);

			OldPen=pDC->SelectObject(&pen1);
			for(i=1;i<m_nNum 1;i  )
			{
				pDC->MoveTo(0,i*20);
				pDC->LineTo(rect.Width(),i*20);
			}
			pDC->MoveTo(rect.Width()/4,0);
			pDC->LineTo(rect.Width()/4,sizeTotal.cy);

			pDC->MoveTo(rect.Width()/2,0);
			pDC->LineTo(rect.Width()/2,sizeTotal.cy);

			pDC->MoveTo(rect.Width()*3/4,0);
			pDC->LineTo(rect.Width()*3/4,sizeTotal.cy);

			pDC->SelectObject(&pen2);
			pDC->TextOut(0,0,"测量次数");
			pDC->TextOut(rect.Width()/4,0,"测量数值");
			pDC->TextOut(rect.Width()/2,0,"测量次数");
			pDC->TextOut(rect.Width()*3/4,0,"测量数值");
			
			for(i=1;i<(m_nNum 1);i  )
			{
				k=i%2 ? 0:rect.Width()/2;
				j=(i 1)/2;
				str.Format("%d",i);
				pDC->TextOut(0 k,j*20,str);
				str.Format("%d",m_pData[i-1]);
				pDC->TextOut(rect.Width()/4 k,j*20,str);
			}
			pDC->SelectObject(OldPen);			
			
		}else
		{
			
			double defscale=(double)(rectx)/20/m_UserScale;
			
			CSize sizeTotal;
			sizeTotal.cx=((m_nNum*defscale rectx/20)>rect.Width() ? (m_nNum*defscale rectx/20):rect.Width());
			sizeTotal.cy = rect.Height();
			SetScrollSizes(MM_TEXT, sizeTotal);
			// TODO: add draw code for native data here
			
			int startx=rectx/20;
			int starty=sizeTotal.cy-recty/20;
			
			OldPen=pDC->SelectObject(&pen1);
			j=sizeTotal.cy*20/recty;
			k=(sizeTotal.cx*20)/rectx (sizeTotal.cx*20)%rectx*2;
			double scaley=((double)(MAX*j))/(sizeTotal.cy*(j-1));
			double scalex=((double)(sizeTotal.cx-startx)/m_nNum);
			double stepx=(double)rectx/20;
			double stepy=(double)recty/20;
			for(i=1;i<j;i  )
			{
				pDC->MoveTo(0,stepy*i);
				pDC->LineTo(sizeTotal.cx,stepy*i);
				str.Format("%d",(j-i-1)*MAX/(j-1));
				pDC->TextOut(0,stepy*i,str);
			}
			for(i=1;i<k;i  )
			{
				pDC->MoveTo(stepx*i,0);
				pDC->LineTo(stepx*i,sizeTotal.cy);
				str.Format("%d",(i-1)*MAXX/(k-1));
				pDC->TextOut(stepx*i,starty,str);
			}
			
			pDC->SelectObject(&pen2);
			
			pDC->MoveTo(startx,0);
			pDC->LineTo(startx,starty);
			pDC->LineTo(sizeTotal.cx,starty);
			
			pDC->MoveTo(startx,starty-m_pData[0]*scaley);
			double tempx,tempy;
			for(i=0;i<m_nNum;i  )
			{
				tempx=i*scalex;
				tempx =startx;
				tempy=starty-m_pData[i]/scaley;
				pDC->LineTo(tempx,tempy);
			}
			pDC->SelectObject(OldPen);
		}
	}
	// TODO: add draw code for native data here
}

void CCCDView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();

	CSize sizeTotal;
	// TODO: calculate the total size of this view
	sizeTotal.cx = sizeTotal.cy = 100;
	SetScrollSizes(MM_TEXT, sizeTotal);
}

/////////////////////////////////////////////////////////////////////////////
// CCCDView printing

BOOL CCCDView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CCCDView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CCCDView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CCCDView diagnostics

#ifdef _DEBUG
void CCCDView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CCCDView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CCCDDoc* CCCDView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCCDDoc)));
	return (CCCDDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CCCDView message handlers

void CCCDView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(pfunc(m_nBaseAddr,pData1,pData2,m_nPixelNum1,m_nPixelNum2))
	{
		int index1=0;
		int index2=0;
		UINT i=0;
		for(i=0;i<m_nPixelNum1&&pData1[i]>=MIDDATA;i  );
		index1=i;
		for(i=0;i<m_nPixelNum2&&pData2[i]<=MIDDATA;i  );
		index2=i;
		if(m_nNowIndex>=m_nMax)
		{
			m_nMax*=2;
			int *pTemp=new int[m_nMax];
			delete m_pData;
			m_pData=pTemp;
		}
		m_pData[m_nNowIndex]=m_nPixelNum1-index1 index2;
		m_nNowIndex  ;
		m_nNum  ;
	}

	InvalidateRect(NULL);

	CScrollView::OnTimer(nIDEvent);
}

void CCCDView::OnStart() 
{
	// TODO: Add your command handler code here
	if(RESET)
	{
		m_nNowIndex=0;
		m_nNum=0;
		if(m_pData!=NULL)
			delete m_pData;
		m_pData=new int[DEFSIZE];
		m_nMax=DEFSIZE;
		
		if(pData1!=NULL)
			delete pData1;
		if(pData2!=NULL)
			delete pData2;
		if(m_nPixelNum1)
			pData1=new short int[m_nPixelNum1];
		if(m_nPixelNum2)
			pData2=new short int[m_nPixelNum2];
	}

	SetTimer(1,m_time,NULL);
	
}

void CCCDView::OnPause() 
{
	// TODO: Add your command handler code here
	KillTimer(1);
	RESET=0;
	
}

void CCCDView::OnStop() 
{
	// TODO: Add your command handler code here
	KillTimer(1);
	RESET=1;

	
}

void CCCDView::OnSet() 
{
	// TODO: Add your command handler code here
	CSetDlg dlg;
	dlg.m_intertime=m_time;
	char szbase[256];
	sprintf(szbase,"%x",m_nBaseAddr);
	dlg.m_nBaseAddr=szbase;
	dlg.m_nNum1=m_nPixelNum1;
	dlg.m_nNum2=m_nPixelNum2;
	dlg.m_nENum=m_UserScale;
	dlg.m_ShowType=m_ShowType;
	if(dlg.DoModal()==IDOK)
	{
		sscanf(dlg.m_nBaseAddr,"%x",&m_nBaseAddr);
		m_nPixelNum1=dlg.m_nNum1;
		m_nPixelNum2=dlg.m_nNum2;
		m_time=dlg.m_intertime;
		m_UserScale=dlg.m_nENum;
		m_ShowType=dlg.m_ShowType;
	}
	InvalidateRect(NULL);
}