📄 macmange2.cpp
字号:
// MacMange2.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
#include "MacManage.h"
#include "commctrl.h"
#include "ListView.h"
//设置时间消息
#define WM_MYTIMER WM_USER + 103
//时间片时间间隔,以微秒来计算
#define ELAPSE 1000
//工作车间
wplace wp ( 5 ) ; //默认有5台机器
//上显示台
ListShow up ;
ListShow down ;
//下显示台
HINSTANCE hInst ;
//消息循环
LRESULT CALLBACK WndProc ( HWND , UINT , WPARAM , LPARAM ) ;
//初始化对话框
void InitDialog ( HWND ) ;
//初始化显示台
bool InitShow ( HWND ) ;
//刷新显示台数据
void Refresh ( HWND ) ;
//添加任务到车间
bool AddTask ( HWND ) ;
//判断是否输入回车
bool InputReturn ( HWND subWnd , int ID , char * buffer , int n ) ;
//删除任务
bool DelTask ( HWND , int ) ;
//改变车间机器数目
bool ChangeMac ( HWND ) ;
//车间工作开关处理
void deal_work ( HWND ) ;
//定义定时器中断回调函数的原型
VOID CALLBACK MyTimerProc ( HWND hWnd , UINT uMsg , UINT idEvent , DWORD dwTime ) ;
/*-------------------------------------------------------------------------------------*/
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
/*------------------------------------------------*/
//当程序开启后不能显示窗口时,请将以下代码设为非注释
//InitCommonControls ( ) ;
/*------------------------------------------------*/
hInst = hInstance ;
//Mask只用于调试时使用
int Mask = DialogBox ( hInstance , ( LPCTSTR )IDD_MACSHOW , NULL , ( DLGPROC ) WndProc ) ;
// Mask = Mask ;
// Mask = GetLastError ( ) ;
return 0;
}
void JustBuffer ( char * b , int n , int id )
{
itoa ( id , b , 10 );
}
void Refresh ( HWND hWnd )
{
int i ;
char time [ 10 ] ;
char buffer [ ] = "Machine 000" ;
//获得显示台
HWND subWnd1 ;
HWND subWnd2 ;
subWnd1 = GetDlgItem ( hWnd , IDC_SHOW ) ;
subWnd2 = GetDlgItem ( hWnd , IDC_ASHOW ) ;
up.SetHWND ( subWnd1 ) ;
down.SetHWND ( subWnd2 ) ;
/*-----------------------------------------------------------*/
//刷新上显示台
//刷新机器数目
if ( wp.macnum() != up.column_num -1 )
{
while ( up.column_num != 1 )
{ up.DelColumn ( 1 ) ;
}
for ( i = 0 ; i < wp.macnum() ; i ++ )
{
JustBuffer ( &buffer [ 8 ] , 3 , i ) ;
up.AddColumn ( buffer , 11 , up.column_num , 95 ) ;
}
}
//刷新正在运行消息
for ( i = 1 ; i < up.column_num ; i ++ )
{
JustBuffer ( time , 10 , wp.doer_inf ( i - 1 ) ->Get_rTime ( ) ) ;
up.AddValueItem ( time , 10 , 0 , i ) ;
}
/*-----------------------------------------------------------*/
//刷新下显示台
//刷新机器数目
if ( wp.macnum() != down.column_num -1 )
{
while ( down.column_num != 1 )
{ down.DelColumn ( 1 ) ;
}
for ( i = 0 ; i < wp.macnum() ; i ++ )
{
JustBuffer ( &buffer [ 8 ] , 3 , i ) ;
down.AddColumn ( buffer , 11 , down.column_num , 95 ) ;
}
}
/*--------------------------------------*/
//矫正下显示台任务数
int tn = wp.MostTaskMac ( ) ;
while ( tn < down.item_num -1 )
down.DelItem ( down.item_num - 1 ) ;
while ( tn > down.item_num - 1 )
{ strcpy ( time , "task 0" ) ;
JustBuffer ( &time [ 5 ] , 1 , down.item_num ) ;
down.AddFirstItem ( time , 10 , down.item_num ) ;
}
/*--------------------------------------*/
//刷新各机器任务信息
for ( i = 0 ; i < wp.macnum ( ) ; i++ )
{
//刷新机器i的信息
//对应column(i+1)的信息
//清除原信息
for ( tn = 0 ; tn < down.item_num ; tn ++ )
down.AddValueItem ( "" , 1 , tn , i + 1 ) ;
//添加新信息
task * bList = wp.doer_inf ( i ) ->get_bList ( ) ;
bList = bList ->next ;
//刷新总任务时间信息
JustBuffer ( time , 10 , wp.doer_inf ( i ) ->all_time ) ;
down.AddValueItem ( time , 10 , 0 , i + 1 ) ;
//刷新详细任务时间信息
for ( tn = 0 ; tn < wp.doer_inf ( i )->get_tasknum ( ) ; tn ++ )
{
if ( bList != NULL )
{
JustBuffer ( time , 10 , bList ->time ) ;
down.AddValueItem ( time , 10 , tn + 1 , i + 1 ) ;
bList = bList ->next ;
}
}
}
/*-----------------------------------------------------------*/
}
void InitDialog ( HWND hWnd )
{
// HWND subWnd ;
InitShow ( hWnd ) ;
}
bool InitShow ( HWND hWnd )
{
HWND subWnd1 ;
HWND subWnd2 ;
int i ;
int mac_num = wp.macnum ( ) ;
char buffer [ ] = "Machine 000" ;
char time [ 10 ] = "00000000" ;
// int id ;
subWnd1 = GetDlgItem ( hWnd , IDC_SHOW ) ;
subWnd2 = GetDlgItem ( hWnd , IDC_ASHOW ) ;
up.SetHWND ( subWnd1 ) ;
down.SetHWND ( subWnd2 ) ;
/*----------------------------------------------*/
//初始化上显示台
up.AddColumn ( "Content" , 7 , up.column_num , 85 ) ;
up.AddFirstItem ( "RestTime:" , 9 , up.item_num ) ;
for ( i = 0 ; i < mac_num ; i ++ )
{
JustBuffer ( &buffer [ 8 ] , 3 , i ) ;
JustBuffer ( time , 10 , wp.doer_inf ( i ) ->doing.time ) ;
up.AddColumn ( buffer , 11 , up.column_num , 95 ) ;
up.AddValueItem ( time , 10 , 0 , up.column_num - 1 ) ;
}
/*----------------------------------------------*/
//初始化下显示台
buffer [ 8 ] = '0' ;
down.AddColumn ( "Content" , 7 , up.column_num , 85 ) ;
down.AddFirstItem ( "Total:" , 5 , down.item_num ) ;
for ( i = 0 ; i < mac_num ; i ++ )
{
JustBuffer ( &buffer [ 8 ] , 3 , i ) ;
JustBuffer ( time , 10 , wp.doer_inf ( i ) ->all_time ) ;
down.AddColumn ( buffer , 11 , down.column_num , 95 ) ;
down.AddValueItem ( time , 10 , 0 , down.column_num - 1 ) ;
}
//写入具体任务
strcpy ( buffer , "Task 0" ) ;
for ( i = 0 ; i < wp.MostTaskMac ( ) ; i ++ )
{
JustBuffer ( &buffer [ 5 ] , 1 , i ) ;
}
/*----------------------------------------------*/
return TRUE;
}
LRESULT CALLBACK WndProc ( HWND hWnd , UINT message , WPARAM wParam , LPARAM lParam )
{
/***************************************************************/
switch ( message )
{
case WM_INITDIALOG :
{
InitDialog ( hWnd ) ;
}
case WM_COMMAND : //各类控件消息
{
switch ( LOWORD ( wParam ) )
{
case IDOK:
break ;
case IDCANCEL : //退出
EndDialog ( hWnd , LOWORD ( wParam ) ) ;
break ;
case IDC_ATASK_TIME :
{
if ( HIWORD (wParam) == EN_UPDATE ) //响应EN_UPDATE事件
{
if ( !AddTask ( hWnd ) )
{ MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;
}
}
}
break ;
case IDC_ADD : //添加任务
{
if ( !AddTask ( hWnd ) )
{
MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;
}
}
break ;
case IDC_CLEAR : //清除所有任务
wp.clear ( ) ;
Refresh ( hWnd ) ;
break ;
case IDC_DTASK_TIME :
{
if ( HIWORD (wParam) == EN_UPDATE ) //响应EN_UPDATE事件
{
if ( !DelTask ( hWnd , IDC_DTASK_TIME ) )
{ MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;
}
}
}
break ;
case IDC_MAC_NUM :
{
if ( HIWORD (wParam) == EN_UPDATE ) //响应EN_UPDATE事件
{
if ( !DelTask ( hWnd , IDC_MAC_NUM ) )
{ MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;
}
}
}
break ;
case IDC_DELETE : //删除任务事件
{
if ( !DelTask ( hWnd , IDC_MAC_NUM ) )
{ MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;
}
}
break ;
case IDC_MAC : //改变机器数文本栏修改事件
{
if ( HIWORD ( wParam ) == EN_UPDATE )
{
if ( !ChangeMac ( hWnd ) )
MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;
}
}
break ;
case IDC_CHANGE : //改变机器数目
{
if ( !ChangeMac ( hWnd ) )
MessageBox ( hWnd , "Input is illegal,please input again" , "Input_Error" , IDOK ) ;
}
break ;
case IDC_WORK : //开启机器作业
{
deal_work ( hWnd ) ;
}
default :
break ;
}
}
}
return 0 ;
}
//定义定时器中断回调函数的原型
VOID CALLBACK MyTimerProc ( HWND hWnd , UINT uMsg , UINT idEvent , DWORD dwTime )
{
if ( !wp.is_work )
{//停止工作
//设置事件按钮文本
HWND subWnd = GetDlgItem ( hWnd , IDC_WORK ) ;
SetWindowText ( subWnd , "Working" ) ;
wp.Set_Conduct ( false ) ;
//关闭定时器,停止模拟工作
KillTimer ( hWnd , WM_MYTIMER ) ;
return ;
}
wp.OneStep ( ) ;
Refresh ( hWnd ) ;
//检查是否所有任务都完成
wp.CountTotal ( ) ;
if ( wp.total == 0 )
{
//停止工作
//设置事件按钮文本
HWND subWnd = GetDlgItem ( hWnd , IDC_WORK ) ;
SetWindowText ( subWnd , "Working" ) ;
wp.Set_Conduct ( false ) ;
//关闭定时器,停止模拟工作
KillTimer ( hWnd , WM_MYTIMER ) ;
//发送消息
MessageBox ( hWnd , "^_^All Task Have Done!!!^_^" ,"It's good news!" , IDOK ) ;
}
}
//处理车间工作开关事件
void deal_work ( HWND hWnd )
{
//获得该事件对象的句柄
HWND subWnd ;
subWnd = GetDlgItem ( hWnd , IDC_WORK ) ;
/*--------------------------------------------------*/
if ( !wp.is_work )
{//开始工作
//设置事件按钮文本
SetWindowText ( subWnd , "Stop Working" ) ;
wp.Set_Conduct ( true ) ;
//开启定时器,模拟工作
SetTimer ( hWnd , WM_MYTIMER , ELAPSE , MyTimerProc ) ;
}
else
{//停止工作
//设置事件按钮文本
SetWindowText ( subWnd , "Working" ) ;
wp.Set_Conduct ( false ) ;
//关闭定时器,停止模拟工作
KillTimer ( hWnd , WM_MYTIMER ) ;
}
}
//改变车间机器数目
bool ChangeMac ( HWND hWnd )
{
HWND subWnd = GetDlgItem ( hWnd , IDC_MAC ) ;
char buffer [ 10 ] ;
int i ;
GetWindowText ( subWnd , buffer , 10 ) ;
// 检查是否完成输入
if ( !InputReturn ( subWnd , IDC_MAC , buffer , 10 ) )
return true ; //返回输入合法(但并不代表输入合法,只是没有完成输入,不作任何检查
/*------------------------------------------------------------------*/
//检查输入是否合法
for ( i = 0 ; i < 10 && buffer [ i ] != 0 ; i ++ )
{
if ( buffer [ i ] < '0' || buffer [ i ] > '9' )
return false ;//输入不合法
}
/*-------------------------------------------------------------------*/
//改变机器数目
int tmp = atoi ( buffer ) ;
if ( tmp <= 0 || tmp > 340 )
{
MessageBox ( hWnd , "Please input a number between 0 - 340" , "Input Error" , IDOK );
return true ;
}
wp.SetMacNum ( tmp ) ;
Refresh ( hWnd ) ;
return true ;
}
bool DelTask ( HWND hWnd , int id )
{
if ( id != IDC_MAC_NUM && id != IDC_DTASK_TIME )
return true ;
HWND subWnd ;
subWnd = GetDlgItem ( hWnd , id ) ;
HWND otherWnd ;
if ( id == IDC_MAC_NUM )
otherWnd = GetDlgItem ( hWnd , IDC_DTASK_TIME ) ;
else
otherWnd = GetDlgItem ( hWnd , IDC_MAC_NUM ) ;
char buf [ 10 ] = "" ;
char obuf [ 10 ] = "" ;
int i = 0 ;
GetWindowText ( otherWnd , obuf , 10 ) ;
/*-----------------------------------------------------------------*/
//检查是否完成输入
if ( !InputReturn ( subWnd , id , buf , 10 ) )
return true ; //返回输入合法(但并不代表输入合法,只是没有完成输入,不作任何检查
/*-----------------------------------------------------------------*/
//检查输入是否合法
for ( i = 0 ; i < 10 && buf [ i ] != 0 ; i ++ )
{
if ( buf [ i ] < '0' || buf [ i ] > '9' )
{
return false ;
}
}
for ( i = 0 ; i < 10 && obuf [ i ] != 0 ; i ++ )
{
if ( obuf [ i ] < '0' || obuf [ i ] > '9' )
{
return false ;
}
}
/*-----------------------------------------------------------------*/
SetWindowText ( subWnd , "" ) ;
SetWindowText ( otherWnd , "" ) ;
//进行删除操作
int tmp = atoi ( buf ) ;
int otmp = atoi ( obuf ) ;
//排除无效数据
if ( tmp >= wp.macnum ( ) && id == IDC_MAC_NUM )
return true ;
else if ( otmp >= wp.macnum ( ) && id == IDC_DTASK_TIME )
return true ;
//删除任务
if ( id == IDC_MAC_NUM )
wp.del_task ( tmp , otmp ) ;
else
wp.del_task ( otmp , tmp ) ;
//优化任务分配
wp.get_optimize ( ) ;
//刷新显示台
Refresh ( hWnd ) ;
return true ;
}
bool AddTask ( HWND hWnd )
{
//检查是否完成输入
char buffer [ 10 ] = "";
int i = 0 ;
HWND subWnd ;
subWnd = GetDlgItem ( hWnd , IDC_ATASK_TIME ) ;
/*----------------------------------------------------------*/
if ( !InputReturn ( subWnd , IDC_ATASK_TIME , buffer , 10 ) )
return true ;//返回输入合法(但并不代表输入合法,只是没有完成输入,不作任何检查
/*----------------------------------------------------------*/
//检查输入是否合法
for ( i = 0 ; i < 10 && buffer [ i ] != 0 ; i ++ )
if ( buffer [ i ] < '0' || buffer [ i ] > '9' )
{
SetWindowText ( subWnd , buffer ) ;
return false;//返回输入不合法
}
/*----------------------------------------------------------*/
//添加任务
int temp = atoi ( buffer ) ;
if ( temp == 0 )//无意义任务
return true ;
task tmp ;
tmp.time = temp ;
wp.add_task ( tmp ) ;
//优化任务分配
wp.get_optimize ( ) ;
//刷新显示台
Refresh ( hWnd ) ;
return true ;
}
bool InputReturn ( HWND subWnd , int ID , char * buffer , int n )
{
int oldNum ;
static int oldNum0 = 0 ; //如果文本框中两次字符数目一致,则认为有回车键被按下
static int oldNum1 = 0 ;
static int oldNum2 = 0 ;
static int oldNum3 = 0 ;
switch ( ID )
{
case IDC_ATASK_TIME :
oldNum = oldNum0 ;
break ;
case IDC_DTASK_TIME :
oldNum = oldNum2 ;
break ;
case IDC_MAC_NUM :
oldNum = oldNum1 ;
break ;
case IDC_MAC :
oldNum = oldNum3 ;
break ;
default :
return false ;
}
GetWindowText ( subWnd , buffer , n ) ;
//如果本次内容长度和上次内容长度一致,则认为用户按下了回车键
if ( (unsigned)oldNum != strlen ( buffer ) )
{
oldNum = strlen ( buffer ) ;
switch ( ID )
{
case IDC_ATASK_TIME :
oldNum0 = oldNum ;
break ;
case IDC_DTASK_TIME :
oldNum2 = oldNum ;
break ;
case IDC_MAC_NUM :
oldNum1 = oldNum ;
break ;
case IDC_MAC :
oldNum3 = oldNum ;
break ;
default :
return false ;
}
return false ;
}
//清空文本框内容
SetWindowText ( subWnd , "" ) ;
//重置上一次内容长度
switch ( ID )
{
case IDC_ATASK_TIME :
oldNum0 = 0;
break ;
case IDC_DTASK_TIME :
oldNum2 = 0 ;
break ;
case IDC_MAC_NUM :
oldNum1 = 0;
break ;
case IDC_MAC :
oldNum3 = 0 ;
break ;
default :
return false ;
}
return true ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -