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

📄 elevatorsdlg.cpp

📁 电梯仿真
💻 CPP
字号:
// ElevatorsDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "Elevators.h"
#include "ElevatorsDlg.h"
#include "ElevatorThread.h"
#include "ElevatorControl.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define WM_JUDGE WM_USER+100//////判断消息
#define  WM_RUN     WM_USER+110/////电梯运行消息


// CElevatorsDlg 对话框

CElevatorsDlg::CElevatorsDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CElevatorsDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	for (int i=0;i<ELEVATOR_NUM;i++)
	{
		theApp.Current_Floors[i]=1;
		theApp.Lift_States[i]=IDLE;
		Elevators_Thread[i]=(CElevatorThread*)AfxBeginThread(RUNTIME_CLASS(CElevatorThread));
		Elevators_Thread[i]->m_pMainWnd=this;
		Elevators_Thread[i]->Elevator_ID=i+1;
	}

	///////
	Edit_Floors[0]=&Edit_Floor1;
	Edit_Floors[1]=&Edit_Floor2;
	Edit_Floors[2]=&Edit_Floor3;
	Edit_Floors[3]=&Edit_Floor4;
	Edit_Floors[4]=&Edit_Floor5;

	//////
	Outer_Buttons[0][0]=&Button1_U;
	Outer_Buttons[0][1]=&Button2_U,Outer_Buttons[1][1]=&Button2_D;
	Outer_Buttons[0][2]=&Button3_U,Outer_Buttons[1][2]=&Button3_D;
	Outer_Buttons[0][3]=&Button4_U,Outer_Buttons[1][3]=&Button4_D;
	Outer_Buttons[0][4]=&Button5_U,Outer_Buttons[1][4]=&Button5_D;
	Outer_Buttons[0][5]=&Button6_U,Outer_Buttons[1][5]=&Button6_D;
	Outer_Buttons[0][6]=&Button7_U,Outer_Buttons[1][6]=&Button7_D;
	Outer_Buttons[0][7]=&Button8_U,Outer_Buttons[1][7]=&Button8_D;
	Outer_Buttons[0][8]=&Button9_U,Outer_Buttons[1][8]=&Button9_D;
	Outer_Buttons[0][9]=&Button10_U,Outer_Buttons[1][9]=&Button10_D;
	Outer_Buttons[0][10]=&Button11_U,Outer_Buttons[1][10]=&Button11_D;
	Outer_Buttons[0][11]=&Button12_U,Outer_Buttons[1][11]=&Button12_D;
	Outer_Buttons[0][12]=&Button13_U,Outer_Buttons[1][12]=&Button13_D;
	Outer_Buttons[0][13]=&Button14_U,Outer_Buttons[1][13]=&Button14_D;
	Outer_Buttons[0][14]=&Button15_U,Outer_Buttons[1][14]=&Button15_D;
	Outer_Buttons[0][15]=&Button16_U,Outer_Buttons[1][15]=&Button16_D;
	Outer_Buttons[0][16]=&Button17_U,Outer_Buttons[1][16]=&Button17_D;
	Outer_Buttons[0][17]=&Button18_U,Outer_Buttons[1][17]=&Button18_D;
	Outer_Buttons[0][18]=&Button19_U,Outer_Buttons[1][18]=&Button19_D;
	                                                        Outer_Buttons[1][19]=&Button20_D;

}

void CElevatorsDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CElevatorDlg)

	//}}AFX_DATA_MAP
	DDX_Control(pDX, IDC_EDIT1, Edit_Floor1);
	DDX_Control(pDX, IDC_EDIT2, Edit_Floor2);
	DDX_Control(pDX, IDC_EDIT3, Edit_Floor3);
	DDX_Control(pDX, IDC_EDIT4, Edit_Floor4);
	DDX_Control(pDX, IDC_EDIT5, Edit_Floor5);
	DDX_Control(pDX, IDC_BUTTON4, Button19_U);DDX_Control(pDX, IDC_BUTTON6, Button18_U);
	DDX_Control(pDX, IDC_BUTTON8, Button17_U);DDX_Control(pDX, IDC_BUTTON10, Button16_U);
	DDX_Control(pDX, IDC_BUTTON12, Button15_U);DDX_Control(pDX, IDC_BUTTON14, Button14_U);
	DDX_Control(pDX, IDC_BUTTON16, Button13_U);DDX_Control(pDX, IDC_BUTTON18, Button12_U);
	DDX_Control(pDX, IDC_BUTTON20, Button11_U);DDX_Control(pDX, IDC_BUTTON22, Button10_U);
	DDX_Control(pDX, IDC_BUTTON24, Button9_U);DDX_Control(pDX, IDC_BUTTON26, Button8_U);
	DDX_Control(pDX, IDC_BUTTON28, Button7_U);DDX_Control(pDX, IDC_BUTTON30, Button6_U);
	DDX_Control(pDX, IDC_BUTTON32, Button5_U);DDX_Control(pDX, IDC_BUTTON34, Button4_U);
	DDX_Control(pDX, IDC_BUTTON36, Button3_U);DDX_Control(pDX, IDC_BUTTON38, Button2_U);
	DDX_Control(pDX, IDC_BUTTON40, Button1_U);DDX_Control(pDX, IDC_BUTTON1, Button20_D);
	DDX_Control(pDX, IDC_BUTTON3, Button19_D);DDX_Control(pDX, IDC_BUTTON5, Button18_D);
	DDX_Control(pDX, IDC_BUTTON7, Button17_D);DDX_Control(pDX, IDC_BUTTON9, Button16_D);
	DDX_Control(pDX, IDC_BUTTON11, Button15_D);DDX_Control(pDX, IDC_BUTTON13, Button14_D);
	DDX_Control(pDX, IDC_BUTTON15, Button13_D);DDX_Control(pDX, IDC_BUTTON17, Button12_D);
	DDX_Control(pDX, IDC_BUTTON19, Button11_D);DDX_Control(pDX, IDC_BUTTON21, Button10_D);
	DDX_Control(pDX, IDC_BUTTON23, Button9_D);DDX_Control(pDX, IDC_BUTTON25, Button8_D);
	DDX_Control(pDX, IDC_BUTTON27, Button7_D);DDX_Control(pDX, IDC_BUTTON29, Button6_D);
	DDX_Control(pDX, IDC_BUTTON31, Button5_D);DDX_Control(pDX, IDC_BUTTON33, Button4_D);
	DDX_Control(pDX, IDC_BUTTON35, Button3_D);DDX_Control(pDX, IDC_BUTTON37, Button2_D);
	

}

BEGIN_MESSAGE_MAP(CElevatorsDlg, CDialog)
	ON_WM_PAINT()
	//ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_MESSAGE( WM_JUDGE,&CElevatorsDlg::OnJudge)
	ON_MESSAGE(WM_RUN,&CElevatorsDlg::Elevator_RUN)
	ON_COMMAND_RANGE(IDC_BUTTON1,IDC_BUTTON40,OnInnerBtnClk)
END_MESSAGE_MAP()



// CElevatorsDlg 消息处理程序

BOOL CElevatorsDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

 //////////////////////////////////////	////动态创建电梯示意按钮
	CString TempString;

	CString strCaption;
		int iPanelLeft = 40;
		int iPanelTop = 330;
		int iRowHeight =60;
		int iColWidth = 20;/////////起始绘制点

		int iBtnWidth = 90;////////按键描述
		int iBtnHeight = 30;
		int i;
