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