📄 vidcapview.cpp
字号:
#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 + -