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);
}