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

📄 lessondoc.cpp

📁 为学校教导用的排课系统。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// LessonDoc.cpp : implementation of the CLessonDoc class
//

#include "stdafx.h"
#include "Lesson.h"

#include "LessonDoc.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#include "SetDlg.h"
#include "ChangeLessonDlg.h"
#include "Mainfrm.h"
#include "ArrangeDlg.h"
#define MISS(i) ((CMission*)m_TempArray.GetAt(i))
#define ADDMISS(i,week,stanza) MISS(i)->m_Sit[week][stanza]=TRUE;MISS(i)->m_Info.m_Num++;MISS(i)->m_Info.m_StanzaLesson[stanza]++;MISS(i)->m_Info.m_WeekLesson[week]++;
#define KILLMISS(i,week,stanza) MISS(i)->m_Sit[week][stanza]=FALSE;MISS(i)->m_Info.m_Num--;MISS(i)->m_Info.m_StanzaLesson[stanza]--;MISS(i)->m_Info.m_WeekLesson[week]--;

/////////////////////////////////////////////////////////////////////////////
// CLessonDoc
struct INFO
{
	public:
		CDocument * pDoc;
		CDialog * dlg;
}m_Info;

UINT ArrangePro(LPVOID pParam)
{
	int i=0;
	INFO * info=(INFO * )pParam;
	CLessonDoc * pDoc=(CLessonDoc *)info->pDoc;
	CArrangeDlg * dlg=(CArrangeDlg *)info->dlg;
//	if(pDoc->StartArrange(dlg))
	if(pDoc->Arrange(dlg,pDoc->m_Info.m_Depth))
		dlg->SendMessage(WM_CLOSE);
	return 0;
}

IMPLEMENT_DYNCREATE(CLessonDoc, CDocument)

BEGIN_MESSAGE_MAP(CLessonDoc, CDocument)
	//{{AFX_MSG_MAP(CLessonDoc)
	ON_COMMAND(ID_ARRANGE, OnArrange)
	ON_COMMAND(ID_CHANGELESSON, OnChangelesson)
	ON_COMMAND(ID_SET, OnSet)
	ON_COMMAND(ID_TM, OnTm)
	ON_UPDATE_COMMAND_UI(ID_TM, OnUpdateTm)
	ON_UPDATE_COMMAND_UI(ID_TL, OnUpdateTl)
	ON_COMMAND(ID_CL, OnCl)
	ON_UPDATE_COMMAND_UI(ID_CL, OnUpdateCl)
	ON_UPDATE_COMMAND_UI(ID_ARRANGE, OnUpdateArrange)
	ON_COMMAND(ID_NEW, OnNew)
	ON_UPDATE_COMMAND_UI(ID_CHANGELESSON, OnUpdateChangelesson)
	ON_COMMAND(ID_TL, OnTl)
	ON_COMMAND(ID_SAVE_LESSON, OnSaveLesson)
	ON_UPDATE_COMMAND_UI(ID_SAVE_LESSON, OnUpdateSaveLesson)
	ON_UPDATE_COMMAND_UI(ID_FILE_PRINT, OnUpdateFilePrint)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLessonDoc construction/destruction

CLessonDoc::CLessonDoc()
{
	// TODO: add one-time construction code here
	m_Info.InitInstance();
	m_Print.pDoc=this;
}

CLessonDoc::~CLessonDoc()
{
}

BOOL CLessonDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)
	OnTm();
	for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
		delete m_TeacherArray.GetAt(i);
	m_TeacherArray.RemoveAll();
	m_Info.InitInstance();

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CLessonDoc serialization

void CLessonDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
		m_Info.Serialize(ar);
		m_TeacherArray.Serialize(ar);
	}
	else
	{
		// TODO: add loading code here
		m_Info.Serialize(ar);
		m_TeacherArray.Serialize(ar);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CLessonDoc diagnostics

#ifdef _DEBUG
void CLessonDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CLessonDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CLessonDoc commands

void CLessonDoc::SELECTINFO::InitInstance()
{
	m_ViewStatus=TEACHER_MISSION;
	m_SelectTeacherName.Empty();
	m_SelectGrade=0;
	m_SelectClass=0;
	m_IsArrangeRight=FALSE;
	m_Week=7;
	m_Stanza=9;
	m_Depth=((CLessonApp *)AfxGetApp())->GetProfileInt("Settings","Depth",2);
}

void CLessonDoc::SELECTINFO::Serialize(CArchive &ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
		ar<<m_SelectTeacherName<<m_SelectGrade<<m_SelectClass;//<<m_ViewStatus;
		ar<<m_Stanza<<m_Week<<m_IsArrangeRight;
	}
	else
	{
		// TODO: add loading code here
		ar>>m_SelectTeacherName>>m_SelectGrade>>m_SelectClass;//>>m_ViewStatus;
		ar>>m_Stanza>>m_Week>>m_IsArrangeRight;
	}
}

CString CLessonDoc::NewName()
{
	CString name="新增教师";
	int i=1;
	while(GetTeacher(name))
	{
		name.Format("新增教师%d",i);
		i++;
	}
	return name;
}

CString CLessonDoc::GetSubject(CTeacher *teacher, int Week, int Stanza)
{
	if(teacher==NULL)return "  ";
	CMission * Mission;
	for(int i=teacher->m_MissionArray.GetSize()-1;i>=0;i--)
	{
		Mission=(CMission *)teacher->m_MissionArray.GetAt(i);
		if(Mission->m_Sit[Week][Stanza])
			return Mission->m_Subject;
	}
	return "  ";
}

CTeacher * CLessonDoc::GetTeacher(CString Name)
{
	CTeacher * teacher;
	for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
	{
		teacher=(CTeacher *)m_TeacherArray.GetAt(i);
		if(!teacher->m_Name.CompareNoCase(Name))
			return teacher;
	}
	return NULL;
}

CTeacher * CLessonDoc::GetTeacher(int nIndex)
{
	int Count=m_TeacherArray.GetSize()-1;
	if(nIndex<0||nIndex>Count)
		return NULL;
	else
		return((CTeacher *)m_TeacherArray.GetAt(nIndex));
}

int CLessonDoc::GetTeacherIndex(CString Name)
{
	CTeacher * teacher;
	for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
	{
		teacher=(CTeacher *)m_TeacherArray.GetAt(i);
		if(!teacher->m_Name.CompareNoCase(Name))
			return i;
	}
	return -1;
}

int CLessonDoc::GetTeacherIndex(CTeacher *Teacher)
{
	return GetTeacherIndex(Teacher->m_Name);
}

CMission* CLessonDoc::GetMission(int Grade, int Class, CString Subject, int Num)
{
	CTeacher * Teacher;
	CMission * Mission;
	for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
	{
		Teacher=(CTeacher *)m_TeacherArray.GetAt(i);
		for(int j=Teacher->m_MissionArray.GetSize()-1;j>=0;j--)
		{
			Mission=(CMission*)Teacher->m_MissionArray.GetAt(j);
			if(Mission->m_Grade==Grade&&Mission->m_Class==Class&&!Mission->m_Subject.CompareNoCase(Subject))
				if(Num==0||Mission->m_Num==Num)
					return Mission;
		}
	}
	return NULL;
}

CView * CLessonDoc::GetListView()
{
	__POSITION * pos=GetFirstViewPosition();
	return GetNextView(pos);
}

CView * CLessonDoc::GetTreeView()
{
	__POSITION * pos=GetFirstViewPosition();
	pos=GetFirstViewPosition();
	return GetNextView(pos);
}

int CLessonDoc::GetGradeCount()
{
	int nIndex=0;
	CTeacher * teacher;
	CMission * mission;
	for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
	{
		teacher=(CTeacher *)m_TeacherArray.GetAt(i);
		for(int j=teacher->m_MissionArray.GetSize()-1;j>=0;j--)
		{
			mission=(CMission *)teacher->m_MissionArray.GetAt(j);
			if(mission->m_Grade>nIndex)
				nIndex=mission->m_Grade;
		}
	}
	return nIndex;
}

int CLessonDoc::GetClassCount(int Grade)
{
	int nIndex=0;
	CTeacher * teacher;
	CMission * mission;
	for(int i=m_TeacherArray.GetSize()-1;i>=0;i--)
	{
		teacher=(CTeacher *)m_TeacherArray.GetAt(i);
		for(int j=teacher->m_MissionArray.GetSize()-1;j>=0;j--)
		{
			mission=(CMission *)teacher->m_MissionArray.GetAt(j);
			if(mission->m_Grade==Grade&&mission->m_Class>nIndex)
				nIndex=mission->m_Class;
		}
	}
	return nIndex;
}

void CLessonDoc::SetModifiedFlag()
{
	CString text;
	CWnd * pw=AfxGetApp()->m_pMainWnd;
	pw->GetWindowText(text);
	if(text.Right(7).CompareNoCase("-未保存"))
	{
		text+="-未保存";
		pw->SetWindowText(text);
	}	
	CDocument::SetModifiedFlag();
}

