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

📄 okmfcview.cpp

📁 OK视频采集卡VC源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*==============================================================================
*
*       filename        OkMfcView.cpp
*       purpose         exam of okdemo with MFC (Ok series image cards)
*       language        Microsoft Visual C 5.0
*       author          He Peng
*       date            00-8-20
*-----------------------
*       modify by       He Peng
*       purpose         
*       language        Microsoft Visual C 5.0 
*       date            00-10-16
*
*-----------------------
*
*		Copyright (C).  All Rights Reserved.
*
*
*==============================================================================*/

// OkMfcView.cpp : implementation of the COkMfcView class
//

#include "stdafx.h"
#include "OkMfc.h"

#include "OkMfcDoc.h"
#include "OkMfcView.h"

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

#include "vfw.h"
#include "okapi32.h"
#include "infobox.h"
#include "signbox.h"
#include "selectbox.h"
#include "seqnum.h"
#include "setsnumbox.h"
#include "setbnumbox.h"
#include "setcsizebox.h"
#include "bufferbox.h"

#include "conio.h"

const		NUMINFILE = 30;			//标准采集帧数,现不用

		HDC			hDC;
		CDC*		cdc;

//----global variables for board--------
CStatusBar*		sBar;				//状态栏指针

typedef struct _wavfileheader 
{
	char	RIFF[4];
	long	lFileLength;
	char	WAVE[4];
	char	fmt[4];
	long	lHeadSize;

	//PCMWAVEFORMAT pcmheader;	
	WORD	wFormatTag;
	WORD	nChannels;
	DWORD	nSamplesPerSec;
	DWORD	nAvgBytesPerSec;
	WORD	nBlockAlign;
	WORD	wBitsPerSample;
	char	data[4];
	long	lDataLength;
} WAVEFILEHEADER;

WAVEFILEHEADER waveheader;

HANDLE	hAudio;
long	elapsedtimes;
HFILE	hFile;
HPEN	hPen;
char	str[100];
HDC		hdc;
char	lastaudio[1024];

HWND		hWnd;					//应用程序窗口句柄
HWND		hwnd;
HANDLE		hBoard;					//采集卡句柄
BYTE		bActive = 0;			//实时采集标志
short		total = 2;				//全部采集卡数量
long		iCurrUsedNo = -1;		//当前采集卡

short		iNumImage = NUMINFILE;	//采集帧数

long		lScrnOffset;			//采集窗口偏移
short		sampwidth, sampheight;	//采集窗口宽度、高度

short		bMatchClient = 0;		//匹配用户窗   由m_MatchClient代替
short		bMakeMirror = 0;		//软件x,y方向镜象
int			iClientWidth;			//客户区宽度
int			iClientHeight;			//客户区高度

LPSTR		seqfile = "ok.seq";		//采集文件默认名称
DWORD		dwMaxMemSize = 30*1024*1024;	//最大内存大小
long		dwBufSize;				//最大缓存大小


LPBITMAPINFOHEADER	lpbi;			//采集目标体格式文件头
LPSTR				lpdib;			//采集目标体数据
LPSTR				lpMemory;		//用户内存指针
BLOCKINFO			blkinfo;		//用户结构指针结构变量


BOOL				bDispToScreen;	//显示到屏幕状态位

int		iNum = 2;					//多卡或多通道采集数量
int		NoCapture = 2;
HANDLE	lphBoard[] = {0, 0, 0, 0, 0};


//----local functions-------------------------------------
long exGetTargetSize(HANDLE hBoard, TARGET tgt, short *width, short *heigth);
long exSetBitmapHeader(LPBITMAPINFOHEADER lpbi, short width, short height, short bits, short form);

BOOL CALLBACK exBeginCapture(HANDLE hBoard);
BOOL CALLBACK exBackDisplay(HANDLE hBoard, long no);
BOOL CALLBACK exSetToScreen(HANDLE hBoard, long no);
BOOL CALLBACK exEndCapture(HANDLE hBoard);

long exGetFrameSize(HANDLE hBoard);
BOOL exConvertBitmap(LPBITMAPINFOHEADER lpbi, LPSTR lpdib);
BOOL exSetTestBands(LPBYTE lpLinear, short height, long stride);