///////////////////开始创建
				for(int j=0;j<5;j++)
			{
				if (j!=0)
					iPanelLeft+=110;

				for(i=FLOOR_NUM;i>0;i--)
				{
					strCaption.Format(L"%d",i);
					m_pFloor[j][i-1]=new CButton;

						m_pFloor[j][i-1]->Create(strCaption,BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE|BS_CENTER|BS_BITMAP,\
							CRect(\
							iPanelLeft,\
							iPanelTop+(10-i)*iRowHeight/2,\
							iPanelLeft+iBtnWidth,\
							iPanelTop+(10-i)*iRowHeight/2+iBtnHeight),\
							this,IDC_MYBUTTONS+i-1);//left,top,right,bottom
				}
			}
				CString temp;
				temp.Format(L"%d",1);
				for (int i=0;i<ELEVATOR_NUM;i++)
				{
					m_pFloor[i][0]->SetBitmap(theApp.Bitmap_Black);
					Edit_Floors[i]->SetWindowText(temp);
				}

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CElevatorsDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作矩形中居中
		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;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CElevatorsDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}
///////////////////////方法函数

LRESULT CElevatorsDlg::Elevator_RUN(WPARAM elvator_id,LPARAM l)//int elvator_id,int cur_floor,int state)
{ 
	CString temp1;
	
	if(theApp.Lift_States[elvator_id-1]==UP_RUN||theApp.Lift_States[elvator_id-1]==UP_PAUSE)
	{
		temp1.Format(L"%d",theApp.Current_Floors[elvator_id-1]+1);
		m_pFloor[elvator_id-1][theApp.Current_Floors[elvator_id-1]-1]->SetBitmap(NULL);
		UpdateWindow();
		if(theApp.Current_Floors[elvator_id-1]==19)
		{
			m_pFloor[elvator_id-1][theApp.Current_Floors[elvator_id-1]]->SetBitmap(theApp.Bitmap_Black);	
			Edit_Floors[elvator_id-1]->SetWindowText(temp1);
			UpdateWindow();
		}
		else
		{
			m_pFloor[elvator_id-1][theApp.Current_Floors[elvator_id-1]]->SetBitmap(theApp.Bitmap_Red);////上升电梯为红色
			Edit_Floors[elvator_id-1]->SetWindowText(temp1);
			UpdateWindow();
		}

	}
	else if(theApp.Lift_States[elvator_id-1]==DOWN_RUN||theApp.Lift_States[elvator_id-1]==DOWN_PAUSE)
	{
		temp1.Format(L"%d",theApp.Current_Floors[elvator_id-1]-1);
		m_pFloor[elvator_id-1][theApp.Current_Floors[elvator_id-1]-1]->SetBitmap(NULL);////下降电梯为蓝色
		UpdateWindow();
		if (theApp.Current_Floors[elvator_id-1]==1)
		{
			m_pFloor[elvator_id-1][0]->SetBitmap(theApp.Bitmap_Black);
		    Edit_Floors[elvator_id-1]->SetWindowText(temp1);
			UpdateWindow();
		}
		else
		{
			m_pFloor[elvator_id-1][theApp.Current_Floors[elvator_id-1]-2]->SetBitmap(theApp.Bitmap_Blue);////下降电梯为蓝色
			Edit_Floors[elvator_id-1]->SetWindowText(temp1);
			UpdateWindow();
		}
	}
	return TRUE;
}
void CElevatorsDlg::Elevator_IDLE(int elvator_id,int cur_floor,int run)
{
	if(run==FALSE)
	m_pFloor[elvator_id-1][cur_floor-1]->SetBitmap(theApp.Bitmap_Black);
	else if (run==TRUE)
	m_pFloor[elvator_id-1][cur_floor-1]->SetBitmap(NULL);
	else if(run==3)
	m_pFloor[elvator_id-1][cur_floor-1]->SetBitmap(NULL);
}


/////////////////////////////消息响应函数
//////////////////当按下外部电梯按钮,由此函数进行判断.
void CElevatorsDlg::OnInnerBtnClk(UINT curBtn)
{

	if(curBtn==1038)
	{
		judge_item.Target_floor=20;
		judge_item.Target_state=DOWN_RUN;
	}

	else if(DOWN_RUN==curBtn%2+2)
	{
			judge_item.Target_floor=19-((curBtn-1040)/2);
			judge_item.Target_state=DOWN_RUN;
	}else if(UP_RUN==curBtn%2)
	{
			judge_item.Target_floor=19-((curBtn-1040)/2);
			judge_item.Target_state=UP_RUN;
	}
	SendMessage(WM_JUDGE,0,0);
}


