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

📄 okmfcview.cpp

📁 OK视频采集卡VC源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:

	if(	bits<=8) //for 8 bits lut
	{	
		BYTE	bLUT[768][3];
		short	iLUT[256],num=255,gray=256;

		switch (index) {
			case 0: //normal
				for(i=0;i<gray;i++) {
					bLUT[i][0]=(BYTE)i;
					bLUT[i][1]=(BYTE)i;
					bLUT[i][2]=(BYTE)i;
				}
				break;
			case 1: //inverse
				for(i=0;i<=num;i++) {
					bLUT[i][0]=(BYTE)(num-i);
					bLUT[i][1]=(BYTE)(num-i);
					bLUT[i][2]=(BYTE)(num-i);
				}
				for(i=num;i<gray;i++) {
					bLUT[i][0]=0;
					bLUT[i][1]=0;
					bLUT[i][2]=0;
				}
				break;
			case 2: //absolute for M60A
				for(i=0;i<128;i++) {
					bLUT[i][0]=(BYTE)(i);
					bLUT[i][1]=(BYTE)(i);
					bLUT[i][2]=(BYTE)(i);
				}
				for(i=128;i<gray;i++) {
					bLUT[i][0]=(BYTE)(256-i);
					bLUT[i][1]=(BYTE)(256-i);
					bLUT[i][2]=(BYTE)(256-i);
				}
				break;

			case 3: //dsa absolute for M60A
				//1. take true value with minus
				for(i=0;i<128;i++) { //>0  0~127
					iLUT[i]=(BYTE)(i);
				}
				for(i=128;i<gray;i++) { //<0 -1~-128
					iLUT[i]=(i-256);
				}
				//2. inverse at gray 165
				for(i=0;i<256;i++) { //37~293
					iLUT[i]=165-iLUT[i];
				}
				//3. stretch in several sects 
				for(i=0;i<256;i++) { //12~245
					if( iLUT[i]<105) { //12~35
						iLUT[i]=(short)(0.334*iLUT[i]);
					}
					else if( iLUT[i]<165) {//35~150
						iLUT[i]=(short)(1.916*iLUT[i]-166);
					}
					else if( iLUT[i]<205) {//150~245
						iLUT[i]=(short)(2.38*iLUT[i]-242);
					}
					else { //245~255
						iLUT[i]=(short)(0.113*iLUT[i]+222);
					}
				}
				//4. to lut in byts
				for(i=0;i<256;i++) { 
					bLUT[i][0]=(char)iLUT[i];
					bLUT[i][1]=(char)iLUT[i];
					bLUT[i][2]=(char)iLUT[i];
				}
				break;
			default:
				return 0;
		}
		okFillOutLUT(hBoard, (LPBYTE)bLUT, start, gray);	

	}
	else { //for great than 8 bits lut
		WORD	wLUT[4096][3];
		short	num,gray;

		gray=(1<<bits);
		num=gray-1;
		switch (index) {
			case 0: //normal
				for(i=0;i<gray;i++) {
					wLUT[i][0]=i;
					wLUT[i][1]=i;
					wLUT[i][2]=i;
				}
				break;
			case 1: //inverse
				for(i=0;i<=num;i++) {
					wLUT[i][0]=(num-i);
					wLUT[i][1]=(num-i);
					wLUT[i][2]=(num-i);
				}
				break;
			default:
				return -1;
		}
		okFillOutLUT(hBoard, (LPBYTE)wLUT, start, gray);	
	}

	return 1;
}

