www.pudn.com > MyElevator.rar > MyElevatorDlg.cpp
// MyElevatorDlg.cpp : implementation file
//
#include "stdafx.h"
#include "afxwin.h"
#include "MyElevator.h"
#include "MyElevatorDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyElevatorDlg dialog
CMyElevatorDlg::CMyElevatorDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyElevatorDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMyElevatorDlg)
m_strAPassengers = _T("0");
m_strBPassengers = _T("0");
m_strAStatus = _T("WAIT");
m_strBStatus = _T("WAIT");
m_nDESTFloor = -1;
m_nSRCFloor = -1;
m_ElevatorATimer = 0;
m_ElevatorBTimer = 0;
m_AStopTimer = 0;
m_BStopTimer = 0;
m_bARun = false;
m_bBRun = false;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMyElevatorDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyElevatorDlg)
DDX_Control(pDX, IDC_SLIDERB, m_BSlider);
DDX_Control(pDX, IDC_SLIDERA, m_ASlider);
DDX_Control(pDX, IDC_LIST, m_TaskList);
DDX_Text(pDX, IDC_APASSENGERNUMBER, m_strAPassengers);
DDX_Text(pDX, IDC_BPASSENGERNUMBER, m_strBPassengers);
DDX_Text(pDX, IDC_ASTATUS, m_strAStatus);
DDX_Text(pDX, IDC_BSTATUS, m_strBStatus);
DDX_Radio(pDX, IDC_DESTRADIO1, m_nDESTFloor);
DDX_Radio(pDX, IDC_SRCRADIO1, m_nSRCFloor);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyElevatorDlg, CDialog)
//{{AFX_MSG_MAP(CMyElevatorDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_ASTEP_MESSAGE , OnAStepIn)
ON_MESSAGE(WM_BSTEP_MESSAGE , OnBStepIn)
ON_MESSAGE(WM_ASTOP_MESSAGE , OnAStopIn)
ON_MESSAGE(WM_BSTOP_MESSAGE , OnBStopIn)
ON_MESSAGE(WM_ASTART_MESSAGE , OnAStart)
ON_MESSAGE(WM_BSTART_MESSAGE , OnBStart)
ON_BN_CLICKED(IDC_ADD, OnAddTask)
ON_BN_CLICKED(IDC_DESTRADIO1, OnDestradio1)
ON_BN_CLICKED(IDC_DESTRADIO2, OnDestradio2)
ON_BN_CLICKED(IDC_DESTRADIO3, OnDestradio3)
ON_BN_CLICKED(IDC_DESTRADIO4, OnDestradio4)
ON_BN_CLICKED(IDC_DESTRADIO5, OnDestradio5)
ON_BN_CLICKED(IDC_SRCRADIO1, OnSrcradio1)
ON_BN_CLICKED(IDC_SRCRADIO2, OnSrcradio2)
ON_BN_CLICKED(IDC_SRCRADIO3, OnSrcradio3)
ON_BN_CLICKED(IDC_SRCRADIO4, OnSrcradio4)
ON_BN_CLICKED(IDC_SRCRADIO5, OnSrcradio5)
ON_BN_CLICKED(IDRUN, OnRun)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyElevatorDlg message handlers
BOOL CMyElevatorDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_uPassengerID = 1;
m_TaskList.SetExtendedStyle(m_TaskList.GetExtendedStyle()|
LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP);
m_TaskList.InsertColumn(0 , "UserID" , LVCFMT_CENTER , 50,-1);
m_TaskList.InsertColumn(1 , "Start" , LVCFMT_CENTER , 50,-1);
m_TaskList.InsertColumn(2 , "End" , LVCFMT_CENTER, 50,-1);
m_TaskList.InsertColumn(3 , "Elevator" , LVCFMT_CENTER, 60,-1);
m_ASlider.SetRange(0,40);
m_ASlider.SetPos(40);
m_BSlider.SetRange(0,40);
m_BSlider.SetPos(40);
/*
for(int i = 0 ; i <= 40 ; i +=10)
{
m_ASlider.SetTic(i);
m_BSlider.SetTic(i);
}
*/
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMyElevatorDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMyElevatorDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CMyElevatorDlg::OnAddTask()
{
// TODO: Add your control notification handler code here
if((-1==m_nSRCFloor) || (-1==m_nDESTFloor) || (m_nSRCFloor==m_nDESTFloor))
{
MessageBox("Invalid task,can't add it!");
m_nSRCFloor = -1;
m_nDESTFloor = -1;
UpdateData(false);
return;
}
m_TaskList.InsertItem(LVIF_TEXT|LVIF_STATE, m_uPassengerID - 1, _T(""),
0, LVIS_SELECTED, 0, 0);
CString s;
s.Format("%d" , m_uPassengerID);
m_TaskList.SetItemText(m_uPassengerID - 1 , 0 , s);
s.Format("%d" , m_nSRCFloor + 1);
m_TaskList.SetItemText(m_uPassengerID - 1 , 1 , s);
s.Format("%d" , m_nDESTFloor + 1);
m_TaskList.SetItemText(m_uPassengerID - 1 , 2 , s);
CStop stop1(m_nSRCFloor + 1, 1 , 0);
CStop stop2(m_nDESTFloor + 1 , 0 , 1);
bool bAStart = false;
bool bBStart = false;
_STATUS statusA = WAIT , statusB = WAIT;
if (m_bARun)
{
statusA = m_ElevatorA.GetStatus();
KillTimer(m_ElevatorATimer);
m_bARun = false;
bAStart = true;
}
if (m_bBRun)
{
statusB = m_ElevatorB.GetStatus();
KillTimer(m_ElevatorBTimer);
m_bBRun = false;
bBStart = true;
}
/*
if ((WAIT == m_ElevatorA.GetStatus()) && (WAIT != m_ElevatorB.GetStatus()))
{
m_TaskList.SetItemText(m_uPassengerID - 1 , 3 , _T("A"));
m_ElevatorA.InsertStop(statusA, stop1 , stop2);
SendMessage(WM_ASTART_MESSAGE , 0 , 0);
if (bBStart)
{
m_ElevatorBTimer = SetTimer(2, 200, 0);//
m_bBRun = true;
}
m_ElevatorATimer = SetTimer(1 , 200 , 0);//
m_bARun = true;
m_uPassengerID++;
return;
}
if ((WAIT == m_ElevatorB.GetStatus()) && (WAIT != m_ElevatorA.GetStatus()))
{
m_TaskList.SetItemText(m_uPassengerID - 1 , 3 , _T("B"));
m_ElevatorB.InsertStop(statusB, stop1 , stop2);
SendMessage(WM_BSTART_MESSAGE , 0 , 0);
if (bAStart)
{
m_ElevatorATimer = SetTimer(1 , 200 , 0);//
m_bARun = true;
}
m_ElevatorBTimer = SetTimer(2, 200, 0);//
m_bBRun = true;
m_uPassengerID++;
return;
}
*/
if (m_ElevatorA.GetWaitTime(stop1 , stop2) > m_ElevatorB.GetWaitTime(stop1 , stop2))
{
m_TaskList.SetItemText(m_uPassengerID - 1 , 3 , _T("B"));
m_ElevatorB.InsertStop(statusB, stop1 , stop2);
SendMessage(WM_BSTART_MESSAGE , 0 , 0);
if (bAStart)
{
m_ElevatorATimer = SetTimer(1 , 200 , 0);//
m_bARun = true;
}
m_ElevatorBTimer = SetTimer(2, 200, 0);//
m_bBRun = true;
}
else
{
/*
if ((WAIT == m_ElevatorB.GetStatus()) && (WAIT != m_ElevatorA.GetStatus()))
{
m_TaskList.SetItemText(m_uPassengerID - 1 , 3 , _T("B"));
m_ElevatorB.InsertStop(statusB, stop1 , stop2);
SendMessage(WM_BSTART_MESSAGE , 0 , 0);
if (bAStart)
{
m_ElevatorATimer = SetTimer(1 , 200 , 0);//
m_bARun = true;
}
m_ElevatorBTimer = SetTimer(2, 200, 0);//
m_bBRun = true;
m_uPassengerID++;
return;
}
*/
m_TaskList.SetItemText(m_uPassengerID - 1 , 3 , _T("A"));
m_ElevatorA.InsertStop(statusA, stop1 , stop2);
SendMessage(WM_ASTART_MESSAGE , 0 , 0);
if (bBStart)
{
m_ElevatorBTimer = SetTimer(2, 200, 0);//
m_bBRun = true;
}
m_ElevatorATimer = SetTimer(1 , 200 , 0);//
m_bARun = true;
}
m_uPassengerID++;
}
void CMyElevatorDlg::OnDestradio1()
{
// TODO: Add your control notification handler code here
m_nDESTFloor = 0;
}
void CMyElevatorDlg::OnDestradio2()
{
// TODO: Add your control notification handler code here
m_nDESTFloor = 1;
}
void CMyElevatorDlg::OnDestradio3()
{
// TODO: Add your control notification handler code here
m_nDESTFloor = 2;
}
void CMyElevatorDlg::OnDestradio4()
{
// TODO: Add your control notification handler code here
m_nDESTFloor = 3;
}
void CMyElevatorDlg::OnDestradio5()
{
// TODO: Add your control notification handler code here
m_nDESTFloor = 4;
}
void CMyElevatorDlg::OnSrcradio1()
{
// TODO: Add your control notification handler code here
m_nSRCFloor = 0;
}
void CMyElevatorDlg::OnSrcradio2()
{
// TODO: Add your control notification handler code here
m_nSRCFloor = 1;
}
void CMyElevatorDlg::OnSrcradio3()
{
// TODO: Add your control notification handler code here
m_nSRCFloor = 2;
}
void CMyElevatorDlg::OnSrcradio4()
{
// TODO: Add your control notification handler code here
m_nSRCFloor = 3;
}
void CMyElevatorDlg::OnSrcradio5()
{
// TODO: Add your control notification handler code here
m_nSRCFloor = 4;
}
void CMyElevatorDlg::OnRun()
{
// TODO: Add your control notification handler code here
}
void CMyElevatorDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent)
{
case 1:
{
bool IsAttainFloor = false;
if (m_ElevatorA.StepIn(IsAttainFloor))
{
KillTimer(m_ElevatorATimer);
if (m_ElevatorA.HaveTask())
{
m_AStopTimer = SetTimer(3 , 2000 , 0);
}
SendMessage(WM_ASTOP_MESSAGE , 0 , 0);
}
else
{
SendMessage(WM_ASTEP_MESSAGE , 0 , 0);
}
}
break;
case 2:
{
bool IsAttainFloor = false;
if (m_ElevatorB.StepIn(IsAttainFloor))
{
KillTimer(m_ElevatorBTimer);
if (m_ElevatorB.HaveTask())
{
m_BStopTimer = SetTimer(4 , 2000 , 0);
}
SendMessage(WM_BSTOP_MESSAGE , 0 , 0);
}
else
{
SendMessage(WM_BSTEP_MESSAGE , 0 , 0);
}
}
break;
case 3:
{
KillTimer(m_AStopTimer);
if (m_ElevatorA.HaveTask())
{
m_bARun = true;
m_ElevatorATimer = SetTimer(1 , 200, 0);//
SendMessage(WM_ASTART_MESSAGE , 0 , 0);
}
}
break;
case 4:
{
KillTimer(m_BStopTimer);
if (m_ElevatorB.HaveTask())
{
m_bBRun = true;
m_ElevatorBTimer = SetTimer(2 , 200 , 0);//
SendMessage(WM_BSTART_MESSAGE , 0 , 0);
}
}
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
LRESULT CMyElevatorDlg::OnAStepIn(WPARAM wParam , LPARAM lParam)
{
m_ASlider.SetPos(40 - m_ElevatorA.GetHeight());
m_strAPassengers.Format("%d",m_ElevatorA.GetPerson());
UpdateData(FALSE);
return 0;
}
LRESULT CMyElevatorDlg::OnBStepIn(WPARAM wParam , LPARAM lParam)
{
m_BSlider.SetPos(40 - m_ElevatorB.GetHeight());
m_strBPassengers.Format("%d",m_ElevatorB.GetPerson()) ;
UpdateData(FALSE);
return 0;
}
LRESULT CMyElevatorDlg::OnAStopIn(WPARAM wParam , LPARAM lParam)
{
m_ASlider.SetPos(40 - m_ElevatorA.GetHeight());
m_strAPassengers.Format("%d",m_ElevatorA.GetPerson());
m_strAStatus.Format("WAIT");
UpdateData(FALSE);
return 0;
}
LRESULT CMyElevatorDlg::OnBStopIn(WPARAM wParam , LPARAM lParam)
{
m_BSlider.SetPos(40 - m_ElevatorB.GetHeight());
m_strBPassengers.Format("%d",m_ElevatorB.GetPerson());
m_strBStatus.Format("WAIT");
UpdateData(FALSE);
return 0;
}
LRESULT CMyElevatorDlg::OnAStart(WPARAM wParam , LPARAM lParam)
{
m_strAStatus.Format(m_ElevatorA.GetStatus() == UP ? _T("UP") : _T("DOWN"));
m_strAPassengers.Format("%d",m_ElevatorA.GetPerson());
UpdateData(FALSE);
return 0;
}
LRESULT CMyElevatorDlg::OnBStart(WPARAM wParam , LPARAM lParam)
{
m_strBStatus.Format(m_ElevatorB.GetStatus() == UP ? _T("UP") : _T("DOWN"));
m_strBPassengers.Format("%d",m_ElevatorB.GetPerson());
UpdateData(FALSE);
return 0;
}