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

📄 test_grapview.cpp

📁 demo 演示程序 driver 图像采集卡驱动程序 sdk 用户二次开发库 source 演示程序的原代码 doc 720摄像机资料
💻 CPP
字号:
// test_grapView.cpp : implementation of the CTest_grapView class
//

#include "stdafx.h"
#include "test_grap.h"

#include "test_grapDoc.h"
#include "test_grapView.h"
#include "..\\gy_grap.h"
#include "CaijiDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTest_grapView
CTest_grapView* g_View;
IMPLEMENT_DYNCREATE(CTest_grapView, CScrollView)

BEGIN_MESSAGE_MAP(CTest_grapView, CScrollView)
	//{{AFX_MSG_MAP(CTest_grapView)
	ON_WM_CREATE()
	ON_COMMAND(ID_GRAP, OnGrap)
	ON_WM_ERASEBKGND()
	ON_COMMAND(ID_CONTROL, OnControl)
	ON_COMMAND(ID_SUBBKIMG, OnSubbkimg)
	ON_COMMAND(ID_GETBKIMG, OnGetbkimg)
	ON_WM_TIMER()
	ON_UPDATE_COMMAND_UI(ID_INDICATOR_CAPS, OnUpdateInfo1)
	ON_COMMAND(ID_ZOOM, OnZoom)
	ON_COMMAND(ID_ZOOMIN, OnZoomin)
	ON_COMMAND(ID_ZOOMOUT, OnZoomout)
	ON_UPDATE_COMMAND_UI(ID_SUBBKIMG, OnUpdateSubbkimg)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
	ON_COMMAND(ID_CAIJISETUP, OnCaijisetup)
	ON_COMMAND(ID_HANDCAIJI, OnHandcaiji)
	ON_UPDATE_COMMAND_UI(ID_CAIJISETUP, OnUpdateCaijisetup)
	ON_UPDATE_COMMAND_UI(ID_GRAP, OnUpdateGrap)
	//}}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)

	ON_REGISTERED_MESSAGE(MY_CAPTURE_BEGIN,OnCaptureBegin)
	ON_REGISTERED_MESSAGE(MY_CAPTURE_RUN,OnCaptureRun)
	ON_REGISTERED_MESSAGE(MY_CAPTURE_END,OnCaptureEnd)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTest_grapView construction/destruction

CTest_grapView::CTest_grapView()
{
	// TODO: add construction code here
	g_View=this;
	m_bLianXu=true;
	m_nCaijiCount=10;
	m_nInval=0;
    m_nCurPos=0;
	m_bHandCaiji=false;

	m_nFrames=0;
	m_nFps=0;
	m_nSecond=0;
	m_nFreq=0;
	m_Width=0;
	m_Height=0;
	m_fZoom=1.0f;
    m_bSubBK=false;
	m_bCaiji=false;
	m_hHiGrayDib=NULL;  
	m_hDib=NULL;
	for(int i=0;i<10;i++)
		m_hDibGroup[i]=NULL;
}

CTest_grapView::~CTest_grapView()
{
	GY_Exit();
}

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

	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CTest_grapView drawing

void CTest_grapView::OnDraw(CDC* pDC)
{
	CTest_grapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	GY_SetOffsetDC(GetScrollPosition().x,GetScrollPosition().y);
	GY_OnDraw(); 
	DoShowIMG(pDC->m_hDC,m_hDib);
}

void CTest_grapView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
}

/////////////////////////////////////////////////////////////////////////////
// CTest_grapView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CTest_grapView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CTest_grapView message handlers

int CTest_grapView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CScrollView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here
	GY_Init(this); //初始化该函数必须在其他GY_XXX()之前调用

	m_Width=GY_GetWidth();
	m_Height=GY_GetHeight();
    GY_SetDisplayWindow(3,m_Width,m_Height);
	SetScrollSizes(MM_TEXT,CSize(m_Width,m_Height));
	return 0;
}

void CTest_grapView::OnGrap() 
{
	// TODO: Add your command handler code here
	m_bCaiji=!m_bCaiji;
	if(m_bCaiji)
	{
		SetTimer(1,1000,NULL);
		if(!GY_Captrue(true,0,m_nInval)) m_bCaiji=false;
	}
	else
	{
		KillTimer(1);
	    GY_StopCaptrue();
	}
}


BOOL CTest_grapView::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	CRect rect;
	GetClientRect(rect);

	pDC->FillRect(&rect,&CBrush(RGB(0,0,0)));
		
	return true;//CScrollView::OnEraseBkgnd(pDC);
}

void CTest_grapView::OnControl() 
{
	// TODO: Add your command handler code here
	GY_Control();
}

void CTest_grapView::OnSubbkimg() 
{
	// TODO: Add your command handler code here
	m_bSubBK=!m_bSubBK;
	GY_SubBKimg(m_bSubBK);
}

void CTest_grapView::OnGetbkimg() 
{
	// TODO: Add your command handler code here
	GY_GetBKimg();
}

HGLOBAL CTest_grapView::InitDib(int xw,int yw,int nBits)//申请接收图像的内存
{
	int nColors=(1<<nBits);
	DWORD dwSize= sizeof(BITMAPINFOHEADER)+nColors*sizeof(RGBQUAD)+xw*yw;
	HGLOBAL hDib = GlobalAlloc(GHND,dwSize);//|GMEM_ZEROINIT
	if(hDib==NULL)
	{
		AfxMessageBox("Memory Alloc failed !");
		return NULL;
	}
 
	char* pNew = (char*)GlobalLock(hDib);
	if(pNew==NULL)
	{
		AfxMessageBox("hDib Memory Lock failed !");
		GlobalFree(hDib);
		return NULL;
	}

	BITMAPINFOHEADER *pBIH = (BITMAPINFOHEADER *)pNew;
	RGBQUAD* pPalette = (RGBQUAD *) &pNew[sizeof(BITMAPINFOHEADER)];
	BYTE* pBits = (BYTE*) &pNew[sizeof(BITMAPINFOHEADER)+nColors*sizeof(RGBQUAD)];
	
	pBIH->biSize			= sizeof(BITMAPINFOHEADER);
	pBIH->biWidth			= xw;
	pBIH->biHeight 			= yw;
	pBIH->biPlanes 			= 1;
	pBIH->biBitCount		= nBits;
	pBIH->biCompression		= BI_RGB;  // non Compression.
	pBIH->biSizeImage		= xw*yw;
	pBIH->biXPelsPerMeter	= 0;
	pBIH->biYPelsPerMeter	= 0;
	pBIH->biClrUsed			= nColors;
	pBIH->biClrImportant	= 0;

	for(int i=0; i<nColors; i++)
	{
		pPalette[i].rgbBlue=i;
		pPalette[i].rgbGreen=i;
		pPalette[i].rgbRed=i;
		pPalette[i].rgbReserved=0;
	}
	GlobalUnlock(hDib);
	return hDib;
}

void CTest_grapView::OnCaptureBegin(WPARAM wParam,LPARAM lParam)//开始采集
{  
	CString str;
	int xw=(int)(lParam&0xffff);
	int yw=(int)((lParam>>16)&0xffff);
	
	m_nCurPos=0;
	m_hDib=NULL;
	for(int i=0;i<10;i++)
	{	if(m_hDibGroup[i]) ::GlobalFree(m_hDibGroup[i]);
		m_hDibGroup[i]=InitDib(xw,yw,8);//申请连续记录图像的内存
	}
		
	if(m_hHiGrayDib) ::GlobalFree(m_hHiGrayDib);
	m_hHiGrayDib=::GlobalAlloc(GHND,xw*yw*sizeof(WORD));//申请接收12 bit的原始图像的内存

}

void CTest_grapView::OnCaptureRun(WPARAM wParam,LPARAM lParam)//正在采集
{
	OnShowInfo();

//用户可将该程序中177行中 GY_Captrue(true) 改为 GY_Captrue(false)
//再将以下屏蔽的代码去除屏蔽 试一试

	if(!m_bLianXu||m_bHandCaiji)
	{
		m_hDib=m_hDibGroup[m_nCurPos];
		if(m_hDib==NULL) return;

		BYTE* pNew=(BYTE*)::GlobalLock(m_hDibGroup[m_nCurPos]);
		BYTE* pBits = (BYTE*) &pNew[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];
		WORD* pWord=(WORD*)::GlobalLock(m_hHiGrayDib);
		GY_ConvertData((WORD*)wParam,pBits,pWord);
		::GlobalUnlock(m_hDibGroup[m_nCurPos]);
		::GlobalUnlock(m_hHiGrayDib);

    //	CDC* pDC=GetDC();
	//	DoShowIMG(pDC->m_hDC,m_hDib);
	//	ReleaseDC(pDC);
		m_nCurPos++;
		if(m_nCurPos>=m_nCaijiCount)
		{
			m_nCurPos=0;
			if(!m_bLianXu)
				OnGrap();
		}
		if(m_bHandCaiji) m_bHandCaiji=false;
	}
}

void CTest_grapView::OnCaptureEnd(WPARAM wParam,LPARAM lParam)//结束采集
{
	::MessageBeep(MB_OK);//0xFFFFFFFF);
}

BOOL CTest_grapView::DoShowIMG(HDC hDC,HGLOBAL dib)
{
	if( dib == NULL ) return false;

	char *pTemp=(char*)GlobalLock( dib );
	if( pTemp == NULL ) return false;

	CRect rect;
	GetClientRect(rect);
	int Left=(int)((rect.Width()-m_Width*m_fZoom)/2);
		if(Left<0) Left=0;
	int Top=(int)((rect.Height()-m_Height*m_fZoom)/2);
		if(Top<0)  Top=0; 
		

	BITMAPINFOHEADER *pBIH = (BITMAPINFOHEADER*)pTemp;

	BYTE* pData=(BYTE*)&pTemp[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];
	::StretchDIBits(hDC,Left,Top,(int)(m_Width*m_fZoom),(int)(m_Height*m_fZoom),0,0,m_Width,m_Height,
		pData,(BITMAPINFO*)pBIH,DIB_RGB_COLORS, SRCCOPY );
		
	//SetDIBitsToDevice(hDC,0,0,m_Width,m_Height,0,0,0,m_Height, 
	//	pData,
	//	(BITMAPINFO*)pBIH,DIB_RGB_COLORS );

	GlobalUnlock( dib );

	return true;

}
void CTest_grapView::OnShowInfo()
{
	CString InfoStr;
	CWnd* pWnd = AfxGetMainWnd();
	m_nFrames++;
	m_nFps++;
	InfoStr.Format(" 采集时间:%-d 秒   采集帧数:%d 帧   帧频:%-d 帧/秒   ",
		m_nSecond,m_nFrames,m_nFreq);
	pWnd->SetWindowText(InfoStr);
}
	

void CTest_grapView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	m_nFreq=m_nFps;
    m_nFps=0;
	m_nSecond++;
	CScrollView::OnTimer(nIDEvent);
}

void CTest_grapView::OnUpdateInfo1(CCmdUI* pCmdUI) 
{
	CString str;
	CPoint point(0,0);
	GetCursorPos(&point);
	ScreenToClient(&point);

	CRect rect;
	GetClientRect(&rect);
    int left=(int)((rect.Width()-m_Width*m_fZoom)/2);
	if(left<0) left=0;
	int top=(int)((rect.Height()-m_Height*m_fZoom)/2);
	if(top<0) top=0;
	point+=GetScrollPosition();
	point.x-=left;
	point.y-=top;
	point.x=(int)(point.x/m_fZoom);
	point.y=(int)(point.y/m_fZoom);
	WORD i=0;
	i=GY_GetGray(point.x,point.y);
	str.Format(" x:%-4d y:%-4d   Value:%-3d",point.x,point.y,i);
		
	pCmdUI->SetText(str);
}

void CTest_grapView::OnZoom() 
{
	// TODO: Add your command handler code here
	m_fZoom=1.0f;
	GY_SetDisplayWindow(3,m_Width,m_Height);
	SetScrollSizes(MM_TEXT,CSize(m_Width,m_Height));
	Invalidate();
}

void CTest_grapView::OnZoomin() 
{
	// TODO: Add your command handler code here
	m_fZoom-=.2f;
	if(m_fZoom<.5f) m_fZoom=0.5f;
	GY_SetDisplayWindow(3,(int)(m_Width*m_fZoom),(int)(m_Height*m_fZoom));
	SetScrollSizes(MM_TEXT,CSize((int)(m_Width*m_fZoom),(int)(m_Height*m_fZoom)));
	Invalidate();
}

void CTest_grapView::OnZoomout() 
{
	// TODO: Add your command handler code here
	m_fZoom+=.2f;
	if(m_fZoom>4.0f) m_fZoom=4.0f;
	GY_SetDisplayWindow(3,(int)(m_Width*m_fZoom),(int)(m_Height*m_fZoom));
	SetScrollSizes(MM_TEXT,CSize((int)(m_Width*m_fZoom),(int)(m_Height*m_fZoom)));
	Invalidate();	
}

void CTest_grapView::OnUpdateSubbkimg(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
   pCmdUI->SetCheck(m_bSubBK);	
}


void CTest_grapView::OnFileOpen() 
{
	// TODO: Add your command handler code here
	char szFilter[500]="BMP File(*.bmp)|*.bmp|";
	strcat(szFilter,"HIG File(*.hig)|*.hig|");
	strcat(szFilter,"All File(*.*)|*.*||");
	
	CFileDialog FileDLG(true,"wmg",NULL,
				OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);
									
	if(FileDLG.DoModal()==IDOK)
			GY_OpenImgFromFile(FileDLG.GetPathName()); 
}
void CTest_grapView::OnFileSave() 
{
	// TODO: Add your command handler code here

	char szFilter[500]="HIG File(*.hig)|*.hig|";
	strcat(szFilter,"BMP File(*.bmp)|*.bmp|");
	strcat(szFilter,"All File(*.*)|*.*||");
	
	CFileDialog FileDLG(false,"hig",NULL,
				OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);
		
	if(FileDLG.DoModal()==IDOK)	
	GY_SaveImgToFile(FileDLG.GetPathName());
}


void CTest_grapView::OnCaijisetup() 
{
	// TODO: Add your command handler code here
	CCaijiDlg dlg;	

	dlg.m_bLianXu=m_bLianXu;
	dlg.m_nCaijiCount=m_nCaijiCount;
	dlg.m_nInval=m_nInval;

	int respond;
	respond=dlg.DoModal();

	if(respond==IDOK)
	{
		m_bLianXu=dlg.m_bLianXu;
	    m_nCaijiCount=dlg.m_nCaijiCount;
		if(m_bLianXu) 
				m_nCaijiCount=10;
		
	    m_nInval=dlg.m_nInval;
	}

}

void CTest_grapView::OnHandcaiji() 
{
	// TODO: Add your command handler code here
    m_bHandCaiji=true;	
}

void CTest_grapView::OnUpdateCaijisetup(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
    pCmdUI->Enable(!m_bCaiji);	
}

void CTest_grapView::OnUpdateGrap(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_bCaiji);
}

⌨️ 快捷键说明

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