//--demo to fill outlut to these cards with out LUT
/*
* 函数介绍:演示如何填写输入查找表
* 输入参数:hBoard采集卡句柄
*			index输出状态 0-正常 1-反向
* 输出参数:无
* 返 回 值:正确返回TRUE
*			错误返回FALSE
*/
BOOL COkMfcView::exFillInputLUT(HANDLE hBoard, short index)
{
	short	i,bits,start=0;

	//check how much bits LUT suppored
	bits=(short)okFillInputLUT(hBoard, NULL, 0, 0);
	if(bits==-1)
		return -1; //not support
	
	if(	bits<=8) //for 8 bits lut
	{	
		BYTE	bLUT[768][3];
		short	num=255,gray=256;

		switch (index) {
			case 0: //normal
				for(i=0;i<gray;i++) {
					bLUT[i][0]=(BYTE)i;
					bLUT[i][1]=(BYTE)i;
					bLUT[i][2]=(BYTE)i;
				}
				break;
			case 1: //inverse
				for(i=0;i<num;i++) {
					bLUT[i][0]=(BYTE)(num-i);
					bLUT[i][1]=(BYTE)(num-i);
					bLUT[i][2]=(BYTE)(num-i);
				}
				for(i=num;i<gray;i++) {
					bLUT[i][0]=0;
					bLUT[i][1]=0;
					bLUT[i][2]=0;
				}
				break;
			default:
				return 0;
		}
		okFillInputLUT(hBoard, (LPBYTE)bLUT, start, gray);	

	}
	else { //for great than 8 bits lut
		WORD	wLUT[4096][3];
		short	gray;

		gray=(1<<bits);

		switch (index) {
			case 0: //normal
				for(i=0;i<gray;i++) {
					wLUT[i][0]=i;
					wLUT[i][1]=i;
					wLUT[i][2]=i;
				}
				break;
			case 1: //inverse
				for(i=0;i<gray;i++) {
					wLUT[i][0]=(gray-i-1);
					wLUT[i][1]=(gray-i-1);
					wLUT[i][2]=(gray-i-1);
				}
				break;
			default:
				return -1;
		}
		okFillInputLUT(hBoard, (LPBYTE)wLUT, start, gray);	
	}

	return 1;
}

//switch menu freeze/active
void COkMfcView::exEnableItem(int iMenuID, BOOL bEnable)
{
	CMenu*	cMenu;

	cMenu = AfxGetApp()->m_pMainWnd->GetMenu();
	if (bEnable) 
		cMenu->EnableMenuItem(iMenuID, MF_BYCOMMAND|MF_ENABLED);
	else
		cMenu->EnableMenuItem(iMenuID, MF_BYCOMMAND|MF_GRAYED);

	AfxGetApp()->m_pMainWnd->DrawMenuBar();
}

/*
* 函数介绍:演示如何实现位屏蔽
* 输入参数:无
* 输出参数:无
* 返 回 值:无
*/
void COkMfcView::exDemoMask()
{
	int		i;
	RECT	rect;
	BYTE	lpMask[40960];
	BLOCKINFO	blk;
	LOGFONT 	lfLogFont = {-20, 0, 0, 0, 400, 0, 0, 0, 0, 1, 2, 1, 26, "Arial"};
	SETTEXTMODE	textmode = {0x0, 0xffffff, 2, 0, 0};  //

	//1. way (to set whole rect to enable/disable)
	//graph 1.
	rect.left = 200;
	rect.top = 100;
	rect.right = 280;
	rect.bottom = 180;
	okSetMaskRect(hBoard, &rect, (LPBYTE)0); //disable Big Rect video 
	InflateRect(&rect, -20, -20);	
	okSetMaskRect(hBoard, &rect, (LPBYTE)1); //enable Small Rect video 

	//graph 2.
	SetRect(&rect, 0, 200, 200, 201);
	okSetMaskRect(hBoard, &rect, (LPBYTE)0);  //D ---
	SetRect(&rect, 0, 202, 200, 203);
	okSetMaskRect(hBoard, &rect, (LPBYTE)0);  //D ---
	SetRect(&rect, 0, 205, 200, 206);
	okSetMaskRect(hBoard, &rect, (LPBYTE)0);  //D ---



	//2. way (to set mask rect with each pixel setting)

	//graph 3.
	ZeroMemory(lpMask, 20000); //clear bits 
	for(i=20; i<80; i++)
		lpMask[100+i] = 1;		//E ~~~

	for(i=1; i<99; i++)
		lpMask[100*50+i] = 1;	//E ---
	for(i=1; i<99; i++)
		lpMask[i*100+50] = 1;	//E  |

	for(i=0; i<=99; i++) 
		lpMask[i*100+i] = 1;	//E  /
	SetRect(&rect, 10, 310, 110, 410); //Disable Rect with + \ ~
	okSetMaskRect(hBoard, &rect, lpMask);

	//graph 4.
	FillMemory(lpMask, 40000, 1); //set bits 
	for(i=1; i<99; i++)
		lpMask[5000+i] = 0;		//D ---
	for(i=1; i<99; i++)
		lpMask[i*100+50] = 0;	//D  |
	SetRect(&rect, 200, 319, 300, 419);	 //disable +
	okSetMaskRect(hBoard, &rect, lpMask);


	//example to set char
	{
		RECT		rect = {0, 0, 0, 0};


		FillMemory(lpMask, 40000, 1); //set bits to init 
		blk.lpBits = lpMask;
		blk.iBitCount = 8;
		blk.iWidth = 100;
		blk.iHeight = 30; 
		okSetTextTo(hBoard, (TARGET)&blk, &rect, &lfLogFont, &textmode, "嘉恒中自", 8); 

		SetRect(&rect, 300, 200, 300+100, 200+30);	 //set characters
		okSetMaskRect(hBoard, &rect, lpMask);


		FillMemory(lpMask, 40000, 1); //set bits to init 
		SetRect(&rect, 0, 0, 0, 0);	 //set characters
		okSetTextTo(hBoard, (TARGET)&blk, &rect, &lfLogFont, &textmode, "JoinHope", 8); 
		SetRect(&rect, 300, 240, 300+100, 240+30);	 //set chinese characters
		okSetMaskRect(hBoard, &rect, lpMask);

	}

	//example to set char and graphics by way of windows hdc
	{
		HANDLE	hDCBitmap;
		HDC		hdcMem;
		RECT	rect= {0,0,200,100};

		FillMemory(lpMask,40000,1); //set bits to init 
		blk.lpBits=lpMask;
		blk.iBitCount=8;
		blk.iWidth=200;
		blk.iHeight=100; 

		hdcMem=okCreateDCBitmap( hBoard, (TARGET)&blk, &hDCBitmap);

		SetTextColor(hdcMem,0xffffff); //cf
		SetBkColor(hdcMem,0); //cf
		TextOut(hdcMem,100,0,"7123456",7);
		MoveToEx(hdcMem,100,100,NULL);
		LineTo(hdcMem,200,500);
		Ellipse(hdcMem,0,0,200,100);

		okMapDCBitmapTo(hDCBitmap,0);

		okFreeDCBitmap(hDCBitmap);

		okSetMaskRect(hBoard,&rect,lpMask);

	}					

	//turn on mask
	okEnableMask(hBoard, m_Enablemask); //1 positive mask
	//okEnableMask(hBoard,2); //2 negtive mode
}