/////////////////////////////////////////////////////////////////////////////
// COkMfcView

IMPLEMENT_DYNCREATE(COkMfcView, CView)

BEGIN_MESSAGE_MAP(COkMfcView, CView)
	//{{AFX_MSG_MAP(COkMfcView)
	ON_COMMAND(IDM_ACTIVE, OnActive)
	ON_WM_DESTROY()
	ON_COMMAND(IDM_FREEZE, OnFreeze)
	ON_COMMAND(IDM_SINGLECAPTO, OnSinglecapto)
	ON_WM_PAINT()
	ON_COMMAND(IDM_ABOUT, OnAbout)
	ON_COMMAND(IDM_EXTTRIGGER, OnExttrigger)
	ON_COMMAND(IDM_SIGNALEINFO, OnSignaleinfo)
	ON_COMMAND(IDM_BACKTOSCREEN, OnBacktoscreen)
	ON_UPDATE_COMMAND_UI(IDM_BACKTOSCREEN, OnUpdateBacktoscreen)
	ON_COMMAND(IDM_CAPTOBUFFER, OnCaptobuffer)
	ON_COMMAND(IDM_LOOPTOBUFFER, OnLooptobuffer)
	ON_COMMAND(IDM_SETUPVIDEO, OnSetupvideo)
	ON_COMMAND(IDM_CAPSEQUENCE, OnCapsequence)
	ON_UPDATE_COMMAND_UI(IDM_CENTERSCREEN, OnUpdateCenterscreen)
	ON_COMMAND(IDM_CENTERSCREEN, OnCenterscreen)
	ON_UPDATE_COMMAND_UI(IDM_ENABLEMASK, OnUpdateEnablemask)
	ON_COMMAND(IDM_ENABLEMASK, OnEnablemask)
	ON_COMMAND(IDM_REPLAYBUFFER, OnReplaybuffer)
	ON_COMMAND(IDM_REPLAYMEMORY, OnReplaymemory)
	ON_COMMAND(IDM_REPLAYFILE, OnReplayfile)
	ON_COMMAND(IDM_BUFFERTOSCREEN, OnBuffertoscreen)
	ON_COMMAND(IDM_SCREENTOBUFFER, OnScreentobuffer)
	ON_COMMAND(IDM_BUFFER0TOBUFFER1, OnBuffer0tobuffer1)
	ON_COMMAND(IDM_BUFFER1TOBUFFER0, OnBuffer1tobuffer0)
	ON_COMMAND(IDM_BUFFERTOFRAME, OnBuffertoframe)
	ON_COMMAND(IDM_FRAMETOBUFFER, OnFrametobuffer)
	ON_COMMAND(IDM_FRAMETOSCREEN, OnFrametoscreen)
	ON_COMMAND(IDM_CAPTOMEMORY, OnCaptomemory)
	ON_COMMAND(IDM_CAPTOSEQFILE, OnCaptoseqfile)
	ON_COMMAND(IDM_CAPTOINDIRECT, OnCaptoindirect)
	ON_COMMAND(IDM_CAPTODIRECT, OnCaptodirect)
	ON_COMMAND(IDM_CAPTOFOREVER, OnCaptoforever)
	ON_COMMAND(IDM_CONTTOBUFFER0, OnConttobuffer0)
	ON_COMMAND(IDM_CONTTOBUFFER1, OnConttobuffer1)
	ON_COMMAND(IDM_CAPTOFRAME, OnCaptoframe)
	ON_COMMAND(IDM_DISPFROMBUFFER, OnDispfrombuffer)
	ON_COMMAND(IDM_LOOPFROMBUFFER, OnLoopfrombuffer)
	ON_COMMAND(IDM_DISPFROMMEMORY, OnDispfrommemory)
	ON_COMMAND(IDM_DISPFROMFILE, OnDispfromfile)
	ON_COMMAND(IDM_CAPTOMONITOR, OnCaptomonitor)
	ON_COMMAND(IDM_DISPFROMFRAME, OnDispfromframe)
	ON_COMMAND(IDM_NORMALLUT, OnNormallut)
	ON_COMMAND(IDM_INVERSELUT, OnInverselut)
	ON_COMMAND(IDM_SELECTCARD, OnSelectcard)
	ON_UPDATE_COMMAND_UI(IDM_CAPTOFRAME, OnUpdateCaptoframe)
	ON_UPDATE_COMMAND_UI(IDM_BUFFERTOFRAME, OnUpdateBuffertoframe)
	ON_UPDATE_COMMAND_UI(IDM_FRAMETOBUFFER, OnUpdateFrametobuffer)
	ON_UPDATE_COMMAND_UI(IDM_FRAMETOSCREEN, OnUpdateFrametoscreen)
	ON_UPDATE_COMMAND_UI(IDM_NORMALLUT, OnUpdateNormallut)
	ON_UPDATE_COMMAND_UI(IDM_INVERSELUT, OnUpdateInverselut)
	ON_COMMAND(IDM_LOADFILE, OnLoadfile)
	ON_COMMAND(IDM_SAVESCREEN, OnSavescreen)
	ON_COMMAND(IDM_SAVEBUFFER, OnSavebuffer)
	ON_COMMAND(IDM_SETTOBAND, OnSettoband)
	ON_COMMAND(IDM_PRINTPIC, OnPrintpic)
	ON_WM_MOUSEMOVE()
	ON_COMMAND(IDM_SYSHELP, OnSyshelp)
	ON_COMMAND(IDM_CORR, OnCorr)
	ON_COMMAND(IDM_SETTOZERO, OnSettozero)
	ON_UPDATE_COMMAND_UI(IDM_SINGLECAPTO, OnUpdateSinglecapto)
	ON_COMMAND(IDM_ABSOLUTELUT, OnAbsolutelut)
	ON_COMMAND(IDM_MULCHANCAP, OnMulchancap)
	ON_COMMAND(IDM_MULCHANCAPSUB, OnMulchancapsub)
	ON_COMMAND(IDM_ASYNCMULCAP, OnAsyncmulcap)
	ON_COMMAND(IDM_SYNCMULCAP, OnSyncmulcap)
	ON_UPDATE_COMMAND_UI(IDM_MATCHCLIENT, OnUpdateMatchclient)
	ON_COMMAND(IDM_MATCHCLIENT, OnMatchclient)
	ON_COMMAND(IDM_SETMATCHSIZE, OnSetmatchsize)
	ON_WM_MOVE()
	ON_UPDATE_COMMAND_UI(IDM_CAPTUREAUDIO, OnUpdateCaptureaudio)
	ON_COMMAND(IDM_COPYTOCLIPB, OnCopytoclipb)
	ON_COMMAND(IDM_SETALLOCBUF, OnSetallocbuf)
	ON_COMMAND(IDM_CAPTUREAUDIO, OnCaptureaudio)
	ON_COMMAND(IDM_SEQCAPTOBUF, OnSeqcaptobuf)
	ON_UPDATE_COMMAND_UI(IDM_SEQCAPTOBUF, OnUpdateSeqcaptobuf)
	ON_COMMAND(IDM_REGDEVDRIVER, OnRegdevdriver)
	ON_UPDATE_COMMAND_UI(IDM_REGDEVDRIVER, OnUpdateRegdevdriver)
	ON_COMMAND(IDM_CAPTOPSEUDO, OnCaptopseudo)
	ON_UPDATE_COMMAND_UI(IDM_MAKEXMIRROR, OnUpdateMakexmirror)
	ON_UPDATE_COMMAND_UI(IDM_MAKEYMIRROR, OnUpdateMakeymirror)
	ON_COMMAND(IDM_MAKEXMIRROR, OnMakexmirror)
	ON_COMMAND(IDM_MAKEYMIRROR, OnMakeymirror)
	ON_WM_SIZE()
	ON_COMMAND(IDM_ZEROALLBUFFER, OnZeroallbuffer)
	ON_UPDATE_COMMAND_UI(IDM_UPTORIGHT, OnUpdateUptoright)
	ON_UPDATE_COMMAND_UI(IDM_UPTOLEFT, OnUpdateUptoleft)
	ON_COMMAND(IDM_TESTVGACARD, OnTestvgacard)
	ON_COMMAND(IDM_TESTDRAWWND, OnTestdrawwnd)
	ON_COMMAND(IDM_UPTORIGHT, OnUptoright)
	ON_COMMAND(IDM_UPTOLEFT, OnUptoleft)
	ON_UPDATE_COMMAND_UI(IDM_CAPTUREMPEG2, OnUpdateCapturempeg2)
	ON_COMMAND(IDM_CAPTUREMPEG2, OnCapturempeg2)
	ON_COMMAND(IDM_LOADCONFIGFILE, OnLoadconfigfile)
	ON_COMMAND(IDM_SAVECONFIGFILE, OnSaveconfigfile)
	ON_COMMAND(IDM_ABSOLUTEDSA, OnAbsolutedsa)
	ON_UPDATE_COMMAND_UI(IDM_ABSOLUTELUT, OnUpdateAbsolutelut)
	ON_UPDATE_COMMAND_UI(IDM_ABSOLUTEDSA, OnUpdateAbsolutedsa)
	ON_COMMAND(IDM_NORMAINLUT, OnNormainlut)
	ON_COMMAND(ID_SETTOZERO, OnSettozero)
	ON_COMMAND(IDM_INVERSEINLUT, OnInverseinlut)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// COkMfcView construction/destruction

COkMfcView::COkMfcView()
{
}

COkMfcView::~COkMfcView()
{
}

BOOL COkMfcView::PreCreateWindow(CREATESTRUCT& cs)
{
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// COkMfcView drawing

void COkMfcView::OnDraw(CDC* pDC)
{
	COkMfcDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
}

/////////////////////////////////////////////////////////////////////////////
// COkMfcView printing

BOOL COkMfcView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void COkMfcView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
}

void COkMfcView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
}

/////////////////////////////////////////////////////////////////////////////
// COkMfcView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// COkMfcView message handlers

long exAllocateDIBMemory(long lExpectSize)
{
	char	string[100];

	if(lExpectSize) {//new size memory wanted
		if( lpbi ) {
			GlobalFree(lpbi);
		}
		dwMaxMemSize=lExpectSize;
		lpbi=(LPBITMAPINFOHEADER)GlobalAlloc(GPTR,lExpectSize);
		//GlobalMemoryStatus(&Status);

		if(lpbi==NULL) { //if not allocated
			dwMaxMemSize=4*(1<<20); //4M
			lpbi=(LPBITMAPINFOHEADER)GlobalAlloc(GPTR,dwMaxMemSize);
		}
		lpdib=(char *)lpbi+5120; //keep 5k for bi
		lpMemory=(char *)lpbi+2048*1024; //keep 2M for dib
		if(dwMaxMemSize >2048*1024+5120)
			dwMaxMemSize-=2048*1024+5120;

		if(!lpbi) { //still zero
			sprintf(string,"Allocate memory failed !");
			MessageBox(hWnd, string,"Warning",MB_OK);
			return FALSE;
		} else {
			sprintf(string,"Allocated memory = %d",dwMaxMemSize);
		}
	}

	return (dwMaxMemSize+2048*1024+5120);
}

