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

📄 vidcapview.cpp

📁 我近期从事视频开发所以将我参考的资料上传给大家看看。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "VidCap.h"
#include "VidCapDoc.h"
#include "VidCapView.h"
#include "CaptureDeviceDlg.h"
#include "AllocateSpaceDlg.h"
#include "CaptureVideoDlg.h"
#include "CaptureFramesDlg.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

const UINT CAP_ID = 100;


IMPLEMENT_DYNCREATE(CVidCapView, CView)

BEGIN_MESSAGE_MAP(CVidCapView, CView)
	//{{AFX_MSG_MAP(CVidCapView)
	ON_COMMAND(ID_FILE_CONNECT, OnFileConnect)
	ON_COMMAND(ID_OPTIONS_AUDIOFORMAT, OnOptionsAudioformat)
	ON_COMMAND(ID_OPTIONS_OVERLAY, OnOptionsOverlay)
	ON_UPDATE_COMMAND_UI(ID_OPTIONS_OVERLAY, OnUpdateOptionsOverlay)
	ON_COMMAND(ID_OPTIONS_PREVIEW, OnOptionsPreview)
	ON_UPDATE_COMMAND_UI(ID_OPTIONS_PREVIEW, OnUpdateOptionsPreview)
	ON_COMMAND(ID_OPTIONS_VIDEODISPLAY, OnOptionsVideodisplay)
	ON_COMMAND(ID_OPTIONS_VIDEOFORMAT, OnOptionsVideoformat)
	ON_COMMAND(ID_OPTIONS_VIDEOSOURCE, OnOptionsVideosource)
	ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEODISPLAY, OnUpdateOptionsVideodisplay)
	ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEOFORMAT, OnUpdateOptionsVideoformat)
	ON_UPDATE_COMMAND_UI(ID_OPTIONS_VIDEOSOURCE, OnUpdateOptionsVideosource)
	ON_COMMAND(ID_CAPTURE_SINGLEFRAME, OnCaptureSingleframe)
	ON_UPDATE_COMMAND_UI(ID_CAPTURE_SINGLEFRAME, OnUpdateCaptureSingleframe)
	ON_COMMAND(ID_FILE_DISCONNECT, OnFileDisconnect)
	ON_UPDATE_COMMAND_UI(ID_FILE_DISCONNECT, OnUpdateFileDisconnect)
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
	ON_COMMAND(ID_FILE_SAVECAPTUREDVIDEOAS, OnFileSavecapturedvideoas)
	ON_UPDATE_COMMAND_UI(ID_FILE_SAVECAPTUREDVIDEOAS, OnUpdateFileSavecapturedvideoas)
	ON_COMMAND(ID_FILE_ALLOCATEFILESPACE, OnFileAllocatefilespace)
	ON_UPDATE_COMMAND_UI(ID_FILE_ALLOCATEFILESPACE, OnUpdateFileAllocatefilespace)
	ON_COMMAND(ID_FILE_LOADPALETTE, OnFileLoadpalette)
	ON_UPDATE_COMMAND_UI(ID_FILE_LOADPALETTE, OnUpdateFileLoadpalette)
	ON_COMMAND(ID_FILE_SETCAPTUREFILE, OnFileSetcapturefile)
	ON_UPDATE_COMMAND_UI(ID_FILE_SETCAPTUREFILE, OnUpdateFileSetcapturefile)
	ON_COMMAND(ID_FILE_SAVEPALETTE, OnFileSavepalette)
	ON_UPDATE_COMMAND_UI(ID_FILE_SAVEPALETTE, OnUpdateFileSavepalette)
	ON_COMMAND(ID_FILE_SAVESINGLEFRAME, OnFileSavesingleframe)
	ON_UPDATE_COMMAND_UI(ID_FILE_SAVESINGLEFRAME, OnUpdateFileSavesingleframe)
	ON_COMMAND(ID_FILE_PLAYCAPTUREDVIDEO, OnFilePlaycapturedvideo)
	ON_UPDATE_COMMAND_UI(ID_FILE_PLAYCAPTUREDVIDEO, OnUpdateFilePlaycapturedvideo)
	ON_COMMAND(ID_EDIT_PASTEPALETTE, OnEditPastepalette)
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTEPALETTE, OnUpdateEditPastepalette)
	ON_COMMAND(ID_OPTIONS_COMPRESSION, OnOptionsCompression)
	ON_UPDATE_COMMAND_UI(ID_OPTIONS_COMPRESSION, OnUpdateOptionsCompression)
	ON_UPDATE_COMMAND_UI(ID_OPTIONS_AUDIOFORMAT, OnUpdateOptionsAudioformat)
	ON_COMMAND(ID_CAPTURE_VIDEO, OnCaptureVideo)
	ON_UPDATE_COMMAND_UI(ID_CAPTURE_VIDEO, OnUpdateCaptureVideo)
	ON_COMMAND(ID_CAPTURE_FRAMES, OnCaptureFrames)
	ON_UPDATE_COMMAND_UI(ID_CAPTURE_FRAMES, OnUpdateCaptureFrames)
	ON_WM_DESTROY()
	ON_COMMAND(ID_OPTIONS_STRETCH, OnOptionsStretch)
	ON_UPDATE_COMMAND_UI(ID_OPTIONS_STRETCH, OnUpdateOptionsStretch)
	ON_WM_SIZE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

CVidCapView::CVidCapView() : m_dwCaptureRate(15),
                             m_dwPreviewRate(15),
                             m_bPreview(TRUE),
                             m_bOverlay(FALSE),
                             m_bCaptureAudio(TRUE),
                             m_bLimitEnabled(FALSE),
                             m_wTimeLimit(30),
                             m_pWaveFormat(NULL),
                             m_nWaveFormatSize(0),
                             m_nDefaultDevice(-1),
                             m_nWidth(160),
                             m_nHeight(120),
                             m_wBitCount(static_cast<WORD>(-1)),
                             m_bStretch(FALSE)
{
}

CVidCapView::~CVidCapView()
{
}

void CVidCapView::OnDraw(CDC* /*pDC*/)
{
	CVidCapDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
}

#ifdef _DEBUG
void CVidCapView::AssertValid() const
{
	CView::AssertValid();
}

void CVidCapView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

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

void CVidCapView::Connect(int nDeviceID)
{
  CWaitCursor wait;

  //Disconnect if connected
  if (m_wndCap.GetSafeHwnd())
    OnFileDisconnect();

  //crete the AVICap window
  if (!m_wndCap.Create(WS_CHILD | WS_VISIBLE, CRect(0, 0, m_nWidth, m_nHeight), this, CAP_ID))
  {
    AfxMessageBox(IDS_FAIL_CREATE_AVICAP);
    return;
  }

  //connect to the specfied device
  if (m_wndCap.Connect(nDeviceID))
  {
    m_wndCap.SetPreviewRate(static_cast<WORD>((1000.0 / m_dwPreviewRate) + 0.5));
    m_wndCap.SetPreview(m_bPreview);
    m_wndCap.SetOverlay(m_bOverlay);

    CAPTUREPARMS params;
    m_wndCap.GetSetup(params);
    params.dwRequestMicroSecPerFrame = 1000000 / m_dwCaptureRate;
    params.fCaptureAudio = m_bCaptureAudio;
    params.fLimitEnabled = m_bLimitEnabled;
    params.wTimeLimit = m_wTimeLimit;
    params.fMakeUserHitOKToCapture = TRUE;
    params.wPercentDropForError = 10;
    params.fAbortLeftMouse = FALSE;
    params.fAbortRightMouse = TRUE;
    m_wndCap.SetSetup(params);

    if (m_pWaveFormat)
      m_wndCap.SetAudioFormat(m_pWaveFormat);

    BITMAPINFO* pBmi = NULL;
    m_wndCap.GetVideoFormat(pBmi);
    pBmi->bmiHeader.biWidth = m_nWidth;
    pBmi->bmiHeader.biHeight = m_nHeight;
    if (m_wBitCount != -1)
      pBmi->bmiHeader.biBitCount = m_wBitCount;
    m_wndCap.SetVideoFormat(pBmi);
    delete [] pBmi;

    CAPSTATUS status;
    m_wndCap.GetStatus(status);
    CRect rect(0, 0, status.uiImageWidth, status.uiImageHeight);
    m_wndCap.MoveWindow(rect);

    if (m_sCaptureFile.GetLength())
      m_wndCap.SetCaptureFile(m_sCaptureFile);
    else
      m_wndCap.GetCaptureFile(m_sCaptureFile);      
    GetDocument()->SetTitle(m_sCaptureFile);

    m_wndCap.SetScale(m_bStretch);

    m_nDefaultDevice = nDeviceID;
  }
  else
  {
    m_wndCap.DestroyWindow();
    AfxMessageBox(IDS_FAIL_CONNECT_DEVICE, MB_ICONSTOP);
  }
}

void CVidCapView::OnFileConnect() 
{
  //First see if there are any devices on the system. If
  //not display a message box and abort
  int nDevicesFound = 0;
  for (WORD i=0; i<10; i++)
  {
    CString sName, sVersion;
    if (CAVICapWnd::GetDescription(i, sName, sVersion))
      ++nDevicesFound;
  }
  if (nDevicesFound == 0)
  {
    AfxMessageBox(IDS_NO_DEVICES_FOUND, MB_ICONSTOP);
    return;
  }

  //Display the dialog to allow the capture device to be selected
  CCaptureDeviceDlg dlg;
  if (dlg.DoModal() == IDOK)
    Connect(dlg.m_wDeviceID);
}

void CVidCapView::OnCaptureSingleframe() 
{
  m_wndCap.SetPreview(FALSE);
  m_wndCap.SetOverlay(FALSE);
	m_wndCap.CaptureSingleFrame();
}

