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

📄 posview.cpp

📁 可以根据停车场的具体情况定义停车点的位置
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// PosView.cpp : implementation file
//

#include "stdafx.h"
#include "PosManager.h"
#include "PosView.h"
#include "ParSetDlg.h"
#include "SerialInitDlg.h"
#include "MsgDealDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CPosView

IMPLEMENT_DYNCREATE(CPosView, CFormView)

CPosView::CPosView()
	: CFormView(CPosView::IDD)
{
	//{{AFX_DATA_INIT(CPosView)
	m_msg = _T("");
	//}}AFX_DATA_INIT
}

CPosView::~CPosView()
{
//	OnFinish();
	for(int nI=0;nI<m_nPosTotal;nI++)
		if(pos[nI]!=NULL)delete pos[nI];
	if(m_bComOpened)serial.Close();		
}

void CPosView::DoDataExchange(CDataExchange* pDX)
{
	CFormView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPosView)
	DDX_Text(pDX, IDC_MSG, m_msg);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CPosView, CFormView)
	//{{AFX_MSG_MAP(CPosView)
	ON_WM_DESTROY()
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_BN_CLICKED(IDC_BUTTON2, OnFixParam)
	ON_BN_CLICKED(IDC_BUTTON3, OnFinish)
	ON_BN_CLICKED(IDC_BUTTON4, OnResetAll)
	ON_WM_RBUTTONDOWN()
	ON_BN_CLICKED(IDC_BUTTON5, OnAddPos)
	ON_BN_CLICKED(IDC_BUTTON1, OnScm)
	ON_BN_CLICKED(IDC_BUTTON6, OnGride)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_COM_MSG,OnComMsg)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPosView diagnostics

#ifdef _DEBUG
void CPosView::AssertValid() const
{
	CFormView::AssertValid();
}

void CPosView::Dump(CDumpContext& dc) const
{
	CFormView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CPosView message handlers

void CPosView::OnInitialUpdate() 
{
	CFormView::OnInitialUpdate();	
	
	// 设置标题,调整框架大小
	GetParentFrame()->RecalcLayout();
    ResizeParentToFit(FALSE);
	GetParentFrame()->SetWindowText("车库配置");
	GetParentFrame()->ShowWindow(SW_SHOWMAXIMIZED);

	for(int nI=0;nI<MAXSCM;nI++)	//车位设为为全未关联探头
	{	
		m_ComMsg[nI].bInited=false;	//下位机设为全未初始化
		for(int nJ=0;nJ<256;nJ++)
			m_ComMsg[nI].posindex[nJ]=0x0ffff;
	}
	InitPosParam();					//初始化车位,建立关联
	
	m_nGride=20;
	isGrideOn=false;
	m_bComOpened=false;
	m_bComBlocked=false;
	m_bProbInit=false;

	if(!InitSerial())//初始化串口
	{
		MessageBox("串口配置文件读取失败,将采用默认配置.");
		m_bComOpened=serial.Open(GetSafeHwnd(),WM_COM_MSG,1,
			19200,8,0,1);
	}
	else
	{
		ASSERT(m_nCom==1);
		m_bComOpened=serial.Open(GetSafeHwnd(),WM_COM_MSG,m_nCom,
			dcbConfig.BaudRate,8,dcbConfig.fParity,dcbConfig.StopBits);
	}
	if(!m_bComOpened)MessageBox("Fail to Open Serial port!");
//	else MessageBox("串口已打开,可以开始正常工作了!");

	//打开文件准备记录日志
	m_PosLog.Open("","PosLog.txt");
	m_ComLog.Open("","ComLog.txt");
}

void CPosView::OnDestroy() 
{
	m_PosLog.Close();
	m_ComLog.Close();
	theApp.m_pPosFrm=NULL;
	CFormView::OnDestroy();	
}

void CPosView::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	if( m_bmp.m_hObject != NULL )//判断
        m_bmp.DeleteObject();

	RECT ClientRect;
	GetClientRect(&ClientRect);
	CClientDC ClientDC(this);
/////////载入图片
    HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"parkmap.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
    if( hbmp == NULL )   return ;
///////////////////////该断程序用来取得加载的BMP的信息////////////////////////
    m_bmp.Attach( hbmp );
	DIBSECTION ds;
	BITMAPINFOHEADER &bminfo = ds.dsBmih; 
	m_bmp.GetObject( sizeof(ds), &ds );
    int cx=bminfo.biWidth;  //得到图像宽度
	int cy=bminfo.biHeight; //得到图像高度
/////////////得到了图像的宽度和高度后,我们就可以对图像大小进行适应,即调整控件的大小,让它正好显示一张图片///////////////////////////
    CRect rect;
    GetDlgItem(IDC_MAP)->GetWindowRect(&rect);
    ScreenToClient(&rect);
    GetDlgItem(IDC_MAP)->MoveWindow(rect.left,rect.top,cx,cy,true);//调整大小
	
	CDC memDC;
	memDC.CreateCompatibleDC(&ClientDC);
	CBitmap* pOld = memDC.SelectObject(&m_bmp);
	if (pOld == NULL) return;   // destructors will clean up
	
	ClientDC.BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),
		&memDC, 0, 0, SRCCOPY);
	memDC.SelectObject(pOld);	

	if(m_nPosTotal!=0)DisplayAll();
	
	if(isGrideOn==true)
	{	
		if(((CButton *)GetDlgItem(IDC_RADIO2))->GetCheck())m_nGride=50;
		else m_nGride=20;
		GrideOn(m_nGride);
	}
}
void CPosView::CreatePos(int nTop,int nLeft,int nWidth,int nLength)
{

	m_nWidth=nWidth;
	m_nLength=nLength;
	pos[m_nPosTotal] = new CPosition;
	pos[m_nPosTotal]->Create(this,nTop,nLeft,nWidth,nLength);
	
	pos[m_nPosTotal]->isLocked=false;
	pos[m_nPosTotal]->isWatched=false;
	pos[m_nPosTotal]->isOccupied=false;
	pos[m_nPosTotal]->SetProbeNum((BYTE)m_nPosTotal);
	pos[m_nPosTotal]->SetScmNum(0);
	pos[m_nPosTotal]->SetRegion(0);
	pos[m_nPosTotal]->SetFloor(1);
	pos[m_nPosTotal]->SetStatus(PS_EMPTY);//POS_STATUS(m_nPosTotal%5)
	m_nPosTotal++;
	
}
	