int	exStopMulCapture()
{
	int		i;

	if (NoCapture) 
	{
		for(i=0; i<NoCapture; i++) 
		{
			okStopCapture(lphBoard[i]);
			//close specified board
			okCloseBoard(lphBoard[i]);
		}
		okUnlockAllBuffer();
	}

	NoCapture=0; //clear

	return 1;
}

void COkMfcView::OnActive() 
{
	//实时显示

	//must to not match
	m_MatchClient = 0;

	//must not to upright
	m_UptoRightCheck = FALSE;
	m_UptoLeftCheck = FALSE;
	okSetConvertParam(hBoard, CONVERT_UPRIGHT, 0); //un to upright

	exGetBitmapHeader(hBoard, SCREEN, lpbi); 
	lScrnOffset = exSetToWndRectEx(hBoard, hWnd, m_Centerscreen); 
	//UpdateWindow();

	okStopCapture(hBoard); //confirm
	//specail capture to frame
	if (okGetTypeCode(hBoard, NULL) == OK_C70) 
	{
		okCaptureTo(hBoard, FRAME, 0, 0);
		exEnableItem(IDM_ACTIVE, FALSE);
		exEnableItem(IDM_FREEZE, TRUE);
	} //normal to screen
	else 
	{
		if(okCaptureToScreen(hBoard) <= 0)
			MessageBox("Please try 256 color mode for B/W grabber, and 24 bits mode for color grabber.");
		else 
		{
			exEnableItem(IDM_ACTIVE, FALSE);
			exEnableItem(IDM_FREEZE, TRUE);
			bActive = 1;
		}
	}
	sBar->SetPaneText(0, "正在实时显示");
}