void CVidCapView::OnUpdateCaptureSingleframe(CCmdUI* pCmdUI) 
{
  pCmdUI->Enable(m_wndCap.GetSafeHwnd() != NULL);	
}

void CVidCapView::OnFileDisconnect() 
{
  //Remember the settings for the device prior to disconnecting
  CAPTUREPARMS params;
  m_wndCap.GetSetup(params);
  CAPSTATUS status;
  m_wndCap.GetStatus(status);
  m_dwCaptureRate = static_cast<DWORD>((1000000.0 / params.dwRequestMicroSecPerFrame) + 0.5);
  m_bCaptureAudio = params.fCaptureAudio;
  m_bLimitEnabled = params.fLimitEnabled;
  m_wTimeLimit = params.wTimeLimit;
  m_bOverlay = status.fOverlayWindow;
  m_bPreview = status.fLiveWindow;
  m_bStretch = status.fScale;
  BITMAPINFO* pBmi = NULL;
  m_wndCap.GetVideoFormat(pBmi);
  if (pBmi)
  {
    m_nWidth = pBmi->bmiHeader.biWidth;
    m_nHeight = pBmi->bmiHeader.biHeight;
    m_wBitCount = pBmi->bmiHeader.biBitCount;
    delete [] pBmi;
  }
  
  m_wndCap.Disconnect();	
  m_wndCap.DestroyWindow();
}

void CVidCapView::OnUpdateFileDisconnect(CCmdUI* pCmdUI) 
{
  pCmdUI->Enable(m_wndCap.GetSafeHwnd() != NULL);
}

void CVidCapView::OnEditCopy() 
{
	m_wndCap.EditCopy();
}

void CVidCapView::OnUpdateEditCopy(CCmdUI* pCmdUI) 
{
  pCmdUI->Enable(m_wndCap.GetSafeHwnd() != NULL);
}

void CVidCapView::OnFileSavecapturedvideoas() 
{
  CString sFilename;
  m_wndCap.GetCaptureFile(sFilename);
  CString sFilter;
  sFilter.LoadString(IDS_VIDEO_EXTENSIONS);
	CFileDialog dlg(FALSE, NULL, sFilename, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, sFilter);
  dlg.m_ofn.lpstrTitle = _T("Save Captured Video As");
  if (dlg.DoModal() == IDOK)
  {
    CWaitCursor wait;
    m_wndCap.SaveAs(dlg.GetPathName());
  }
}

void CVidCapView::OnUpdateFileSavecapturedvideoas(CCmdUI* pCmdUI) 
{
  pCmdUI->Enable(m_wndCap.GetSafeHwnd() != NULL);
}

void CVidCapView::OnFileAllocatefilespace() 
{
  CAllocateSpaceDlg dlg;
  m_wndCap.GetCaptureFile(dlg.m_sFilename);
  if (dlg.DoModal() == IDOK)
  {
    CWaitCursor wait;
    m_wndCap.FileAllocate(dlg.m_dwSize * 1024 * 1024);
  }	
}

void CVidCapView::OnUpdateFileAllocatefilespace(CCmdUI* pCmdUI) 
{
  pCmdUI->Enable(m_wndCap.GetSafeHwnd() != NULL);
}

void CVidCapView::OnFileLoadpalette() 
{
  CString sFilter;
  sFilter.LoadString(IDS_PALETTE_EXTENSIONS);
	CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, sFilter);
  dlg.m_ofn.lpstrTitle = _T("Load Palette");
  if (dlg.DoModal() == IDOK)
    m_wndCap.OpenPalette(dlg.GetPathName());
}

void CVidCapView::OnUpdateFileLoadpalette(CCmdUI* pCmdUI) 
{
  pCmdUI->Enable(m_wndCap.GetSafeHwnd() != NULL);
}

void CVidCapView::OnFileSetcapturefile() 
{
  CString sFilename;
  m_wndCap.GetCaptureFile(sFilename);
  CString sFilter;
  sFilter.LoadString(IDS_VIDEO_EXTENSIONS);
	CFileDialog dlg(TRUE, NULL, sFilename, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, sFilter);
  dlg.m_ofn.lpstrTitle = _T("Set Capture File");
  if (dlg.DoModal() == IDOK)
  {
    m_sCaptureFile = dlg.GetPathName();
    m_wndCap.SetCaptureFile(m_sCaptureFile);
    GetDocument()->SetTitle(m_sCaptureFile);
  }
}

void CVidCapView::OnUpdateFileSetcapturefile(CCmdUI* pCmdUI) 
{
  pCmdUI->Enable(m_wndCap.GetSafeHwnd() != NULL);	
}

void CVidCapView::OnFileSavepalette() 
{
  CString sFilter;
  sFilter.LoadString(IDS_PALETTE_EXTENSIONS);
	CFileDialog dlg(FALSE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, sFilter);
  dlg.m_ofn.lpstrTitle = _T("Save Palette");
  if (dlg.DoModal() == IDOK)
  {

⌨️ 快捷键说明

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