void CPosView::DisplayAll()
{
	int nI;
	for(nI=0;nI<m_nPosTotal;nI++)
		pos[nI]->Display();
}
void CPosView::InitPosParam()
{
	m_bParamFixed=false;
	m_bAllLocked=false;
	m_bSetOver=false;
	m_nCurPos=0;
	m_nPosTotal=0;
	m_nWidth=40;
	m_nLength=80;
	for(int nI=0;nI<2000;nI++)
	{
		pos[nI]=NULL;	//预置所有位置为空
	}
	if(LoadPosition())m_bSetOver=true;
}

BOOL CPosView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) 
{
	return CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

/*	char buf[20];
	sprintf(buf,"ttt %d",m_nRow);
	CString s;
	s.Format("%d",m_nCol);
	AfxMessageBox(CString(buf));
	AfxMessageBox(s);*/

void CPosView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_bSetOver)return;
	m_nTopX=point.x;
	m_nTopY=point.y;
	if(m_bParamFixed)
	{	
		for(int nI=0;nI<m_nPosTotal;nI++)
		{
			if(point.x>pos[nI]->GetTopX()
				&&point.y>pos[nI]->GetTopY())
			{
				if(((point.x-pos[nI]->GetTopX())<pos[nI]->GetWidth())
					&&((point.y-pos[nI]->GetTopY())<pos[nI]->GetLength()))
				{	
					break;
				}
			}
		}
		if(nI==m_nPosTotal)//Not find any exsited item so create new pos 
		{
			CParSetDlg dlg;
			if(nI>0)
			{
				dlg.m_probe=pos[nI-1]->GetProbeNum()+1;
				dlg.m_scm=pos[nI-1]->GetScmNum();
				dlg.m_floor=pos[nI-1]->GetFloor();
				dlg.m_region=pos[nI-1]->GetRegion();
				if(pos[nI-1]->GetStatus()==PS_VIP)dlg.isVip=true;
			}
			if(dlg.DoModal()==IDOK)
			{
				CreatePos(m_nTopX,m_nTopY,m_nWidth,m_nLength);
				m_nCurPos=m_nPosTotal-1;
				if(dlg.isVip)
				{
					pos[m_nCurPos]->SetStatus(PS_VIP);
					pos[m_nCurPos]->SetOrgStatus(PS_VIP);
				}
				pos[m_nCurPos]->SetProbeNum((BYTE)dlg.m_probe);
				pos[m_nCurPos]->SetScmNum((BYTE)dlg.m_scm);
				pos[m_nCurPos]->SetFloor(dlg.m_floor);
				pos[m_nCurPos]->SetRegion(dlg.m_region);
				pos[m_nCurPos]->Display();
			}				
		}	
	}	
	CFormView::OnLButtonDown(nFlags, point);
}

void CPosView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	if(m_bParamFixed||m_bSetOver)return;
	int nI;
	for(nI=0;nI<m_nPosTotal;nI++)
	{
		if(point.x>pos[nI]->GetTopX()
			&&point.y>pos[nI]->GetTopY())
		{
			if(((point.x-pos[nI]->GetTopX())<pos[nI]->GetWidth())
				&&((point.y-pos[nI]->GetTopY())<pos[nI]->GetLength()))
			{	
				break;
			}
		}
	}
	if(nI==m_nPosTotal&&point.x>m_nTopX&&point.y>m_nTopY)//Not find any exsited item so create new pos 
	{
		CParSetDlg dlg;
		if(nI>0)
		{
			dlg.m_probe=pos[nI-1]->GetProbeNum()+1;
			dlg.m_scm=pos[nI-1]->GetScmNum();
			dlg.m_floor=pos[nI-1]->GetFloor();
			dlg.m_region=pos[nI-1]->GetRegion();
			if(pos[nI-1]->GetStatus()==PS_VIP)dlg.isVip=true;
		}
		if(dlg.DoModal()==IDOK)
		{
			CreatePos(m_nTopX,m_nTopY,point.x-m_nTopX,point.y-m_nTopY);
			m_nCurPos=m_nPosTotal-1;
			if(dlg.isVip)
			{
				pos[m_nCurPos]->SetStatus(PS_VIP);
				pos[m_nCurPos]->SetOrgStatus(PS_VIP);
			}
			pos[m_nCurPos]->SetProbeNum((BYTE)dlg.m_probe);
			pos[m_nCurPos]->SetScmNum((BYTE)dlg.m_scm);
			pos[m_nCurPos]->SetFloor(dlg.m_floor);
			pos[m_nCurPos]->SetRegion(dlg.m_region);
			pos[m_nCurPos]->Display();
		}				
	}
	CFormView::OnLButtonUp(nFlags, point);
}
void CPosView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	int nI;
	for(nI=0;nI<m_nPosTotal;nI++)
	{
		if(point.x>pos[nI]->GetTopX()
			&&point.y>pos[nI]->GetTopY())
		{
			if(((point.x-pos[nI]->GetTopX())<pos[nI]->GetWidth())
				&&((point.y-pos[nI]->GetTopY())<pos[nI]->GetLength()))
			{	
				break;
			}
		}
	}

	if(nI!=m_nPosTotal)//Not find any exsited item so create new pos 
	{
		CParSetDlg dlg;
		dlg.m_bPrtRBtnDown=true;
		dlg.m_probe=pos[nI]->GetProbeNum();
		dlg.m_scm=pos[nI]->GetScmNum();
		dlg.m_floor=pos[nI]->GetFloor();
		dlg.m_region=pos[nI]->GetRegion();
		if(pos[nI]->GetStatus()==PS_VIP)dlg.isVip=true;
		if(dlg.DoModal()==IDOK)
		{
			if(dlg.isVip)
			{
				pos[nI]->SetStatus(PS_VIP);
				pos[nI]->SetOrgStatus(PS_VIP);
			}
			else
			{
				pos[nI]->SetStatus(PS_EMPTY);
				pos[nI]->SetOrgStatus(PS_EMPTY);
			}
			pos[nI]->SetProbeNum((BYTE)dlg.m_probe);
			pos[nI]->SetScmNum((BYTE)dlg.m_scm);
			pos[nI]->SetFloor(dlg.m_floor);
			pos[nI]->SetRegion(dlg.m_region);
			pos[nI]->Display();
		}
		if(dlg.m_bFlagDel)
		{
			CRgn rgn;
			rgn.CreateRectRgn(pos[nI]->GetTopX(),//无效化区域
				pos[nI]->GetTopY(),
				pos[nI]->GetTopX()+pos[nI]->GetLength(),
				pos[nI]->GetTopY()+pos[nI]->GetWidth());
			for(;nI<m_nPosTotal-1;nI++)
			{
				pos[nI]=pos[nI+1];			
			}
			pos[m_nPosTotal]=NULL;
			InvalidateRgn(&rgn,true);
			m_nPosTotal--;
		}
	}		
	CFormView::OnRButtonDown(nFlags, point);

⌨️ 快捷键说明

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