void CLessonDoc::OnArrange() 
{
	// TODO: Add your command handler code here
	if(m_Info.m_IsArrangeRight==FALSE||MessageBox(GetListView()->m_hWnd,"课程已经排好,重新排课将覆盖原有的课表!\n\n确实需要重新排课吗?","覆盖?",MB_OKCANCEL|MB_ICONINFORMATION)==IDOK)
	{
		BuildTemp();
		CArrangeDlg dlg;
		dlg.m_StopFlag=FALSE;
		INFO * m_Info=new(INFO);
		m_Info->dlg=&dlg;
		m_Info->pDoc=this;
		AfxBeginThread(ArrangePro,m_Info);
		dlg.DoModal();
		SetModifiedFlag();
	}
}

void CLessonDoc::OnUpdateArrange(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(GetMissionCount()>0)
		pCmdUI->Enable();
	else
		pCmdUI->Enable(0);
}

void CLessonDoc::OnChangelesson() 
{
	CChangeLessonDlg dlg;
	dlg.m_pDoc=this;
	///////////////////
	if(dlg.DoModal()==IDOK)
	{
		if(ChangeLesson(dlg.m_Info[0],dlg.m_Info[1],dlg.m_Info[2],dlg.m_Info[3],dlg.m_Info[4],dlg.m_Info[5])==TRUE)
			SetModifiedFlag();
	}
}

void CLessonDoc::OnUpdateChangelesson(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_Info.m_IsArrangeRight)
		pCmdUI->Enable();
	else
		pCmdUI->Enable(0);
}

void CLessonDoc::OnSet() 
{
	// TODO: Add your command handler code here
	CSetDlg dlg;
	dlg.m_Depth.Format("%d",m_Info.m_Depth);
	dlg.m_Stanza.Format("%d",m_Info.m_Stanza);
	dlg.m_Week.Format("%d",m_Info.m_Week);
	if(dlg.DoModal()==IDOK)
	{
		int Stanza=atoi(dlg.m_Stanza);
		int Week=atoi(dlg.m_Week);
		int Depth=atoi(dlg.m_Depth);
		((CLessonApp*)AfxGetApp())->WriteProfileInt("Settings","Depth",atoi(dlg.m_Depth));
		if(m_Info.m_Week!=Week||m_Info.m_Stanza!=Stanza)
		{
			OnTm();
			m_Info.m_IsArrangeRight=FALSE;
			SetModifiedFlag();
		}
		m_Info.m_Stanza=Stanza;
		m_Info.m_Week=Week;
		m_Info.m_Depth=Depth;
		((CLessonApp*)AfxGetApp())->WriteProfileInt("Settings","Depth",atoi(dlg.m_Depth));
	}
}

void CLessonDoc::OnTm() 
{
	// TODO: Add your command handler code here
	switch(m_Info.m_ViewStatus)
	{
	case TEACHER_MISSION:
		break;
	case TEACHER_LESSON:
		m_Info.m_ViewStatus=TEACHER_MISSION;
		UpdateAllViews(GetListView());
		break;
	case CLASS_LESSON:
		m_Info.m_ViewStatus=TEACHER_MISSION;
		UpdateAllViews(0);
		break;
	default:
		m_Info.m_ViewStatus=TEACHER_MISSION;
		UpdateAllViews(0);
	}	
}

void CLessonDoc::OnUpdateTm(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_Info.m_ViewStatus==TEACHER_MISSION)
		pCmdUI->SetCheck();
	else
		pCmdUI->SetCheck(0);	
}

void CLessonDoc::OnTl() 
{
	// TODO: Add your command handler code here
	switch(m_Info.m_ViewStatus)
	{
	case TEACHER_LESSON:
		break;
	case TEACHER_MISSION:
		m_Info.m_ViewStatus=TEACHER_LESSON;
		UpdateAllViews(GetListView());
		break;
	case CLASS_LESSON:
		m_Info.m_ViewStatus=TEACHER_LESSON;
		UpdateAllViews(0);
		break;
	default:
		m_Info.m_ViewStatus=TEACHER_MISSION;
		UpdateAllViews(0);
	}
}

void CLessonDoc::OnUpdateTl(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	if(m_Info.m_ViewStatus==TEACHER_LESSON)
		pCmdUI->SetCheck();
	else
		pCmdUI->SetCheck(0);

	if(m_Info.m_IsArrangeRight)
		pCmdUI->Enable();
	else

⌨️ 快捷键说明

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