www.pudn.com > VC_视频捕捉与帧处理.rar > CaptureTestView.cpp


// CaptureTestView.cpp : implementation of the CCaptureTestView class 
// 
 
#include "stdafx.h" 
#include "CaptureTest.h" 
 
#include "CaptureTestDoc.h" 
#include "CaptureTestView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define	DEFAULT_PERIOD	10 
 
///////////////////////////////////////////////////////////////////////////// 
// CCaptureTestView 
 
IMPLEMENT_DYNCREATE(CCaptureTestView, CView) 
 
BEGIN_MESSAGE_MAP(CCaptureTestView, CView) 
	//{{AFX_MSG_MAP(CCaptureTestView) 
	ON_COMMAND(ID_CAPTURE_SET_FORMAT, OnCaptureSetFormat) 
	ON_COMMAND(ID_CAPTURE_SET_SOURCE, OnCaptureSetSource) 
	ON_WM_TIMER() 
	ON_UPDATE_COMMAND_UI(ID_CAPTURE_SET_FORMAT, OnUpdateCaptureSetFormat) 
	ON_UPDATE_COMMAND_UI(ID_CAPTURE_SET_SOURCE, OnUpdateCaptureSetSource) 
	ON_WM_ERASEBKGND() 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CCaptureTestView construction/destruction 
 
CCaptureTestView::CCaptureTestView() 
{ 
	// TODO: add construction code here 
 
} 
 
CCaptureTestView::~CCaptureTestView() 
{ 
} 
 
BOOL CCaptureTestView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CCaptureTestView drawing 
 
void CCaptureTestView::OnDraw(CDC* pDC) 
{ 
	CCaptureTestDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	if(!m_FrameGrabber.GetSafeHwnd()) 
	{ 
		CRect rc; 
		GetClientRect(rc); 
			 
		CFont wFont; 
		wFont.CreateFont(24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
                 		VARIABLE_PITCH | FF_SWISS, "MS Sans Serif"); 
		CFont *ft=pDC->SelectObject(&wFont); 
			 
		CString s="Capture device not ready or not found"; 
		pDC->SetBkMode(TRANSPARENT); 
		pDC->SetTextColor(GetSysColor(COLOR_BTNSHADOW)); 
		pDC->DrawText(s,&rc,DT_CENTER|DT_SINGLELINE|DT_VCENTER); 
		pDC->SelectObject(ft);	 
	} 
 
	if(pDoc->m_ImageBitmap.GetSafeHandle()) 
	{ 
		pDoc->m_ImageBitmap.BitBlt(pDC,CPoint(0,0)); 
	} 
} 
///////////////////////////////////////////////////////////////////////////// 
// CCaptureTestView printing 
 
BOOL CCaptureTestView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CCaptureTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CCaptureTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CCaptureTestView diagnostics 
 
#ifdef _DEBUG 
void CCaptureTestView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CCaptureTestView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CCaptureTestDoc* CCaptureTestView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCaptureTestDoc))); 
	return (CCaptureTestDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CCaptureTestView message handlers 
 
void CCaptureTestView::OnCaptureSetFormat()  
{ 
	if(m_FrameGrabber.GetSafeHwnd()) 
	{ 
		m_FrameGrabber.VideoFormatDialog(); 
		OnUpdate(NULL, 0, NULL);  
	} 
		 
} 
 
void CCaptureTestView::OnCaptureSetSource()  
{ 
	if(m_FrameGrabber.GetSafeHwnd()) 
	{ 
		m_FrameGrabber.VideoSourceDialog(); 
		OnUpdate(NULL, 0, NULL);  
	} 
		 
} 
 
void CCaptureTestView::OnUpdate(CView *pSender, LPARAM lHint, CObject *pHint) 
{ 
	 
	if(m_FrameGrabber.GetSafeHwnd()) 
	{ 
		CSize sz = m_FrameGrabber.GetImageSize(); 
		CRect rcc; 
		CRect rcw; 
		GetClientRect(&rcc); 
		GetWindowRect(&rcw); 
		int dx = rcw.Width()-rcc.Width(); 
		int dy = rcw.Height()-rcc.Height(); 
 
		if(sz.cx && (rcc.Width()!=sz.cx || rcc.Height()!=sz.cy)) 
		{ 
			SetWindowPos(NULL,0,0,sz.cx+dx, sz.cy+dy, SWP_NOMOVE|SWP_NOZORDER); 
			GetParentFrame()->GetClientRect(&rcc); 
			GetParentFrame()->GetWindowRect(&rcw); 
			dx+= rcw.Width()-rcc.Width(); 
			dy+= rcw.Height()-rcc.Height(); 
 
			GetParentFrame()->SetWindowPos(NULL,0,0,sz.cx+dx, sz.cy+dy, SWP_NOMOVE|SWP_NOZORDER); 
		} 
		InvalidateRect(NULL); 
	} 
} 
 
void CCaptureTestView::OnInitialUpdate() 
{ 
	CView::OnInitialUpdate(); 
	 
	if(!m_FrameGrabber.GetSafeHwnd()) 
	{ 
		m_FrameGrabber.Create(0,9,this); 
		SetTimer(0x1, DEFAULT_PERIOD, NULL); 
	} 
} 
 
void CCaptureTestView::OnTimer(UINT nIDEvent)  
{ 
	if(!m_FrameGrabber.GetSafeHwnd())	return; 
 
	CCaptureTestDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	 
	//get the first frame 
	if(!pDoc->m_ImageBitmap.GetSafeHandle()) 
	{ 
			 
		LPBITMAPINFO lpBi = m_FrameGrabber.GetDIB(); 
		pDoc->m_ImageBitmap.CreateFromDib(lpBi); 
		InvalidateRect(NULL); 
	 
	} 
	else//only pass DIB to processor 
	{	 
		LPBITMAPINFO lpBi = m_FrameGrabber.GetDIB(); 
		pDoc->ProcessImage(lpBi); 
	} 
} 
 
void CCaptureTestView::OnUpdateCaptureSetFormat(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable((BOOL)m_FrameGrabber.GetSafeHwnd());	 
} 
 
void CCaptureTestView::OnUpdateCaptureSetSource(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable((BOOL)m_FrameGrabber.GetSafeHwnd()); 
} 
 
BOOL CCaptureTestView::OnEraseBkgnd(CDC *pDC) 
{ 
	if(m_FrameGrabber.GetSafeHwnd())	return TRUE;	 
	 
	return CView::OnEraseBkgnd(pDC); 
}