/*
* 函数介绍:获得演示程序设置
* 输入参数:hBoard采集卡句柄
* 输出参数:无
* 返 回 值:正确返回TRUE
*			错误返回FALSE
*/
short COkMfcView::exGetInitSet(HWND hWnd)
{
	m_Centerscreen = GetPrivateProfileInt("Init", "Centerize", 1, "OkDemo.ini");

	bMatchClient = GetPrivateProfileInt("Init", "MatchClient", 0, "OkDemo.ini");
	if (bMatchClient)
		m_MatchClient = TRUE;
	else
		m_MatchClient = FALSE;

	iClientWidth = GetPrivateProfileInt("Init", "ClientWidth", 0, "OkDemo.ini");
	iClientHeight = GetPrivateProfileInt("Init", "ClientHeight", 0, "OkDemo.ini");

	return 1;
}

/*
* 函数介绍:演示如何保存程序设置
* 输入参数:无
* 输出参数:无
* 返 回 值:1
*/
short COkMfcView::exSaveInitSet(void)
{
	char	string[20];

	sprintf(string, "%d", m_Centerscreen);
	WritePrivateProfileString("Init", "Centerize", string, "OkDemo.ini");

	if (m_MatchClient)
		sprintf(string, "%d", 1);
	else
		sprintf(string, "%d", 0);
	WritePrivateProfileString("Init", "MatchClient", string, "OkDemo.ini");

	sprintf(string,"%d", bMakeMirror);
	WritePrivateProfileString("Init", "MakeMirror", string, "OkDemo.ini");

	sprintf(string, "%d", iClientWidth);
	WritePrivateProfileString("Init", "ClientWidth", string, "OkDemo.ini");
	sprintf(string, "%d", iClientHeight);
	WritePrivateProfileString("Init", "ClientHeight", string, "OkDemo.ini");

	return 1;
}

/*
* 函数介绍:设置显示图像位置
* 输入参数:hBoard 采集卡句柄
*			hWnd 应用程序句柄
*			lMode 显示方式 0-左上角 1-中心
* 输出参数:无
* 返 回 值:显示图像相对位置
*/
//--demo to set current capture rect on screen. mode=0: left-top, 1:centerize
long COkMfcView::exSetToWndRectEx(HANDLE hBoard, HWND hWnd, long lMode)
{
	long	lSize;
	RECT	rect;
	
	if (!IsWindow(hWnd)) return FALSE;

	if (IsIconic()) return FALSE;

	//get client rect
	GetClientRect(&rect);
	okSetToWndRect(hBoard, hWnd);

	if (lMode == 1)  //set to center
	{
		short		width,height;
		//get available rect size
		//lSize=okSetVideoParam(hBoard,VIDEO_AVAILRECTSIZE,-1);
		//or set to expected size
		//sampwidth=LOWORD(lSize);
		//sampheight=HIWORD(lSize);
		if (okGetCaptureStatus(hBoard, 0))  //capturing
		{
			width = sampwidth;
			height = sampheight;
		}
		else  //frozen status
		{
			width = (short)lpbi->biWidth;
			height = (short)lpbi->biHeight;
		}
		if (rect.right > width)
			rect.left = (rect.right - width )/2;//& (~0x3);
		if ((rect.bottom) > height)
			rect.top = (rect.bottom - height )/2;
	}

	//make offset x,y
	lSize = MAKELONG(rect.left, rect.top);
	rect.right = rect.left + min(sampwidth, rect.right);
	rect.bottom = rect.top + min(sampheight, rect.bottom);

	//map to absolute screen rect
	//::MapWindowPoints(hWnd, HWND_DESKTOP, (LPPOINT)&rect, 2);
	MapWindowPoints((CWnd*)HWND_DESKTOP,(LPPOINT)&rect,2);

	if (m_MatchClient == 0) //need not to match client rect
		okSetTargetRect(hBoard, SCREEN, &rect);

	return lSize;

}

/*
* 函数介绍:打开采集卡 并初始化设置
* 输入参数:hWnd 应用程序句柄
* 输出参数:无
* 返 回 值:成功返回图像卡句柄
*			失败返回NULL
*/
HANDLE	COkMfcView::exOpenCard(HWND hWnd)
{
	short	typecode, iNoBoards;
	HMENU	hMenu;

	//check ok boards sloted in PC
	iNoBoards = okGetSlotBoard(NULL);

	//check if pre_allocated buffer
	okGetAvailBuffer(NULL, (DWORD*)&dwBufSize);
	//okGetBufferSize(hBoard,NULL,&dwBufSize);//			

	//check if reg device driver for nt/2k/xp 
	if (!okSetNTDriver(0)) { // TRUE:registered already, -1:not nt system
		MessageBox("There are not yet registered device service driver!");
	}
	else if (okSetNTDriver(0) == -1) { //win95/98
		if( !iNoBoards && (!okSetStaticVxD(0)) ) 
			MessageBox("There are not yet registered vxd device driver!");
	}
	else {
		if(dwBufSize==0) //may be not reg driver, or no board, ... 
			MessageBox("There are no buffer pre-allocated !");
	}

	//just starting, then allocated memory for dib
	if (!lpbi) 
	{ 
		//GlobalMemoryStatus(&Status);

		//determaine how many memory will be allocated as user memory
		//dwMaxMemSize=Status.dwTotalPhys-dwBufSize-32*(1<<20); //I'd keep 32M for window system
		//if(dwMaxMemSize<=0)
		//	dwMaxMemSize=5*(1<<20); //5M
		//else if( dwMaxMemSize>Status.dwAvailPhys )
		//	dwMaxMemSize=Status.dwAvailPhys/2;

		//if( dwMaxMemSize<5*(1<<20) ) //need 5M at least for user memory
		//	dwMaxMemSize=max(5*(1<<20),Status.dwAvailPhys);

		dwMaxMemSize = (10*(1<<20)); //10M
		exAllocateDIBMemory(dwMaxMemSize);
	}

	//open one specified board
	if (!(hBoard = okOpenBoard(&iCurrUsedNo))) //set 
	{
	//if( !(hBoard=okOpenImageBoard(-1)) ) //select default 
		long	error;
		error = okGetLastError();
		if (error == ERR_NOTFOUNDBOARD)
			MessageBox("Not found Ok series Image Board !");
		else if (error == ERR_NOTFOUNDVXDDRV)
			MessageBox("Not found VxD driver for Ok series Image Board !");
		else
			MessageBox("Open selected board failed!");

		return false;
	}

	exGetBitmapHeader(hBoard, SCREEN, lpbi); 
	//set initial size
	sampwidth = (short)lpbi->biWidth;
	sampheight = (short)lpbi->biHeight;
	//initailize screen
	lScrnOffset = exSetToWndRectEx(hBoard, hWnd, m_Centerscreen);
	InvalidateRect(NULL, FALSE);

	
	okSetConvertParam(hBoard, CONVERT_UPRIGHT, 0); //init to normal 
	m_UptoRight = TRUE;
	m_UptoLeft = TRUE;
	m_UptoRightCheck = FALSE;
	m_UptoLeftCheck = FALSE;

⌨️ 快捷键说明

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