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

📄 addigitview.cpp

📁 AD 数据采集卡基本的采集界面
💻 CPP
字号:
// ADDigitView.cpp : implementation of the CADDigitView class
//
#include "stdafx.h"
#include "Sys.h"
#include "ADDoc.h"
#include "ADDigitView.h"
#include "ADStatusView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
////////////////////////////////////////////////////////////////////////
extern int m_ProcessDigitalMode;
extern SHORT ADBuffer[MAX_SEGMENT][16384];
extern int CurrentIndex;
extern BOOL m_FirstScreenStop;
extern int  m_AnalyzeChannel;
extern int m_UpperLimit;
extern int m_LowerLimit;
extern int m_MiddleLsb;
extern PCI2006_PARA_AD ADPara;
extern HANDLE hDevice;
extern CEdit* pCountEdit;
extern BOOL m_BounceStop;
extern BOOL m_AnalyzeCheck;
extern BOOL m_bCreateDevice;
extern BOOL m_StopUpdateView;
extern BOOL m_bProgress;
extern int m_DigitalDataShowMode;
extern float PerLsbVolt; // 单位LSB的电压值
extern BOOL bDrawing;
extern BOOL bShowOutTriggerFlag;
extern BOOL bShowFIFOStatus;
extern int m_nLower;//串道分析 下限
extern int m_nUpper;//串道分析 上限
extern CADStatusView* pADStatusView;
extern BOOL bDataProcessing;
extern int DrawIndex;
extern int Volt_Range ; //电压处理方式 1:正负5伏 2:正负10伏 3:0至5伏 4:0至2.5伏
/////////////////////////////////////////////////////////////////////////////
// CADDigitView

IMPLEMENT_DYNCREATE(CADDigitView, CScrollView)

BEGIN_MESSAGE_MAP(CADDigitView, CScrollView)
	//{{AFX_MSG_MAP(CADDigitView)
	ON_WM_CONTEXTMENU()
	ON_WM_CANCELMODE()
	ON_COMMAND(IDM_SixteenShow, OnSixteenShow)
	ON_UPDATE_COMMAND_UI(IDM_SixteenShow, OnUpdateSixteenShow)
	ON_COMMAND(IDM_TenShow, OnTenShow)
	ON_UPDATE_COMMAND_UI(IDM_TenShow, OnUpdateTenShow)
	ON_COMMAND(IDM_DigitalVoltShowMode, OnDigitalVoltShowMode)
	ON_UPDATE_COMMAND_UI(IDM_DigitalVoltShowMode, OnUpdateDigitalVoltShowMode)
	ON_WM_VSCROLL()
	ON_WM_CREATE()
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CADDigitView construction/destruction

CADDigitView::CADDigitView()
{
	// TODO: add construction code here
	m_DigitalDataShowMode=2;
	CurrentProgress=0;  // 置采集进度条起值为0	
}

CADDigitView::~CADDigitView()
{


}

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

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CADDigitView drawing
void CADDigitView::OnDraw(CDC* pDC)
{
	ADDigit(pDC);		
	if (m_AnalyzeCheck)
	{
		AnalyzeDigital();
	}	

/*	if(m_bProgress)
	{
		CADFrame* pShow=((CSysApp*)AfxGetApp())->m_ADFrame ; // 取得子帧窗口句柄
		pProgress=(CProgressCtrl*)(pShow->m_wndShowStatus1.GetDlgItem(IDC_PROGRESS));
		pProgress->SetPos(CurrentProgress);
		CurrentProgress++;
		if(CurrentProgress>50) CurrentProgress=0;
	//	m_bProgress=FALSE;
	}	*/
}

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

	CSize sizeTotal;
	// TODO: calculate the total size of this view
	const SIZE conPSize={200,1};
	const SIZE conLSize={20,1};
	sizeTotal.cx = 3000; 
	sizeTotal.cy = 1024+64;
	SetScrollSizes(MM_TEXT, sizeTotal);
	//SCROLLINFO f;
	//GetScrollInfo(SB_VERT, &f);
	//f.cbSize = 10;
	//f.nMax=30;
	//f.nMin=10;
	//f.nPos=20;
	//f.nTrackPos=5;
	//SetScrollInfo(SB_VERT, &f);
	CADDoc* pDoc =(CADDoc*) GetDocument();
	pDoc->m_hWndDigit=m_hWnd; 

}

/////////////////////////////////////////////////////////////////////////////
// CADDigitView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CADDigitView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CADDigitView message handlers

