📄 okmfcview.cpp
字号:
void COkMfcView::OnDispfrombuffer()
{
//序列回显
long num;
exEnableItem(IDM_FREEZE, TRUE);
okSetSeqCallback(hBoard, exBeginCapture, exBackDisplay, exEndCapture);
num = okGetBufferSize(hBoard, NULL, NULL);//
okPlaybackFrom(hBoard, BUFFER, 0, num);//
}
void COkMfcView::OnLoopfrombuffer()
{
//循环序列回显
long num;
exEnableItem(IDM_FREEZE, TRUE);
okSetSeqCallback(hBoard, exBeginCapture, exBackDisplay, exEndCapture);
num = okGetBufferSize(hBoard, NULL, NULL);//
okPlaybackFrom(hBoard, BUFFER, 0, num);//
}
void COkMfcView::OnDispfrommemory()
{
//循环序列回显内存
long num;
exEnableItem(IDM_FREEZE, TRUE);
okSetSeqCallback(hBoard, exBeginCapture, exBackDisplay, exEndCapture);
if (lpbi) {
num = dwMaxMemSize/exGetFrameSize(hBoard);
okPlaybackByBuffer(hBoard, (TARGET)lpMemory, 0, -num);
}
}
void COkMfcView::OnDispfromfile()
{
//循环序列回显文件
CSeqNum csf;
char szFileName[128]="\0";
long num;
if (!exGetLoadName(hWnd, szFileName))
return;
exEnableItem(IDM_FREEZE, TRUE);
okSetSeqCallback(hBoard, exBeginCapture, exBackDisplay, exEndCapture);
if (!stricmp(strrchr(szFileName, '.'), ".seq"))
//just get num
num = okLoadImageFile(hBoard, szFileName, 0, SCREEN, 0, 0);
else {
if (!csf.DoModal())
exEnableItem(IDM_FREEZE, FALSE);
num = iNumImage;
}
okPlaybackByBuffer(hBoard, (TARGET)szFileName, 0, -num);
}
void COkMfcView::OnCaptomonitor()
{
//显示视频输入
exEnableItem(IDM_FREEZE, TRUE);
okCaptureTo(hBoard, MONITOR, 0, 0);//0: cont.
}
void COkMfcView::OnDispfromframe()
{
//连续回显帧存
exEnableItem(IDM_FREEZE, TRUE);
okPlaybackFrom(hBoard, FRAME, 0, 0); //cont.
}
void COkMfcView::OnNormallut()
{
//正向输出
exFillOutLUT(hBoard, 0);
}
void COkMfcView::OnInverselut()
{
//反向输出
exFillOutLUT(hBoard, 1);
}
void COkMfcView::OnAbsolutelut()
{
//绝对值输出显示
exFillOutLUT(hBoard, 2);
}
void COkMfcView::OnSelectcard()
{
//选择图像卡
CSelectBox selectBox;
HANDLE hOld;
int i;
hOld=hBoard;
i = selectBox.DoModal();
if (i != 1)
return;
okSetConvertParam(hBoard,CONVERT_UPRIGHT,0); //un
okSetConvertParam(hBoard,CONVERT_MIRROR,0);
okSetCaptureParam(hBoard,CAPTURE_MISCCONTROL,0);
okCloseBoard(hOld);
hBoard = exOpenCard(hWnd);
bActive = 0;
}
void COkMfcView::OnUpdateCaptoframe(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_CapToFrame);
}
void COkMfcView::OnUpdateBuffertoframe(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_BufferToFrame);
}
void COkMfcView::OnUpdateFrametobuffer(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_FrameToBuffer);
}
void COkMfcView::OnUpdateFrametoscreen(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_FrameToScreen);
}
void COkMfcView::OnUpdateNormallut(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_NormalLut);
}
void COkMfcView::OnUpdateInverselut(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_InverseLut);
}
void COkMfcView::OnLoadfile()
{
//装入图像文件
okStopCapture(hBoard);
if (bActive){
SendMessage(WM_COMMAND, IDM_FREEZE, 0);
}
exLoadImageFile(hBoard, hWnd);
lScrnOffset=exSetToWndRectEx(hBoard, hWnd, m_Centerscreen);
InvalidateRect(NULL, TRUE);
exDisplayDIBInfo();
}
void COkMfcView::OnSavescreen()
{
exSaveScreenFile(hBoard, hWnd);
InvalidateRect(NULL, FALSE);
}
void COkMfcView::OnSavebuffer()
{
//保存缓存
exSaveBufferFile(hBoard, hWnd);
InvalidateRect(NULL, FALSE);
}
void COkMfcView::OnSettoband()
{
//置条状色带
//set gray and color bands to dib and buffer 0
LPBYTE lpLinear;
short height;
long stride;
//
lpLinear = (LPBYTE)okGetTargetInfo(hBoard, BUFFER, 0, NULL, &height, &stride);
if (lpLinear) {
exSetTestBands(lpLinear, height, stride); //buffer
exSetDataToDIB(BUFFER, 0, lpbi, (LPBYTE)lpdib);
}
else {//only dib
exSetTestBands((LPBYTE)lpdib, (short)lpbi->biHeight, lpbi->biSizeImage/lpbi->biHeight);
}
InvalidateRect(NULL, FALSE);
}
/*
* 函数介绍:获得装入文件名
* 输入参数:hWnd窗口句柄
* 输出参数:szFileName文件名
* 返 回 值:正确返回TRUE
* 错误返回FALSE
*/
BOOL COkMfcView::exGetLoadName(HWND hWnd, char *szFileName)
{
OPENFILENAME ofn;
char *szFilter=
"BMP file (*.BMP)\0*.BMP\0"
"Jpeg format file (*.JPG,JPEG)\0*.JPG;*.JPEG\0"
"Sequence file (*.SEQ)\0*.SEQ\0"
"Audio-video interleaved (*.AVI)\0*.AVI\0"
"Mpeg2 Video stream (*.M2V)\0*.M2V\0"
"TIFF file (*.TIF)\0*.TIF\0"
"GIF file (*.GIF)\0*.GIF\0"
"Raw format files (*.RAW)\0*.RAW\0"
"All Above format files \0*.BMP;*.JPG;*.JPEG;*.SEQ;*.AVI;*.M2V;*.TIF;*.GIF;*.RAW\0";
//Get file name
// fill in non-variant fields of OPENszFileName struct.
ZeroMemory(&ofn,sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = szFilter;
ofn.nFilterIndex = 8;
ofn.lpstrFile = szFileName;
ofn.nMaxFile = 128;
ofn.Flags = OFN_HIDEREADONLY;
if (!GetOpenFileName((LPOPENFILENAME)&ofn)) {
return FALSE;
}
return TRUE;
}
/*
* 函数介绍:获得保存文件名
* 输入参数:hWnd窗口句柄
* 输出参数:szFileName文件名
* 返 回 值:正确返回TRUE
* 错误返回FALSE
*/
BOOL COkMfcView::exGetSaveName(HWND hWnd, char *szFileName)
{
OPENFILENAME ofn;
char *szFilter=
"BMP file (*.BMP)\0*.BMP\0"
"Jpeg format file (*.JPG)\0*.JPG\0"
"Sequence file (*.SEQ)\0*.SEQ\0"
"Sequence file in JPEG (*.SEQ)\0*.SEQ\0"
"Audio-video interleaved (*.AVI)\0*.AVI\0"
"Compressed AVI in MJPEG (*.AVI)\0*.AVI\0"
"Compressed AVI in MPEG4 (*.AVI)\0*.AVI\0"
"Raw format files (*.RAW)\0*.RAW\0";
//Get file name
// fill in non-variant fields of OPENszFileName struct.
ZeroMemory(&ofn,sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hWnd;
ofn.lpstrFilter = szFilter;
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFileName;
ofn.nMaxFile = 128;
ofn.lpstrDefExt = "seq";
ofn.Flags = OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
if (!GetSaveFileName((LPOPENFILENAME)&ofn)) {
return FALSE;
}
if( !strnicmp(strrchr(szFileName,'.'),".seq",4) ||
!strnicmp(strrchr(szFileName,'.'),".avi",4) ||
!strnicmp(strrchr(szFileName,'.'),".m2v",4)
) {
//first delete ok.seq or .avi
DeleteFile(szFileName);
}
if(ofn.nFilterIndex==4) { //seq file in jpeg data
strcat(szFileName,",jpg,50"); //quality=50
}
else if(ofn.nFilterIndex==6) { //avi in mjpg
strcat(szFileName,",mjpg,60"); //mjpeg
}
else if(ofn.nFilterIndex==7) { //avi in mpeg4
strcat(szFileName,",mpg4"); //mpeg4
}
return TRUE;
}
/*
* 函数介绍:装入图像文件
* 输入参数:hBoard采集卡句柄
* hWnd窗口句柄
* 输出参数:无
* 返 回 值:正确返回TRUE
* 错误返回FALSE
*/
BOOL COkMfcView::exLoadImageFile(HANDLE hBoard, HWND hWnd)
{
char szFileName[128]="\0";
short total;
long length;
BLOCKINFO blkinfo;
if (!exGetLoadName(hWnd, szFileName))
return FALSE;
if (!strrchr(szFileName, '.'))
return FALSE;
if(!stricmp(strrchr(szFileName,'.'), ".seq") ||
!stricmp(strrchr(szFileName,'.'), ".avi"))
{
//first get inf about seq file
total = (short)okLoadImageFile(hBoard, szFileName, 0, (TARGET)&blkinfo, 0, 0);//no=0
//then load them into buffer
if (okLoadImageFile(hBoard, szFileName, 0, BUFFER, 0, total))
{
//last set first block to dib
exGetBitmapHeader(hBoard, BUFFER, lpbi);
exSetDataToDIB(BUFFER, 0, lpbi, (LPBYTE)lpdib);
}
}
else
{ //if( !stricmp(strrchr(szFileName,'.'),".bmp") ){//bmp
//load bmp or raw into buffer and dib
if (okGetBufferSize(hBoard, NULL, (DWORD *)&dwBufSize)) //buffer being
{
long lParam1=0, lNum=1;
CSeqNum csf;
iNumImage = (short)lNum;
if (csf.DoModal())
{
lNum = iNumImage;
}
//then load them into buffer
if (length = okLoadImageFile(hBoard, szFileName, lParam1, BUFFER, 0, lNum))
{
if (exAllocateDIBMemory(0) < length)
{
if (!exAllocateDIBMemory(length + 5120))
return 0;
}
//last set first block to dib
exGetBitmapHeader(hBoard, BUFFER, lpbi);
exSetDataToDIB(BUFFER, 0, lpbi, (BYTE *)lpdib);
}
}
else
{
//way 2
//just load to dib (& screen)
memset(&blkinfo, 0, sizeof(blkinfo)); //zero all for init
blkinfo.lpBits = NULL; //only get block info
okLoadImageFile(hBoard, szFileName, 0, (TARGET)&blkinfo, 0, 1);
//get dib for wnd paint
blkinfo.lpBits = (LPBYTE)lpdib;
blkinfo.lpExtra = (LPBYTE)((LPSTR)lpbi+lpbi->biSize); //do here
if (okLoadImageFile(hBoard, szFileName, 0, (TARGET)&blkinfo, 0, 1))
{
// set dib info
exGetBitmapHeader(hBoard, (TARGET)&blkinfo, lpbi);
exConvertBitmap(lpbi, lpdib); //invert y
}
}
}
return TRUE;
}
/*
* 函数介绍:保存屏幕图像文件 目前支持bmp,jpg,raw格式
* 输入参数:hBoard采集卡句柄
* hWnd窗口句柄
* 输出参数:无
* 返 回 值:正确返回TRUE
* 错误返回FALSE
*/
BOOL COkMfcView::exSaveScreenFile(HANDLE hBoard, HWND hWnd)
{
char szFileName[128]="\0";
BLOCKINFO blkinfo;
if (!exGetSaveName(hWnd, szFileName))
return FALSE;
if (!strrchr(szFileName, '.'))
return FALSE;
//save current dib
blkinfo.iWidth = (short)lpbi->biWidth;
blkinfo.iHeight = (short)lpbi->biHeight;
blkinfo.iBitCount = (short)lpbi->biBitCount;
blkinfo.lpBits = (LPBYTE)lpdib;
blkinfo.lpExtra = (LPBYTE)((LPSTR)lpbi+lpbi->biSize);
blkinfo.iFormType = 0; //unknown
//special for 565
if (lpbi->biBitCount == 16)
{
DWORD *lpMask=(DWORD *)blkinfo.lpExtra;
if (lpMask[1] == 0x07e0) //565
blkinfo.iFormType = FORM_RGB565;
else
blkinfo.iFormType = FORM_RGB555;
}
//first inverse dib to bitmap
exConvertBitmap(lpbi, lpdib);
okSaveImageFile(hBoard, szFileName, 0, (TARGET)&blkinfo, 0, 1);
//restore to dib
exConvertBitmap(lpbi, lpdib);
return TRUE;
}
/*
* 函数介绍:保存缓存图像文件 目前支持bmp,jpg,raw,seq格式
* 输入参数:hBoard采集卡句柄
* hWnd窗口句柄
* 输出参数:无
* 返 回 值:正确返回TRUE
* 错误返回FALSE
*/
BOOL COkMfcView::exSaveBufferFile(HANDLE hBoard, HWND hWnd)
{
char szFileName[128]="\0";
BLOCKINFO blkinfo;
CSeqNum csf;
ZeroMemory(&blkinfo,sizeof(BLOCKINFO));
if (!exGetSaveName(hWnd, szFileName)) return FALSE;
if (!strrchr(szFileName, '.')) return FALSE;
if(!strnicmp(strrchr(szFileName,'.'), ".seq", 4) ||
!strnicmp(strrchr(szFileName,'.'), ".avi", 4) ||
!strnicmp(strrchr(szFileName,'.'), ".m2v", 4))
{
//save buffer seq
total = (short)okGetBufferSize(hBoard, NULL, NULL);
okSaveImageFile(hBoard, szFileName, 0, BUFFER, 0, total);
//than set this first block to dib to see what we saved
exGetBitmapHeader(hBoard, BUFFER, lpbi);
exSetDataToDIB(BUFFER, 0, lpbi, (LPBYTE)lpdib);
}
else //bmp or bmp
{
if (okGetBufferSize(hBoard, NULL, (DWORD*)&dwBufSize)) //buffer being
{
long lNum = 1;
//how many
if (!csf.DoModal())
return FALSE;
lNum = iNumImage;
okSaveImageFile(hBoard,szFileName,1,BUFFER,0,lNum);
//than set this first block to dib to see what we saved
exGetBitmapHeader(hBoard, BUFFER, lpbi);
exSetDataToDIB(BUFFER, 0, lpbi, (LPBYTE)lpdib);
}
else //no buffer allocated
{
//save current dib
blkinfo.iWidth = (short)lpbi->biWidth;
blkinfo.iHeight = (short)lpbi->biHeight;
blkinfo.lBlockStep=0;
blkinfo.iHiStep=0;
blkinfo.iBitCount = (short)lpbi->biBitCount;
blkinfo.lpBits = (LPBYTE)lpdib;
blkinfo.lpExtra = (LPBYTE)((LPSTR)lpbi+lpbi->biSize);
blkinfo.iFormType = 0; //unknown
//special for 565
if (lpbi->biBitCount == 16)
{
DWORD *lpMask=(DWORD *)blkinfo.lpExtra;
if (lpMask[1] == 0x07e0) //565
blkinfo.iFormType = FORM_RGB565;
else
blkinfo.iFormType = FORM_RGB555;
}
//first inverse dib to bitmap
exConvertBitmap(lpbi, lpdib);
okSaveImageFile(hBoard, szFileName, 0, (TARGET)&blkinfo, 0, 1);
//restore to dib
exConvertBitmap(lpbi, lpdib);
}
}
return TRUE;
}
/*
* 函数介绍:演示如何填写输出查找表
* 输入参数:hBoard采集卡句柄
* index输出状态 0-正常 1-反向 2绝对值 3绝对值DSA显示
* 输出参数:无
* 返 回 值:正确返回TRUE
* 错误返回FALSE
*/
BOOL COkMfcView::exFillOutLUT(HANDLE hBoard, short index)
{
short i,bits,start=0;
//check how much bits LUT suppored
bits=(short)okFillOutLUT(hBoard, NULL, 0, 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -