www.pudn.com > 200518174534292.rar > ParkSysView.cpp
// ParkSysView.cpp : implementation of the CParkSysView class // #include "stdafx.h" #include "ParkSys.h" #include "ParkSysDoc.h" #include "ParkSysView.h" #include "readprice.h" #include#include "led.h" #include "InputBox.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CParkSysView IMPLEMENT_DYNCREATE(CParkSysView, CFormView) BEGIN_MESSAGE_MAP(CParkSysView, CFormView) //{{AFX_MSG_MAP(CParkSysView) ON_COMMAND(ID_GENERATE_ACCOUNT, OnGenerateAccount) ON_WM_CTLCOLOR() ON_WM_CANCELMODE() ON_COMMAND(ID_CHAREGE, OnCharge) //}}AFX_MSG_MAP // Standard printing commands END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CParkSysView construction/destruction CParkSysView::CParkSysView() : CFormView(CParkSysView::IDD) { //{{AFX_DATA_INIT(CParkSysView) m_enCardID = _T(""); m_enInTime = _T(""); m_exCardID = _T(""); m_exChargeNum = _T(""); m_exInTime = _T(""); m_exOutTime = _T(""); m_exUseTime = _T(""); m_NowCarNum = 0; m_TotalCarNum = 0; //}}AFX_DATA_INIT // TODO: add construction code here } CParkSysView::~CParkSysView() { CParkSysApp *app = (CParkSysApp *)AfxGetApp(); app->database.Close(); } void CParkSysView::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); //{{AFX_DATA_MAP(CParkSysView) DDX_Control(pDX, IDC_EX_ANI, m_aviEx); DDX_Control(pDX, IDC_EN_ANI, m_aviEn); DDX_Control(pDX, IDC_INIMAGE, m_bmpIn); DDX_Text(pDX, IDC_EN_CARDID, m_enCardID); DDX_Text(pDX, IDC_EN_INTIME, m_enInTime); DDX_Text(pDX, IDC_EX_CARDID, m_exCardID); DDX_Text(pDX, IDC_EX_CHARGENUM, m_exChargeNum); DDX_Text(pDX, IDC_EX_INTIME, m_exInTime); DDX_Text(pDX, IDC_EX_OUTTIME, m_exOutTime); DDX_Text(pDX, IDC_EX_USETIME, m_exUseTime); DDX_Text(pDX, IDC_NOWCARNUM, m_NowCarNum); DDX_Text(pDX, IDC_TOTALCARNUM, m_TotalCarNum); //}}AFX_DATA_MAP } BOOL CParkSysView::PreCreateWindow(CREATESTRUCT& cs) { // 初始化串口 //入口 CRegKey regKey; regKey.Open(HKEY_CURRENT_USER,_T("Software\\ParkSys\\CommSet")); //条码打印机 DWORD LabelPrinter; regKey.QueryValue(LabelPrinter, _T("LPComm")); LabelPrinter+=1; if (m_CommLP.InitPort(this, LabelPrinter, 9600, 'N',8,1)) m_CommLP.StartMonitoring(); else MessageBox("条码打印机连接错误",NULL,MB_OK | MB_ICONERROR); //电子显示屏 DWORD LED; regKey.QueryValue(LED, _T("LEDComm")); LED+=1; if (m_CommLED.InitPort(this, LED, 9600, 'N',8,1)) { m_CommLED.StartMonitoring(); } else MessageBox("电子显示屏连接错误",NULL,MB_OK | MB_ICONERROR); //初始化参数 //显示车位 CParkSysApp *app = (CParkSysApp *)AfxGetApp(); CCountTime rs_CountTime( &app->database ); rs_CountTime.Open(); while(!rs_CountTime.IsEOF()) { m_NowCarNum += 1; rs_CountTime.MoveNext(); } rs_CountTime.Close(); //显示总的车位数 regKey.Open(HKEY_CURRENT_USER,_T("Software\\ParkSys\\ParaSet")); regKey.QueryValue(m_TotalCarNum, _T("Park_capacity")); regKey.Close(); return CFormView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CParkSysView printing ///////////////////////////////////////////////////////////////////////////// // CParkSysView diagnostics ///////////////////////////////////////////////////////////////////////////// // CParkSysView message handlers void CParkSysView::DisplayImage(CLongBinary* image) { DWORD lsize = image->m_dwDataLength; HANDLE ghandle = image->m_hData; DWORD s = GlobalSize(ghandle); void* p = GlobalLock(ghandle); DWORD nBytesToWrite = lsize; /*#if defined(_DEBUG) AfxMessageBox("check the existance of carout.bmp"); #endif*/ CString str = ((CParkSysApp *)AfxGetApp())->ExtractFilePath(); str += "carout.bmp"; HANDLE hFile = CreateFile(str, GENERIC_WRITE, /*FILE_SHARE_WRITE | FILE_SHARE_READ*/0,NULL, CREATE_ALWAYS,0,0); ASSERT(hFile != INVALID_HANDLE_VALUE); BOOL reval = WriteFile(hFile,p,nBytesToWrite, &nBytesToWrite, NULL); CloseHandle(hFile); /*#if defined(_DEBUG) AfxMessageBox("check the content of carout.bmp"); #endif*/ BOOL val = GlobalUnlock(ghandle); HGLOBAL h = GlobalFree(ghandle); CFile fBmp; fBmp.Open(str, CFile::modeRead); DWORD dwLength=fBmp.GetLength(); fBmp.Close(); if (dwLength > 0) { TRY { DeleteObject(m_bmpIn.SetBitmap((HBITMAP)LoadFromFile(str))); } CATCH_ALL(e) { AfxMessageBox("Delphi DLL LoadFromFile发生错误!"); THROW_LAST(); } END_CATCH_ALL } else { AfxMessageBox("Carout.bmp长度为零!"); } UpdateData(FALSE); } void CParkSysView::OnGrabimage(CString strCardID) { CParkSysApp* app = (CParkSysApp *)AfxGetApp(); CString str = app->ExtractFilePath(); str += "carin.dib"; BOOL revalue = capFileSaveDIB(app->avi.m_hWndCap, (LPCTSTR)str); UpdateWindow(); //判断如果保存图像不成功,那么就直接返回。 if (!revalue) { AfxMessageBox("保存图像失败,程序还将继续,但是,在此车出门的时候您不能进行比对。"); return; } HANDLE hFile = CreateFile(str,GENERIC_READ, 0/*FILE_SHARE_READ |FILE_SHARE_WRITE*/,NULL, //读写共享 OPEN_EXISTING,0,0); ASSERT(hFile != INVALID_HANDLE_VALUE); DWORD hsize; DWORD lsize = GetFileSize(hFile, &hsize); HGLOBAL ghandle = GlobalAlloc(GMEM_MOVEABLE, lsize); DWORD s = GlobalSize(ghandle); void* p = GlobalLock(ghandle); DWORD nBytesToRead = lsize; BOOL reval = TRUE; reval = ReadFile(hFile,p,nBytesToRead, &nBytesToRead, NULL); CloseHandle(hFile); CLongBinary image; CCountTime rs_CountTime( &app->database ); //转换2进制文件为16进制文件 CString csSQL = "UPDATE TAB_COUNTTIME SET CAR_IMAGE=0x"; LPTSTR szTemp = new TCHAR[ lsize*2 + 1 ]; extern const TCHAR HEX[256][2]; for (DWORD i = 0; i < lsize; i++) { * (szTemp + (i << 1)) = HEX[(unsigned char)*((BYTE*)p + i)][0]; * (szTemp + (i << 1) + 1) = HEX[(unsigned char)*((BYTE*)p + i)][1]; } szTemp[ lsize*2 ] = 0; csSQL += szTemp; csSQL += " WHERE CARD_ID='" + strCardID+"'"; app->database.ExecuteSQL( csSQL ); delete []szTemp; BOOL val = GlobalUnlock(ghandle); HGLOBAL h = GlobalFree(ghandle); } void CParkSysView::CreateNewLabel() { DWORD CardID; CRegKey regKey; regKey.Open(HKEY_CURRENT_USER,_T("Software\\ParkSys\\ParaSet")); regKey.QueryValue(CardID, _T("LabelCardID")); if (CardID>=99999) CardID=0; CardID += 1; regKey.SetValue(CardID, _T("LabelCardID")); regKey.Close(); CParkSysApp* app = (CParkSysApp*)AfxGetApp(); CCountTime rs_CountTime( &app->database ); rs_CountTime.Open(); CardID += 30000000; char buff[20]; _itoa(CardID, buff, 10); CString strCardID = buff; rs_CountTime.AddNew(); rs_CountTime.m_CARD_ID = strCardID; CTime inTime = CTime::GetCurrentTime(); rs_CountTime.m_IN_TIME = inTime; rs_CountTime.Update(); rs_CountTime.Close(); //使用Zebra Corp. ZPL II 编码向支持ZPL的条形码打印机发送打印指令。 // ZPL 的意思是 Zebra Programming Language CString strFormat = "^XA\n\r" "^FO200,200^BY3\n\r" "^BCN,100,Y,N,N^FD%d^FS\n\r" "^FO100,400^FD%s^FS\n\r" "^XZ\n\r"; CString strZPLLabel; //把数据填入到上面的ZPL串中。卡号CardID,进入时间 YYYY-mm-dd hh:MM:SS strZPLLabel.Format(strFormat, CardID, inTime.Format("%Y-%m-%d %H:%M:%S")); m_CommLP.WriteToPort(strZPLLabel.GetBuffer(strZPLLabel.GetLength() + 1)); strZPLLabel.ReleaseBuffer(); OnGrabimage(strCardID); //抓取一幅汽车进入图像 m_NowCarNum += 1; m_enCardID = strCardID; m_enInTime = inTime.Format("%Y-%m-%d %H:%M:%S"); UpdateData(FALSE); } BOOL CParkSysView::Charge(CString cardid, double &cyFee) { CParkSysApp *app = (CParkSysApp *)AfxGetApp(); cyFee = 0.0; CTime inTime; CTime outTime = CTime::GetCurrentTime(); CTimeSpan spanTime; CCountTime rs_counttime(&app->database); rs_counttime.m_strFilter = "Card_ID = \'" + cardid + "\'"; rs_counttime.Open(); rs_counttime.MoveFirst(); inTime = rs_counttime.m_IN_TIME; rs_counttime.Close(); //显示卡号 m_exCardID = cardid; //显示进出时间 spanTime = outTime - inTime; m_exInTime = inTime.Format( "%Y-%m-%d %H:%M:%S" ); m_exOutTime += outTime.Format( "%Y-%m-%d %H:%M:%S" ); m_exUseTime = spanTime.Format( "%D天%H小时%M分%S秒" ); do { if (inTime>=outTime) { AfxMessageBox("系统时间错误"); break; } if(cardid >= "30000000") { double fHours = spanTime.GetTotalMinutes() / 60.0; //retCode = m_StoredProcFee.PRC_FEE_PC_HOUR(cardid, fHours, &mFee); //每小时停车费2元RMB cyFee = fHours * 2.0; CString strMoney; strMoney.Format("%0.4lf元", cyFee); m_exChargeNum = strMoney; UpdateData(FALSE);//显示金额 CLED led(&m_CommLED); led.TakeEffect(CString("!\\纸卡收费") + strMoney + "\\!@@"); CWaitCursor wait; CReadPrice readprice; readprice.ReadPrice(atof(strMoney)); wait.Restore(); if (AfxMessageBox("纸卡用户按时付费,交易结束后按确定,否则按取消。" , MB_OKCANCEL | MB_ICONINFORMATION) != IDOK) { break; } } UpdateData(FALSE);//显示信息 return TRUE; }while(false); UpdateData(FALSE);//显示信息 return FALSE; } void CParkSysView::OnGenerateAccount() { CreateNewLabel(); m_aviEn.Play(); } HBRUSH CParkSysView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor); char szClassName[50] = {0}; GetClassName(pWnd->m_hWnd, szClassName, sizeof(szClassName)); if (strnicmp(szClassName, "EDIT", sizeof(szClassName)) == 0) { CBrush brush(RGB(255, 255, 200)); hbr = (HBRUSH)brush.Detach(); pDC->SetBkMode(TRANSPARENT); } // TODO: Return a different brush if the default is not desired return hbr; } void CParkSysView::OnCharge() { CString strCardID; CInputBox inputBox("收费", "请扫描或者输入卡号:", &strCardID); if (IDOK == inputBox.DoModal()) { //出车 BOOL ret = CheckCarOut(strCardID); if (ret) { m_aviEx.Play(); } //计算车辆数量 RefreshCarCount(strCardID); } } LONG CParkSysView::RefreshCarCount(CString strCardID) { //得到目前停车场中的车辆数。 CParkSysApp *app = (CParkSysApp *)AfxGetApp(); CCountTime rs_CountTime( &app->database ); rs_CountTime.Open(); if( rs_CountTime.GetRecordCount() != 0 ) { rs_CountTime.MoveFirst(); } int RecordCount = 0; while( !rs_CountTime.IsEOF() ) { rs_CountTime.MoveNext(); RecordCount += 1; } rs_CountTime.Close(); m_NowCarNum = RecordCount; UpdateData( FALSE ); return 0; } BOOL CParkSysView::CheckCarOut(CString strCardID) { CParkSysApp *app = (CParkSysApp *)AfxGetApp(); //显示进门的图象 CCountTime rs_CountTime( &app->database ); rs_CountTime.m_strFilter = "TAB_COUNTTIME.CARD_ID='" + strCardID+"'"; rs_CountTime.Open(); DisplayImage(&rs_CountTime.m_CAR_IMAGE); rs_CountTime.Close(); //开始收费 double cyFee = 0.0; //金额 BOOL ret = Charge(strCardID, cyFee); if(ret) { //保存记录和把该车占用的车位还原。 ret = app->database.BeginTrans(); if(ret) { TRY { const char * sqlTemplate = "insert into tab_history_card select card_id," " in_time, GetDate(), %lf, car_image from" " tab_counttime where card_id = \'%s\'"; CString strSQL; strSQL.Format(sqlTemplate, cyFee, strCardID); app->database.ExecuteSQL(strSQL); strSQL = "delete from tab_counttime where" " Card_id like \'" + strCardID + "\'"; app->database.ExecuteSQL(strSQL); ret = app->database.CommitTrans(); if(ret) --m_NowCarNum; } CATCH(CDBException, e) { app->database.Rollback(); ret = FALSE; } END_CATCH } } UpdateData(FALSE); return ret; }