void CADDigitView::ADDigit(CDC *pDC)//显示ch值 
{
    
	bDataProcessing = TRUE; // 表示正在处理数据,采集或处理线程不应该操作此段缓冲区    
	CRect rect;
	CString string;
	
	int nChannelCount = ADPara.ChannelCount;
	GetClientRect(&rect);
	OnPrepareDC(pDC);
	pDC->DPtoLP(&rect);

	//PerLsbVolt = 10000.0/16384;
	int x, y, i;  char str[100];
	int ChannelIndex=0;
	x=0; y=rect.top-20;    // 确定始坐标
	ULONG Index=0;//rect.top*8;  // 用滚动的象素点作为数组索引
	for(i=0; i<320; i++) 
	{
		if(m_DigitalDataShowMode==0)//十进制显示
		{			
			//BOOL bShowOutTriggerFlag=FALSE;
			//BOOL bShowFIFOStatus = FALSE;
			bShowOutTriggerFlag=TRUE;
				sprintf(str, " %6d", ((ADBuffer[DrawIndex][Index+i]^0x2000)&0x3FFF)-m_MiddleLsb-8192);
		}

		if (m_DigitalDataShowMode==1)//十六进制显示
		{			
			sprintf(str, " %6x", ((ADBuffer[DrawIndex][Index+i])&0x3FFF));
		}
		if (m_DigitalDataShowMode==2)//电压显示
		{
			switch(Volt_Range) //电压处理方式 1:正负5伏 2:正负10伏 3:0至5伏 4:0至2.5伏
			{
			case RANGE_N5000_TO_P5000:
				sprintf(str, " %7.2f", (((ADBuffer[DrawIndex][Index+i]^0x2000)&0x3FFF)-m_MiddleLsb-8192)*PerLsbVolt);
				break;
			case RANGE_N10000_TO_P10000:
				sprintf(str, " %7.2f", (((ADBuffer[DrawIndex][Index+i]^0x2000)&0x3FFF)-m_MiddleLsb-8192)*PerLsbVolt);
				break;
			case RANGE_0_TO_P5000:
				sprintf(str, " %7.2f", (((ADBuffer[DrawIndex][Index+i])&0x3FFF)-m_MiddleLsb)*PerLsbVolt);
				break;
			case RANGE_0_TO_P2500:
				sprintf(str, " %7.2f", (((ADBuffer[DrawIndex][Index+i])&0x3FFF)-m_MiddleLsb)*PerLsbVolt);
				break;
			}
			
		}
		
		if((i)%nChannelCount==0)
		{				
			x=0;  y=y+20;
		}
		else
		{
			if (m_DigitalDataShowMode==2)
			{
				x=x+70;
			}	
			else
			{
				//x=x+50;
				x=x+90;
			}
		}

		//cDC.DrawText(pBuf, (LPRECT)cAdrRect, DT_LEFT|DT_TOP|DT_SINGLELINE|DT_NOPREFIX);

		if ( y == 0 )
		{			
			//sprintf(str, "   CH%d ", ADPara.ChannelArray[ChannelIndex].ADChannel) ;
			sprintf(str, "   CH%d", ADPara.ChannelArray[ChannelIndex].ADChannel);
			pDC->TextOut( x, y, str );
			ChannelIndex++;
		}
		else
			pDC->TextOut(x, y, str);
	} 
	bDataProcessing = FALSE; // 表示数据已处理完,采集或处理线程可以操作此段缓冲区
}


void CADDigitView::AnalyzeDigital()
{
	//基于一点的分析,通道数为1,2,4,6,8,16,32时有效

}

void CADDigitView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	// TODO: Add your message handler code here
	{
		if (point.x == -1 && point.y == -1){
			//keystroke invocation
			CRect rect;
			GetClientRect(rect);
			ClientToScreen(rect);

			point = rect.TopLeft();
			point.Offset(5, 5);
		}

		CMenu menu;
		VERIFY(menu.LoadMenu(IDR_ChooseMode));

		CMenu* pPopup = menu.GetSubMenu(0);
		ASSERT(pPopup != NULL);
		CWnd* pWndPopupOwner = this;

		while (pWndPopupOwner->GetStyle() & WS_CHILD)
			pWndPopupOwner = pWndPopupOwner->GetParent();

		pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,
			pWndPopupOwner);
	}}

void CADDigitView::OnCancelMode() 
{
	CScrollView::OnCancelMode();	
	// TODO: Add your message handler code here
}

