📄 vfwwrapper.cpp
字号:
// VFWWrapper.cpp: implementation of the CVFWWrapper class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ScreenChattingServer.h"
#include "VFWWrapper.h"
#include "WinBmpEx.h"
#include <mmsystem.h>
#include <mmreg.h>
#define DEF_CAPTURE_FPS 15
#define MIN_CAPTURE_FPS (1.0 / 60) // one frame per minute
#define MAX_CAPTURE_FPS 100
#define FPS_TO_MS(f) ((DWORD) ((double)1.0e6 / f))
#define DEF_CAPTURE_RATE FPS_TO_MS(DEF_CAPTURE_FPS)
#define MIN_CAPTURE_RATE FPS_TO_MS(MIN_CAPTURE_FPS)
#define MAX_CAPTURE_RATE FPS_TO_MS(MAX_CAPTURE_FPS)
#define CAP_SMALL_INDEX (30 * 60 * 15) // 15 minutes @ 30fps
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_SERIAL(CVFWWrapper,CObject,1)
CVFWWrapper::CVFWWrapper()
{
m_pCapWnd=NULL;
m_pParentWnd=NULL;
m_uDriverCount=0;
m_bHaveHardware=FALSE;
m_uDeviceIndex=0;
EnumDrivers();
}
CVFWWrapper::~CVFWWrapper()
{
m_pCapWnd=NULL;
m_pParentWnd=NULL;
m_uDriverCount=0;
m_bHaveHardware=FALSE;
m_uDeviceIndex=0;
}
CVFWWrapper::CVFWWrapper(BOOL bCreateCaptureWindow,CRect rect,CWnd *pParentWnd,UINT uIndex)
{
m_pCapWnd=NULL;
m_pParentWnd=NULL;
m_uDriverCount=0;
m_bHaveHardware=FALSE;
m_uDeviceIndex=0;
EnumDrivers();
if (!Initialize(bCreateCaptureWindow,rect,pParentWnd,uIndex)) ::MessageBox(pParentWnd->m_hWnd,"檬扁拳俊 角菩沁嚼聪促.","VFWWrapper",MB_OK);
}
BOOL CVFWWrapper::Initialize(BOOL bCreateCaptureWindow,CRect rect,CWnd *pParentWnd,UINT uIndex)
{
if (!pParentWnd) return FALSE;
m_pParentWnd=pParentWnd;
try
{
if (bCreateCaptureWindow)
{
HWND hCapWnd=capCreateCaptureWindow("VFWWrapper",WS_CHILD|WS_VISIBLE,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top,pParentWnd->m_hWnd,1);
if (!hCapWnd) return FALSE;
m_pCapWnd=new CWnd;
m_pCapWnd->Attach(hCapWnd);
if (!capCaptureGetSetup(m_pCapWnd->m_hWnd,&m_capParms,sizeof(CAPTUREPARMS))) return FALSE;
}
else
{
if (!capCaptureGetSetup(m_pParentWnd->m_hWnd,&m_capParms,sizeof(CAPTUREPARMS))) return FALSE;
m_pCapWnd=NULL;
}
if (!InitHardware(uIndex)) return FALSE;
}
catch(CException e)
{
::MessageBox(pParentWnd->m_hWnd,"檬扁拳俊 角菩沁嚼聪促.","VFWWrapper",MB_OK);
return FALSE;
}
return TRUE;
}
void CVFWWrapper::Serialize(CArchive& archive)
{
if (archive.IsLoading())
{
}
else
{
}
}
BOOL CVFWWrapper::InitHardware(UINT uIndex)
{
UINT uError;
char szName[MAX_PATH];
char szVersion[MAX_PATH];
CWnd *pCapConcernedWnd;
if (!m_pCapWnd) pCapConcernedWnd=m_pParentWnd;
else pCapConcernedWnd=m_pCapWnd;
if (uError=capDriverConnect(pCapConcernedWnd->m_hWnd, uIndex))
{
m_bHaveHardware=TRUE;
m_uDeviceIndex=uIndex;
}
else
{
m_bHaveHardware=FALSE;
}
if (!capDriverGetCaps(pCapConcernedWnd->m_hWnd,&m_capDriverCaps,sizeof(CAPDRIVERCAPS))) return FALSE;
if (!capGetStatus(pCapConcernedWnd->m_hWnd,&m_capStatus,sizeof(m_capStatus))) return FALSE;
if (!capGetDriverDescription (uIndex,szName,sizeof(szName),szVersion,sizeof (szVersion))) return FALSE;
if (!capPreviewRate(pCapConcernedWnd->m_hWnd,m_bHaveHardware?33:0)) return FALSE;
strcat(szName,", ");
strcat(szName,szVersion);
return m_bHaveHardware;
}
BOOL CVFWWrapper::EnumDrivers()
{
char achDeviceVersion[80];
char achDeviceAndVersion[160];
UINT uIndex;
for (uIndex=0;uIndex<MAXVIDDRIVERS;uIndex++)
{
if (capGetDriverDescription(uIndex,(LPSTR)achDeviceAndVersion,sizeof(achDeviceAndVersion),(LPSTR)achDeviceVersion,sizeof(achDeviceVersion)))
{
lstrcat(achDeviceAndVersion,", ");
lstrcat(achDeviceAndVersion,achDeviceVersion);
m_strDeviceAndVersion[m_uDriverCount]=achDeviceAndVersion;
m_uDriverCount++;
}
else break;
}
return TRUE;
}
BOOL CVFWWrapper::CaptureIt()
{
if (!m_pCapWnd) return FALSE;
if (!capGrabFrameNoStop(m_pCapWnd->m_hWnd)) return FALSE;
return TRUE;
}
BOOL CVFWWrapper::SetHandler(FARPROC fpErrorCallback, FARPROC fpYieldCallback, FARPROC fpStatusCallback)
{
CWnd *pCapConcernedWnd;
if (!m_pCapWnd) pCapConcernedWnd=m_pParentWnd;
else pCapConcernedWnd=m_pCapWnd;
if (!capSetCallbackOnError(pCapConcernedWnd->m_hWnd,fpErrorCallback)) return FALSE;
if (!capSetCallbackOnYield(pCapConcernedWnd->m_hWnd,fpYieldCallback)) return FALSE;
if (!capSetCallbackOnStatus(pCapConcernedWnd->m_hWnd,fpStatusCallback)) return FALSE;
return TRUE;
}
BOOL CVFWWrapper::ChangeFormat()
{
if (m_capDriverCaps.fHasDlgVideoFormat)
{
// oldhelpid = SetCurrentHelpContext(IDA_VIDFORMAT);
if (capDlgVideoFormat(m_pCapWnd->m_hWnd))
{
if (!capGetStatus(m_pCapWnd->m_hWnd,&m_capStatus,sizeof(CAPSTATUS))) return FALSE;
// vidcapLayout(hWnd);
}
}
else return FALSE;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -