📄 okmfcview.cpp
字号:
/*==============================================================================
*
* 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 + -