////////////////////////////////
////////////////////////////////收到WM_JUDGE消息后,判断调用哪一个电梯.
LRESULT CElevatorsDlg::OnJudge(WPARAM  w,LPARAM   l)
{
	int Judge_Value[ELEVATOR_NUM]={-1,-1,-1,-1,-1};
	int  Target_ID,Temp=20;
	for (int i=0;i<ELEVATOR_NUM;i++)
	{
		if(judge_item.Target_state==UP_RUN)
			switch(theApp.Lift_States[i])
			{
			case IDLE:
				Judge_Value[i]=abs(theApp.Current_Floors[i]-judge_item.Target_floor);
				break;
			case UP_RUN:
			case UP_PAUSE:
				if (judge_item.Target_floor>=theApp.Current_Floors[i])
				Judge_Value[i]=abs(theApp.Current_Floors[i]-judge_item.Target_floor);	
				break;
			case DOWN_RUN:
			case DOWN_PAUSE:
			case BAD_STATE:
				Judge_Value[i]=-1;
				break;
			}
		else if(judge_item.Target_state==DOWN_RUN)
			switch(theApp.Lift_States[i])
			{
				case IDLE:
					Judge_Value[i]=abs(theApp.Current_Floors[i]-judge_item.Target_floor);
					break;			
				case DOWN_RUN:
				case DOWN_PAUSE:
					if(judge_item.Target_floor<=theApp.Current_Floors[i])
						Judge_Value[i]=theApp.Current_Floors[i]-judge_item.Target_floor;	
					break;
				case UP_RUN:
				case UP_PAUSE:
				case BAD_STATE:
					Judge_Value[i]=-1;
					break;
			}
	}
	for (int i=0;i<ELEVATOR_NUM;i++)
	{
		if ((Judge_Value[i]>-1)&&(Judge_Value[i]<Temp))
		{
			int k=i;
			Temp=Judge_Value[i];
			Target_ID=k+1;
		}
	}
	judge_item.Target_id=Target_ID;
	if(judge_item.Target_floor)
	if(judge_item.Target_floor!=1)
		Color_The_Button(judge_item.Target_floor,judge_item.Target_state,BAD_STATE,TRUE);
			UpdateWindow();
	Elevators_Thread[Target_ID-1]->Add_To_Queue(judge_item.Target_floor,judge_item.Target_state,TRUE);
	return 0;
}

void CElevatorsDlg::Color_The_Button(int tar_floor,int tar_state,int last_state,BOOL SHOW_UP)
{
	if(SHOW_UP==TRUE)
	{
		if(tar_state==UP_RUN||tar_state==UP_PAUSE)
			Outer_Buttons[0][tar_floor-1]->SetBitmap(theApp.Bitmap_Black);
		else if(tar_state==DOWN_RUN||tar_state==DOWN_PAUSE)
			Outer_Buttons[1][tar_floor-1]->SetBitmap(theApp.Bitmap_Black);
	}
	else if(SHOW_UP==FALSE)
	{
		if(tar_state==UP_RUN||tar_state==UP_PAUSE)
			Outer_Buttons[0][tar_floor-1]->SetBitmap(NULL);
		else if(tar_state==DOWN_RUN||tar_state==DOWN_PAUSE)
			Outer_Buttons[1][tar_floor-1]->SetBitmap(NULL);
		else if(tar_state==IDLE)
		{
			if(tar_floor!=20)
			Outer_Buttons[0][tar_floor-1]->SetBitmap(NULL);
			if (tar_floor!=1)
			Outer_Buttons[1][tar_floor-1]->SetBitmap(NULL);
		}

	}
	UpdateWindow();
}

⌨️ 快捷键说明

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