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

📄 dlgtab.cpp

📁 PCI7505的通信编程
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// DlgTAB.cpp : implementation file
//

#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
#include "math.h"
#include "time.h"
//#include "cg300-32.h"
#include "CardMem.h"

#include "HardWork.h"
#include "HardWorkDoc.h"
#include "MainFrm.h"

#include "DlgTAB.h"
#include "DlgCaliImageSave.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define PHOTONUM 40
/////////////////////////////////////////////////////////////////////////////
// CDlgTAB dialog

HINSTANCE pci7505dll=NULL;
typedef int(*pci7505check)(DWORD dwVendorID, DWORD dwDeviceID, BOOL fUseInt,DWORD cardNO);
typedef int(*pci7505di)(long hPlx, BOOL fLocalAddr,int ch);
typedef void(*pci7505do)(long hPlx, BOOL fLocalAddr,int ch,int dodata);
typedef int(*pci7505close)(long hPlx);

pci7505check check;
pci7505di    dii;
pci7505do    doo;
pci7505close close;

int hplx;

CDlgTAB::CDlgTAB(CWnd* pParent /*=NULL*/)
	: CDialog(CDlgTAB::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlgTAB)
	m_nTheta = 0.0f;
	m_strCaliFileName = _T("");
	//}}AFX_DATA_INIT
}


void CDlgTAB::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlgTAB)
	DDX_Control(pDX, IDC_EDIT_CALIFILENAME, m_ctrlCaliName);
	DDX_Control(pDX, IDC_COMBO_N01, m_ctrlN01);
	DDX_Control(pDX, IDC_COMBO_N1, m_ctrlN1);
	DDX_Control(pDX, IDC_COMBO_N10, m_ctrlN10);
	DDX_Control(pDX, IDC_COMBO_N100, m_ctrlN100);
	DDX_Control(pDX, IDC_COMBO_BJCCD, m_ctrlBJCCD);
	DDX_Control(pDX, IDC_RADIO_CLOCK, m_ctrlClock);
	DDX_Control(pDX, IDC_RADIO_ANTICLOCK, m_ctrlAntiClock);
	DDX_Text(pDX, IDC_EDIT_THETA, m_nTheta);
	DDX_Text(pDX, IDC_EDIT_CALIFILENAME, m_strCaliFileName);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlgTAB, CDialog)
	//{{AFX_MSG_MAP(CDlgTAB)
	ON_BN_CLICKED(IDC_OPENWINDOW, OnOpenwindow)
	ON_BN_CLICKED(IDC_CALIBRATIONIMAGE, OnCalibrationimage)
	ON_BN_CLICKED(IDC_LIVEFREZEE, OnLivefrezee)
	ON_BN_CLICKED(IDC_MEMAUTOSNAP, OnMemautosnap)
	ON_WM_PAINT()
	ON_CBN_SELCHANGE(IDC_COMBO_BJCCD, OnSelchangeComboBjccd)
	ON_BN_CLICKED(IDC_BUTTON_TURNOK, OnButtonTurnok)
	ON_BN_CLICKED(IDC_RADIO_CLOCK, OnRadioClock)
	ON_BN_CLICKED(IDC_RADIO_ANTICLOCK, OnRadioAnticlock)
	ON_CBN_SELCHANGE(IDC_COMBO_N100, OnSelchangeComboN100)
	ON_CBN_SELCHANGE(IDC_COMBO_N10, OnSelchangeComboN10)
	ON_CBN_SELCHANGE(IDC_COMBO_N1, OnSelchangeComboN1)
	ON_CBN_SELCHANGE(IDC_COMBO_N01, OnSelchangeComboN01)
	ON_WM_CLOSE()
	ON_WM_MOVE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlgTAB message handlers
void CDlgTAB::LiveCard()
{
	//begin
	hcg300=BeginCG300(1);
	CG300SetADParam(hcg300,AD_SOURCE,0);
	CRect ClientRect;
	GetDlgItem(IDC_SANPWINDOW)->GetWindowRect(&ClientRect);
	CG300SetColorSpace(hcg300,RGB8888);
	CG300SetInpVideoWindow(hcg300,128,32,512,512);
	CG300SetDispMode(hcg300,FRAME);
	CG300SetDispWindow(hcg300,ClientRect.left,ClientRect.top+8,512,512);
	CG300Capture(hcg300,TRUE);
	//end
}


BOOL CDlgTAB::OnInitDialog() 
{
	CDialog::OnInitDialog();
	// TODO: Add extra initialization here
    hcg300=NULL;
	hBmp=NULL;
	tablbflag=0;
	bFreeImage=FALSE;
	
	BMIInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	BMIInfo.bmiHeader.biWidth =512L;
	BMIInfo.bmiHeader.biHeight =512L;
	BMIInfo.bmiHeader.biPlanes = 1;
	BMIInfo.bmiHeader.biBitCount = 24;
	BMIInfo.bmiHeader.biCompression = BI_RGB;
	BMIInfo.bmiHeader.biSizeImage = 0;
	BMIInfo.bmiHeader.biXPelsPerMeter = 0;
	BMIInfo.bmiHeader.biYPelsPerMeter = 0;
	BMIInfo.bmiHeader.biClrUsed = 0;
	BMIInfo.bmiHeader.biClrImportant = 0;

	m_bClock=TRUE;
	m_nN100=0;
	m_nN10=0;
	m_nN1=0;
	m_nN01=0;
	m_nTheta=0;
	m_ctrlClock.SetCheck(1);
	m_ctrlAntiClock.SetCheck(0);

    /* 
	//用来定位转台控制窗口位置
	CRect pr;
	GetWindowRect(&pr);
	MoveWindow(0,0,pr.Width(),pr.Height(),TRUE);
    */ 

	///////////按钮状态控制区////////////////////
	GetDlgItem(IDC_BUTTON_TURNOK)->ShowWindow(FALSE);
	GetDlgItem(IDC_RADIO_CLOCK)->ShowWindow(FALSE);
	GetDlgItem(IDC_RADIO_ANTICLOCK)->ShowWindow(FALSE);
	GetDlgItem(IDC_COMBO_N100)->ShowWindow(FALSE);
	GetDlgItem(IDC_COMBO_N10)->ShowWindow(FALSE);
	GetDlgItem(IDC_COMBO_N1)->ShowWindow(FALSE);
	GetDlgItem(IDC_COMBO_N01)->ShowWindow(FALSE);
	GetDlgItem(IDC_STATIC_THETA)->ShowWindow(FALSE);
	GetDlgItem(IDC_EDIT_THETA)->ShowWindow(FALSE);
	
	////////掩码设置区//////////////////
	hMask=NULL;
	
	CDC* pDC = GetDC();
	nScrnWidth = pDC->GetDeviceCaps(HORZRES);
	nScrnHeight = pDC->GetDeviceCaps(VERTRES);
    pDC->DeleteDC();

	/////步进电机设置区/////////////
	HalfCyc=2000;
	LoadPCI7505();

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


void CDlgTAB::SnapImage(CString FileName,HANDLE h)
{
	//begin
	CFile file;
 	CFileException fe;
	if (!file.Open(FileName, CFile::modeCreate |
		CFile::modeReadWrite | CFile::shareExclusive, &fe))
	{
		MessageBox("创建文件失败!",MB_OK,0);
		return;
	}

	SaveBMP(h,file);

	file.Close();
	//end
}


void CDlgTAB::SaveBMP(HANDLE hDIB, CFile &file)
{
    //begin
	ScrnBMP.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
	ScrnBMP.bmiHeader.biWidth=512L;
	ScrnBMP.bmiHeader.biHeight=512L;
	ScrnBMP.bmiHeader.biPlanes=1;
	ScrnBMP.bmiHeader.biBitCount=24;
	ScrnBMP.bmiHeader.biCompression=BI_RGB;
        
	ScrnBMP.bmiHeader.biSizeImage = 0;
    
	ScrnBMP.bmiHeader.biXPelsPerMeter=0;
	ScrnBMP.bmiHeader.biYPelsPerMeter=0;
	ScrnBMP.bmiHeader.biClrUsed=0;
	ScrnBMP.bmiHeader.biClrImportant=0;
	
	char *lpdib=(char *)GlobalLock((HGLOBAL)hDIB);
	int iPaletteEntries = 0;
	BITMAPFILEHEADER bmFH;
	bmFH.bfType = 19778;
	bmFH.bfSize = (DWORD) ( sizeof(BITMAPFILEHEADER) + 
		sizeof(BITMAPINFOHEADER) +
		iPaletteEntries * sizeof(RGBQUAD)) +
		(ScrnBMP.bmiHeader.biHeight * ScrnBMP.bmiHeader.biWidth * 3L);
	bmFH.bfReserved1 = bmFH.bfReserved2 = 0;
	bmFH.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + 
		sizeof(BITMAPINFOHEADER) + 
		iPaletteEntries * sizeof(RGBQUAD);
	DWORD lsize=ScrnBMP.bmiHeader.biHeight * ScrnBMP.bmiHeader.biWidth * 3L;
	file.Write(&bmFH,sizeof(BITMAPFILEHEADER));
	file.Write(&ScrnBMP.bmiHeader, sizeof(BITMAPINFOHEADER));
	file.WriteHuge(lpdib,lsize);
	//end
}


void CDlgTAB::RedrawVideoScrn(HANDLE hBMP, HDC hdc, BOOL bIfLivetoFrez, CRect WndRect)
{
	//begin
    unsigned char *lpdib;
	ScrnBMP.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
	ScrnBMP.bmiHeader.biWidth=WndRect.Width();
	ScrnBMP.bmiHeader.biHeight=WndRect.Height();
	ScrnBMP.bmiHeader.biPlanes=1;
	ScrnBMP.bmiHeader.biBitCount=24;
	ScrnBMP.bmiHeader.biCompression=BI_RGB;
     
	ScrnBMP.bmiHeader.biSizeImage = 0;
    
	ScrnBMP.bmiHeader.biXPelsPerMeter=0;
	ScrnBMP.bmiHeader.biYPelsPerMeter=0;
	ScrnBMP.bmiHeader.biClrUsed=0;
	ScrnBMP.bmiHeader.biClrImportant=0;
	lpdib = (unsigned char *)GlobalLock((HGLOBAL)hBMP);
	if( bIfLivetoFrez)
	{
		//注释部分为测试运行时间用
		//time_t start,finish;
		//time(&start);
		ReadDispWindow(hdc,WndRect.left,WndRect.top,WndRect.Width(),WndRect.Height(),lpdib);
		//time(&finish);
		//CString str;
		//str.Format("运行时间差为%f\n",difftime(finish,start));
		//AfxMessageBox(str);
	}

	::GlobalUnlock((HGLOBAL)hBMP);
	//end
}


void CDlgTAB::OnOK() 
{
	// TODO: Add extra validation here
    if(hcg300!=NULL)
	{
		CG300Capture(hcg300,FALSE);
		EndCG300(hcg300);
		hcg300=NULL;
	}
	if(hBmp!=NULL)
	{
		::GlobalUnlock((HGLOBAL)hBmp);
		::GlobalFree((HGLOBAL)hBmp);
		hBmp=NULL;
	}
	if(hMask!=NULL)
	{
		::GlobalUnlock((HGLOBAL)hMask);
		::GlobalFree((HGLOBAL)hMask);
		hMask=NULL;
	}
 	if(pci7505dll!=NULL)
 	{
 		close(hplx);
 		pci7505dll=NULL;
 
 	}
	CDialog::OnOK();
	//end
}


void CDlgTAB::OnOpenwindow() 
{
	// TODO: Add your control notification handler code here
	CString dlgtext;
	GetDlgItemText(IDC_OPENWINDOW,dlgtext);
	if(dlgtext=="启动监控")
	{
		hcg300=BeginCG300(1);
		CG300SetADParam(hcg300,AD_SOURCE,0);
		CRect ClientRect;
		GetDlgItem(IDC_SANPWINDOW)->GetWindowRect(&ClientRect);
		CG300SetColorSpace(hcg300,RGB8888);
		// left=(768-512)/2=128   // top=(576-512)/2=32
		CG300SetInpVideoWindow(hcg300,128,32,512,512);
        CG300SetDispMode(hcg300,FRAME);
		CG300SetDispWindow(hcg300,ClientRect.left,ClientRect.top+8,512,512);

	    if(hBmp!=NULL)
		{
			::GlobalUnlock((HGLOBAL)hBmp);
			::GlobalFree((HGLOBAL)hBmp);
			hBmp=NULL;
		}
		hBmp=(HANDLE)::GlobalAlloc(GHND,512l*512l*3l);

		nSizeMask = nScrnWidth*nScrnHeight/8;
        hMask = ::GlobalAlloc(GHND, nSizeMask);
		if(!hMask )
		{
			MessageBox("Insufficient Memory available for Mask.", NULL, MB_OK | MB_ICONEXCLAMATION);
		}
		else
		{
			BYTE *pMask = (BYTE *)::GlobalLock(hMask);
			pMask1 = (DWORD *)pMask;
			pMask2 = (DWORD *)(pMask + nSizeMask/2);
		}
		BOOL TestMaskOn=TRUE;
		SetMaskMap1();
		SetMaskMap2();
	    CG300EnableOverlay(hcg300,TestMaskOn);
		//pPhyMask1:	物理地址
		CG300SetMask(hcg300,TopField,pMask1);		    
		CG300SetMask(hcg300,BottomField,pMask2);
		CG300Capture(hcg300,TRUE);		
		SetDlgItemText(IDC_OPENWINDOW,"关闭监控");
	}
	else
	{
		if(hcg300!=NULL)
		{
			CG300Capture(hcg300,FALSE);
			EndCG300(hcg300);
			hcg300=NULL;
		}
		if(hBmp!=NULL)
		{
			::GlobalUnlock(hBmp);
			::GlobalFree((HGLOBAL)hBmp);
			hBmp=NULL;
		}
		
		Invalidate();	
		SetDlgItemText(IDC_OPENWINDOW,"启动监控");
		SetDlgItemText(IDC_LIVEFREZEE,"激活");
	}
	//end
}


void CDlgTAB::OnCalibrationimage() 
{
	// TODO: Add your control notification handler code here

    CG300Capture(hcg300,FALSE);
	//  clock_t st,ed;	
	BeginWaitCursor();
	CClientDC dc(this);
    CRect snaprect;
    GetClientRect(&snaprect);
    CRect saverect;
   
	saverect.left=snaprect.left;
	saverect.top=snaprect.top+8;
	saverect.right=snaprect.left+512l;
	saverect.bottom=snaprect.top+512l+8l;

	RedrawVideoScrn(hBmp,dc.m_hDC,TRUE,saverect);

	if(bFreeImage)
	{
		UpdateData(TRUE);
		if(m_strCaliFileName.GetLength()<=0)
		{
			MessageBox("请先输入保存图象文件名","操作失败",MB_OK);
			return;
		}
		if(m_strCaliFileName.Right(4)!=".bmp")
		{
			m_strCaliFileName=m_strCaliFileName+".bmp";
		}
		
		if(m_strCaliFileName.Find("/")==-1)
		{
			m_strCaliFileName="D:\\catdata\\turnpro\\"+m_strCaliFileName;
		}
		bFreeImage=FALSE;
	}

	CString filename=m_strCaliFileName;

	UpdateData(FALSE);

	SnapImage(filename,hBmp);

	EndWaitCursor();
	//end
}


void CDlgTAB::OnLivefrezee() 
{
	// TODO: Add your control notification handler code here
	CString dlgtext;
	GetDlgItemText(IDC_LIVEFREZEE,dlgtext);
	if(dlgtext=="激活")
	{
		hcg300=BeginCG300(1);
		CG300SetADParam(hcg300,AD_SOURCE,0);
		CRect ClientRect;
		GetDlgItem(IDC_SANPWINDOW)->GetWindowRect(&ClientRect);
		CG300SetInpVideoWindow(hcg300,128,32,512,512);
		CG300SetDispMode(hcg300,FRAME);
		CG300SetDispWindow(hcg300,ClientRect.left,ClientRect.top+8,512,512);
		CG300SetColorSpace(hcg300,RGB8888);
		CG300Capture(hcg300,TRUE);
	    if(hBmp!=NULL)

⌨️ 快捷键说明

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