void CADDigitView::OnSixteenShow() //数字十六进制显示
{
	// TODO: Add your command handler code here
	m_DigitalDataShowMode=1;
	CSysApp *pApp=(CSysApp *)AfxGetApp();
	CADDoc* pDoc=pApp->m_pADDoc;
	pDoc->UpdateAllViews(NULL, 1, NULL);  // 传递1,要求重绘数字视图
	CString str;
	str.Format("%x",m_nLower);
	pADStatusView->m_EDIT_Lower.SetWindowText(str);
	
	str.Format("%x",(WORD)m_nUpper);
	pADStatusView->m_EDIT_Upper.SetWindowText(str);

}

void CADDigitView::OnTenShow()//数字十进制显示 
{
	// TODO: Add your command handler code here
	m_DigitalDataShowMode=0;
	CSysApp *pApp=(CSysApp *)AfxGetApp();
	CADDoc* pDoc=pApp->m_pADDoc;
	pDoc->UpdateAllViews(NULL, 1, NULL);  // 传递1,要求重绘数字视图

	CString str;

	str.Format("%d",(WORD)m_nLower);
	pADStatusView->m_EDIT_Lower.SetWindowText(str);
	
	str.Format("%d",(WORD)m_nUpper);
	pADStatusView->m_EDIT_Upper.SetWindowText(str);
}

void CADDigitView::OnDigitalVoltShowMode() 
{
	// TODO: Add your command handler code here
	m_DigitalDataShowMode=2;
	CSysApp *pApp=(CSysApp *)AfxGetApp();
	CADDoc* pDoc=pApp->m_pADDoc;
	pDoc->UpdateAllViews(NULL, 1, NULL);  // 传递1,要求重绘数字视图

	CString str;
	//电压显示
	switch(Volt_Range) //电压处理方式 1:正负5伏 2:正负10伏 3:0至5伏 4:0至2.5伏
	{
	case RANGE_N5000_TO_P5000:
		str.Format("%4.2f",(m_nLower-8192)*(10000.0/16384));
		break;
	case RANGE_N10000_TO_P10000:
		str.Format("%4.2f",(m_nLower-8192)*(20000.0/16384));
		break;
	case RANGE_0_TO_P5000:
		str.Format("%4.2f",(m_nLower)*(5000.0/16384));
		break;
	case RANGE_0_TO_P2500:
		str.Format("%4.2f",(m_nLower)*(2500.0/16384));
		break;
	}
	pADStatusView->m_EDIT_Lower.SetWindowText(str);
	
	switch(Volt_Range) //电压处理方式 1:正负5伏 2:正负10伏 3:0至5伏 4:0至2.5伏
	{
	case RANGE_N5000_TO_P5000:
		str.Format("%4.2f",(m_nUpper-8192)*(10000.0/16384));
		break;
	case RANGE_N10000_TO_P10000:
		str.Format("%4.2f",(m_nUpper-8192)*(20000.0/16384));
		break;
	case RANGE_0_TO_P5000:
		str.Format("%4.2f",(m_nUpper)*(5000.0/16384));
		break;
	case RANGE_0_TO_P2500:
		str.Format("%4.2f",(m_nUpper)*(2500.0/16384));
		break;
	}
	pADStatusView->m_EDIT_Upper.SetWindowText(str);
	
}

void CADDigitView::OnUpdateSixteenShow(CCmdUI* pCmdUI) 
{//十六进制
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck (m_DigitalDataShowMode==1);
}

void CADDigitView::OnUpdateTenShow(CCmdUI* pCmdUI) 
{//十进制显示
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck (m_DigitalDataShowMode==0);
}

void CADDigitView::OnUpdateDigitalVoltShowMode(CCmdUI* pCmdUI) 
{//电压显示
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_DigitalDataShowMode==2);
}

void CADDigitView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	RedrawWindow();  // 当用户拖动滚动条时,要求视口重画
	CScrollView::OnVScroll(nSBCode, nPos, pScrollBar);
}


int CADDigitView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CScrollView::OnCreate(lpCreateStruct) == -1)
		return -1;	
	
	return 0;
}

void CADDigitView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint) 
{
	// TODO: Add your specialized code here and/or call the base class
	if(lHint==1)  // 如果是数字方式,就执行父类的OnUpdate来调用其OnDraw
	{
		CScrollView::OnUpdate(pSender, lHint, pHint);
	}
}

⌨️ 快捷键说明

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