📄 elevatorsdlg.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 + -