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

📄 vfwwrapper.cpp

📁 Screen Chatting source
💻 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 + -