BOOL COkMfcView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	BOOL b;

	b = CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
	hwnd = pParentWnd->GetSafeHwnd();	
	exGetInitSet(hWnd);
	hBoard = exOpenCard(hWnd);
	//make mirror when convert
	okSetConvertParam(hBoard, CONVERT_MIRROR, bMakeMirror);
	hWnd = GetSafeHwnd();			//have problem
	return b;
}


void COkMfcView::OnDestroy() 
{
	CView::OnDestroy();
	exStopMulCapture(); //to stop in case mul-capturing
	okSetConvertParam(hBoard,CONVERT_UPRIGHT,0); //un
	okSetConvertParam(hBoard,CONVERT_MIRROR,0);
	okSetCaptureParam(hBoard,CAPTURE_MISCCONTROL,0);
	okCloseBoard(hBoard); 
	if(hAudio) //audio opened
		okCloseAudio(hAudio);
	GlobalFree((HGLOBAL)lpbi);  
	lpdib = 0;
	exSaveInitSet();
}

exEndCaptureAudio(HANDLE hAudio)
{
	if (hAudio) 
	{
		elapsedtimes = GetTickCount() - elapsedtimes;
		sprintf(str," Stoped ! captured times = %d ms",elapsedtimes);
		AfxGetApp()->m_pMainWnd->SetWindowText(str);
		ReleaseDC(AfxGetApp()->m_pMainWnd->GetSafeHwnd(), hdc);
		
		okStopCaptureAudio(hAudio);
		okCloseAudio(hAudio);
		hAudio = 0;

		//way1 and way2 end file

	}

	return 1;
}

void COkMfcView::OnFreeze() 
{
	//停止
	if (hAudio)  //audio capturing
		exEndCaptureAudio(hAudio);

	exStopMulCapture(); //to stop in case mul-capturing

	okStopCapture(hBoard);
	ValidateRect(NULL);
	if (bActive) 
	{	
		//take buffer size
		exGetBitmapHeader(hBoard, BUFFER, lpbi); 
		exSetDataToDIB(SCREEN, 0, lpbi, (unsigned char *)lpdib);
		//exGetBitmapData(hBoard, SCREEN, 0, lpbi, lpdib);
		exDisplayDIBInfo();
	}
	bActive = 0;
	exEnableItem(IDM_FREEZE, FALSE);
	exEnableItem(IDM_ACTIVE, TRUE);
}

/*
* 函数介绍:显示当前采集信息
*			在标准C演示程序中将信息显示在标题栏
*			在该演示程序中显示在状态栏
*			但输入参数格式保留
* 输入参数:窗口句柄
* 输出参数:无
* 返 回 值:无
*/
void COkMfcView::exDisplayDIBInfo(void)
{

	char	string[200];

	sprintf(string,"%d x %d x %d", lpbi->biWidth, lpbi->biHeight, lpbi->biBitCount);
	if (lpbi->biWidth)
		sBar->SetPaneText(0,string);
}

void COkMfcView::OnSinglecapto() 
{
	//单帧采
	bActive = 0;
	exEnableItem(IDM_FREEZE, FALSE);
	exEnableItem(IDM_ACTIVE, TRUE);

	if (okGetTypeCode(hBoard,NULL) == OK_C70)   //to frame
	{
		okCaptureTo(hBoard, FRAME, 0, 1);
		okGetCaptureStatus(hBoard, 1);
		if (okConvertRect(hBoard, SCREEN, 0, FRAME, 0, 1) > 0)
		{
			//take buffer size
			exGetBitmapHeader(hBoard, BUFFER, lpbi); 
			exSetDataToDIB(SCREEN, 0, lpbi, (LPBYTE)lpdib);
		}
	}
	else
	{
		long	times;

⌨️ 快捷键说明

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