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