📄 test_grapview.cpp
字号:
// test_grapView.cpp : implementation of the CTest_grapView class
//
#include "stdafx.h"
#include "test_grap.h"
#include "test_grapDoc.h"
#include "test_grapView.h"
#include "..\\gy_grap.h"
#include "CaijiDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTest_grapView
CTest_grapView* g_View;
IMPLEMENT_DYNCREATE(CTest_grapView, CScrollView)
BEGIN_MESSAGE_MAP(CTest_grapView, CScrollView)
//{{AFX_MSG_MAP(CTest_grapView)
ON_WM_CREATE()
ON_COMMAND(ID_GRAP, OnGrap)
ON_WM_ERASEBKGND()
ON_COMMAND(ID_CONTROL, OnControl)
ON_COMMAND(ID_SUBBKIMG, OnSubbkimg)
ON_COMMAND(ID_GETBKIMG, OnGetbkimg)
ON_WM_TIMER()
ON_UPDATE_COMMAND_UI(ID_INDICATOR_CAPS, OnUpdateInfo1)
ON_COMMAND(ID_ZOOM, OnZoom)
ON_COMMAND(ID_ZOOMIN, OnZoomin)
ON_COMMAND(ID_ZOOMOUT, OnZoomout)
ON_UPDATE_COMMAND_UI(ID_SUBBKIMG, OnUpdateSubbkimg)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_CAIJISETUP, OnCaijisetup)
ON_COMMAND(ID_HANDCAIJI, OnHandcaiji)
ON_UPDATE_COMMAND_UI(ID_CAIJISETUP, OnUpdateCaijisetup)
ON_UPDATE_COMMAND_UI(ID_GRAP, OnUpdateGrap)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
ON_REGISTERED_MESSAGE(MY_CAPTURE_BEGIN,OnCaptureBegin)
ON_REGISTERED_MESSAGE(MY_CAPTURE_RUN,OnCaptureRun)
ON_REGISTERED_MESSAGE(MY_CAPTURE_END,OnCaptureEnd)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTest_grapView construction/destruction
CTest_grapView::CTest_grapView()
{
// TODO: add construction code here
g_View=this;
m_bLianXu=true;
m_nCaijiCount=10;
m_nInval=0;
m_nCurPos=0;
m_bHandCaiji=false;
m_nFrames=0;
m_nFps=0;
m_nSecond=0;
m_nFreq=0;
m_Width=0;
m_Height=0;
m_fZoom=1.0f;
m_bSubBK=false;
m_bCaiji=false;
m_hHiGrayDib=NULL;
m_hDib=NULL;
for(int i=0;i<10;i++)
m_hDibGroup[i]=NULL;
}
CTest_grapView::~CTest_grapView()
{
GY_Exit();
}
BOOL CTest_grapView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CTest_grapView drawing
void CTest_grapView::OnDraw(CDC* pDC)
{
CTest_grapDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
GY_SetOffsetDC(GetScrollPosition().x,GetScrollPosition().y);
GY_OnDraw();
DoShowIMG(pDC->m_hDC,m_hDib);
}
void CTest_grapView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
}
/////////////////////////////////////////////////////////////////////////////
// CTest_grapView printing
BOOL CTest_grapView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CTest_grapView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CTest_grapView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CTest_grapView diagnostics
#ifdef _DEBUG
void CTest_grapView::AssertValid() const
{
CScrollView::AssertValid();
}
void CTest_grapView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CTest_grapDoc* CTest_grapView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTest_grapDoc)));
return (CTest_grapDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTest_grapView message handlers
int CTest_grapView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
GY_Init(this); //初始化该函数必须在其他GY_XXX()之前调用
m_Width=GY_GetWidth();
m_Height=GY_GetHeight();
GY_SetDisplayWindow(3,m_Width,m_Height);
SetScrollSizes(MM_TEXT,CSize(m_Width,m_Height));
return 0;
}
void CTest_grapView::OnGrap()
{
// TODO: Add your command handler code here
m_bCaiji=!m_bCaiji;
if(m_bCaiji)
{
SetTimer(1,1000,NULL);
if(!GY_Captrue(true,0,m_nInval)) m_bCaiji=false;
}
else
{
KillTimer(1);
GY_StopCaptrue();
}
}
BOOL CTest_grapView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
GetClientRect(rect);
pDC->FillRect(&rect,&CBrush(RGB(0,0,0)));
return true;//CScrollView::OnEraseBkgnd(pDC);
}
void CTest_grapView::OnControl()
{
// TODO: Add your command handler code here
GY_Control();
}
void CTest_grapView::OnSubbkimg()
{
// TODO: Add your command handler code here
m_bSubBK=!m_bSubBK;
GY_SubBKimg(m_bSubBK);
}
void CTest_grapView::OnGetbkimg()
{
// TODO: Add your command handler code here
GY_GetBKimg();
}
HGLOBAL CTest_grapView::InitDib(int xw,int yw,int nBits)//申请接收图像的内存
{
int nColors=(1<<nBits);
DWORD dwSize= sizeof(BITMAPINFOHEADER)+nColors*sizeof(RGBQUAD)+xw*yw;
HGLOBAL hDib = GlobalAlloc(GHND,dwSize);//|GMEM_ZEROINIT
if(hDib==NULL)
{
AfxMessageBox("Memory Alloc failed !");
return NULL;
}
char* pNew = (char*)GlobalLock(hDib);
if(pNew==NULL)
{
AfxMessageBox("hDib Memory Lock failed !");
GlobalFree(hDib);
return NULL;
}
BITMAPINFOHEADER *pBIH = (BITMAPINFOHEADER *)pNew;
RGBQUAD* pPalette = (RGBQUAD *) &pNew[sizeof(BITMAPINFOHEADER)];
BYTE* pBits = (BYTE*) &pNew[sizeof(BITMAPINFOHEADER)+nColors*sizeof(RGBQUAD)];
pBIH->biSize = sizeof(BITMAPINFOHEADER);
pBIH->biWidth = xw;
pBIH->biHeight = yw;
pBIH->biPlanes = 1;
pBIH->biBitCount = nBits;
pBIH->biCompression = BI_RGB; // non Compression.
pBIH->biSizeImage = xw*yw;
pBIH->biXPelsPerMeter = 0;
pBIH->biYPelsPerMeter = 0;
pBIH->biClrUsed = nColors;
pBIH->biClrImportant = 0;
for(int i=0; i<nColors; i++)
{
pPalette[i].rgbBlue=i;
pPalette[i].rgbGreen=i;
pPalette[i].rgbRed=i;
pPalette[i].rgbReserved=0;
}
GlobalUnlock(hDib);
return hDib;
}
void CTest_grapView::OnCaptureBegin(WPARAM wParam,LPARAM lParam)//开始采集
{
CString str;
int xw=(int)(lParam&0xffff);
int yw=(int)((lParam>>16)&0xffff);
m_nCurPos=0;
m_hDib=NULL;
for(int i=0;i<10;i++)
{ if(m_hDibGroup[i]) ::GlobalFree(m_hDibGroup[i]);
m_hDibGroup[i]=InitDib(xw,yw,8);//申请连续记录图像的内存
}
if(m_hHiGrayDib) ::GlobalFree(m_hHiGrayDib);
m_hHiGrayDib=::GlobalAlloc(GHND,xw*yw*sizeof(WORD));//申请接收12 bit的原始图像的内存
}
void CTest_grapView::OnCaptureRun(WPARAM wParam,LPARAM lParam)//正在采集
{
OnShowInfo();
//用户可将该程序中177行中 GY_Captrue(true) 改为 GY_Captrue(false)
//再将以下屏蔽的代码去除屏蔽 试一试
if(!m_bLianXu||m_bHandCaiji)
{
m_hDib=m_hDibGroup[m_nCurPos];
if(m_hDib==NULL) return;
BYTE* pNew=(BYTE*)::GlobalLock(m_hDibGroup[m_nCurPos]);
BYTE* pBits = (BYTE*) &pNew[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];
WORD* pWord=(WORD*)::GlobalLock(m_hHiGrayDib);
GY_ConvertData((WORD*)wParam,pBits,pWord);
::GlobalUnlock(m_hDibGroup[m_nCurPos]);
::GlobalUnlock(m_hHiGrayDib);
// CDC* pDC=GetDC();
// DoShowIMG(pDC->m_hDC,m_hDib);
// ReleaseDC(pDC);
m_nCurPos++;
if(m_nCurPos>=m_nCaijiCount)
{
m_nCurPos=0;
if(!m_bLianXu)
OnGrap();
}
if(m_bHandCaiji) m_bHandCaiji=false;
}
}
void CTest_grapView::OnCaptureEnd(WPARAM wParam,LPARAM lParam)//结束采集
{
::MessageBeep(MB_OK);//0xFFFFFFFF);
}
BOOL CTest_grapView::DoShowIMG(HDC hDC,HGLOBAL dib)
{
if( dib == NULL ) return false;
char *pTemp=(char*)GlobalLock( dib );
if( pTemp == NULL ) return false;
CRect rect;
GetClientRect(rect);
int Left=(int)((rect.Width()-m_Width*m_fZoom)/2);
if(Left<0) Left=0;
int Top=(int)((rect.Height()-m_Height*m_fZoom)/2);
if(Top<0) Top=0;
BITMAPINFOHEADER *pBIH = (BITMAPINFOHEADER*)pTemp;
BYTE* pData=(BYTE*)&pTemp[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];
::StretchDIBits(hDC,Left,Top,(int)(m_Width*m_fZoom),(int)(m_Height*m_fZoom),0,0,m_Width,m_Height,
pData,(BITMAPINFO*)pBIH,DIB_RGB_COLORS, SRCCOPY );
//SetDIBitsToDevice(hDC,0,0,m_Width,m_Height,0,0,0,m_Height,
// pData,
// (BITMAPINFO*)pBIH,DIB_RGB_COLORS );
GlobalUnlock( dib );
return true;
}
void CTest_grapView::OnShowInfo()
{
CString InfoStr;
CWnd* pWnd = AfxGetMainWnd();
m_nFrames++;
m_nFps++;
InfoStr.Format(" 采集时间:%-d 秒 采集帧数:%d 帧 帧频:%-d 帧/秒 ",
m_nSecond,m_nFrames,m_nFreq);
pWnd->SetWindowText(InfoStr);
}
void CTest_grapView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
m_nFreq=m_nFps;
m_nFps=0;
m_nSecond++;
CScrollView::OnTimer(nIDEvent);
}
void CTest_grapView::OnUpdateInfo1(CCmdUI* pCmdUI)
{
CString str;
CPoint point(0,0);
GetCursorPos(&point);
ScreenToClient(&point);
CRect rect;
GetClientRect(&rect);
int left=(int)((rect.Width()-m_Width*m_fZoom)/2);
if(left<0) left=0;
int top=(int)((rect.Height()-m_Height*m_fZoom)/2);
if(top<0) top=0;
point+=GetScrollPosition();
point.x-=left;
point.y-=top;
point.x=(int)(point.x/m_fZoom);
point.y=(int)(point.y/m_fZoom);
WORD i=0;
i=GY_GetGray(point.x,point.y);
str.Format(" x:%-4d y:%-4d Value:%-3d",point.x,point.y,i);
pCmdUI->SetText(str);
}
void CTest_grapView::OnZoom()
{
// TODO: Add your command handler code here
m_fZoom=1.0f;
GY_SetDisplayWindow(3,m_Width,m_Height);
SetScrollSizes(MM_TEXT,CSize(m_Width,m_Height));
Invalidate();
}
void CTest_grapView::OnZoomin()
{
// TODO: Add your command handler code here
m_fZoom-=.2f;
if(m_fZoom<.5f) m_fZoom=0.5f;
GY_SetDisplayWindow(3,(int)(m_Width*m_fZoom),(int)(m_Height*m_fZoom));
SetScrollSizes(MM_TEXT,CSize((int)(m_Width*m_fZoom),(int)(m_Height*m_fZoom)));
Invalidate();
}
void CTest_grapView::OnZoomout()
{
// TODO: Add your command handler code here
m_fZoom+=.2f;
if(m_fZoom>4.0f) m_fZoom=4.0f;
GY_SetDisplayWindow(3,(int)(m_Width*m_fZoom),(int)(m_Height*m_fZoom));
SetScrollSizes(MM_TEXT,CSize((int)(m_Width*m_fZoom),(int)(m_Height*m_fZoom)));
Invalidate();
}
void CTest_grapView::OnUpdateSubbkimg(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_bSubBK);
}
void CTest_grapView::OnFileOpen()
{
// TODO: Add your command handler code here
char szFilter[500]="BMP File(*.bmp)|*.bmp|";
strcat(szFilter,"HIG File(*.hig)|*.hig|");
strcat(szFilter,"All File(*.*)|*.*||");
CFileDialog FileDLG(true,"wmg",NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);
if(FileDLG.DoModal()==IDOK)
GY_OpenImgFromFile(FileDLG.GetPathName());
}
void CTest_grapView::OnFileSave()
{
// TODO: Add your command handler code here
char szFilter[500]="HIG File(*.hig)|*.hig|";
strcat(szFilter,"BMP File(*.bmp)|*.bmp|");
strcat(szFilter,"All File(*.*)|*.*||");
CFileDialog FileDLG(false,"hig",NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,szFilter);
if(FileDLG.DoModal()==IDOK)
GY_SaveImgToFile(FileDLG.GetPathName());
}
void CTest_grapView::OnCaijisetup()
{
// TODO: Add your command handler code here
CCaijiDlg dlg;
dlg.m_bLianXu=m_bLianXu;
dlg.m_nCaijiCount=m_nCaijiCount;
dlg.m_nInval=m_nInval;
int respond;
respond=dlg.DoModal();
if(respond==IDOK)
{
m_bLianXu=dlg.m_bLianXu;
m_nCaijiCount=dlg.m_nCaijiCount;
if(m_bLianXu)
m_nCaijiCount=10;
m_nInval=dlg.m_nInval;
}
}
void CTest_grapView::OnHandcaiji()
{
// TODO: Add your command handler code here
m_bHandCaiji=true;
}
void CTest_grapView::OnUpdateCaijisetup(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(!m_bCaiji);
}
void CTest_grapView::OnUpdateGrap(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_bCaiji);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -