📄 addigitview.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 + -