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

📄 sheetview.cpp

📁 我上载了那么多怎么都说已经有上载的啦
💻 CPP
字号:
// SheetView.cpp : implementation file
//

#include "stdafx.h"
#include "GPMIS.h"
#include "SheetView.h"
#include "ScoreView.h"
#include "ThemeView.h"
#include "MainFrm.h"
#include "global.h"
#include "student.h"
#include "bcmenu.h"
#include "SheetCountDlg.h"
#include "theme.h"
#include "score.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSheetView
extern CGPMISApp theApp;

#define NUM1_COLUMNS	8

static _TCHAR *_gszLabel1[NUM1_COLUMNS] =
{
    _T("序号"), _T("班级"), _T("学号"), _T("姓名"), _T("性别"), _T("指导老师"), _T("联系方式"), _T("上机地点")
};
static int _gnFmt1[NUM1_COLUMNS] = 
{
	LVCFMT_LEFT, LVCFMT_LEFT, LVCFMT_CENTER , LVCFMT_CENTER, LVCFMT_CENTER, LVCFMT_CENTER, LVCFMT_CENTER , LVCFMT_CENTER 
};
static int _gnWidth1[NUM1_COLUMNS] = 
{
	50, 80, 90, 65, 45, 65, 150, 70
};

IMPLEMENT_DYNCREATE(CSheetView, CListVwEx)

CSheetView::CSheetView()
{
	m_strTeacher = "";
	m_strClass = "";
}

CSheetView::~CSheetView()
{
}


BEGIN_MESSAGE_MAP(CSheetView, CListVwEx)
	//{{AFX_MSG_MAP(CSheetView)
	ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndLabelEdit)
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_SHEET_COUNT, OnSheetCount)
	ON_COMMAND(ID_DELETE_STUDENT, OnDeleteStudent)
	ON_UPDATE_COMMAND_UI(ID_DELETE_STUDENT, OnUpdateDeleteStudent)
	ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSheetView drawing

void CSheetView::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
	PrintList(pDC);
}

/////////////////////////////////////////////////////////////////////////////
// CSheetView diagnostics

#ifdef _DEBUG
void CSheetView::AssertValid() const
{
	CListVwEx::AssertValid();
}

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

/////////////////////////////////////////////////////////////////////////////
// CSheetView message handlers

static _TCHAR *_gszPlace[] =
{ "机房",  "宿舍",  "公司",  "家里",  "\0"
};

void CSheetView::OnInitialUpdate() 
{
	CListVwEx::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	DrawLabel();
	DrawList();

	int nColumnType[64];
	nColumnType[0] = ELCT_INTEGER;	
	nColumnType[1] = ELCT_STRING_CASE;	
	nColumnType[2] = ELCT_STRING_CASE;	
	nColumnType[3] = ELCT_STRING_CASE;	
	nColumnType[4] = ELCT_STRING_CASE;	
	nColumnType[5] = ELCT_STRING_CASE;	
	nColumnType[6] = ELCT_STRING_CASE;	
	nColumnType[7] = ELCT_STRING_CASE;	
	nColumnType[8] = ELCT_STRING_CASE;	
	SetColumnType(nColumnType);

	BOOL bCanEdit[64];
	bCanEdit[0] = FALSE;	
	bCanEdit[1] = FALSE;	
	bCanEdit[2] = FALSE;	
	bCanEdit[3] = FALSE;	
	bCanEdit[4] = FALSE;	
	bCanEdit[5] = FALSE;	
	bCanEdit[6] = FALSE;	
	bCanEdit[7] = FALSE;	
	bCanEdit[8] = FALSE;	
	SetCanEdit(bCanEdit);

	int nColumnCtrl[64];
	nColumnCtrl[0] = eEdit;	
	nColumnCtrl[1] = eEdit;	
	nColumnCtrl[2] = eEdit;	
	nColumnCtrl[3] = eEdit;	
	nColumnCtrl[4] = eEdit;	
	nColumnCtrl[5] = eEdit;	
	nColumnCtrl[6] = eEdit;	
	nColumnCtrl[7] = eCombo;	
	SetColumnCtrl(nColumnCtrl);

	int i = 0;
	while(_gszPlace[i][0] != '\0')
	{
		GetStringList(7).AddTail(_gszPlace[i]);
		i++;
	}

	GetListCtrl().SetExtendedStyle(LVS_EX_GRIDLINES);
}

void CSheetView::DrawLabel()
{
	int i;
	LV_COLUMN lvc;
	CListCtrl& ListCtrl = GetListCtrl();

	// delete columns
	int sum = NUM1_COLUMNS;
	_TCHAR **szLabel = _gszLabel1;
	int *nWidth = _gnWidth1;
	int *nFmt = _gnFmt1;

	for(i = 0; i<NUM1_COLUMNS; i++)
	{
		ListCtrl.DeleteColumn(0);
	}

	// insert columns
	lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;

	for(i = 0; i<sum; i++)
	{
		lvc.iSubItem = i;
		lvc.pszText = szLabel[i];
		lvc.cx = nWidth[i];
		lvc.fmt = nFmt[i];
		ListCtrl.InsertColumn(i,&lvc);
	}

	ListCtrl.EnableToolTips(TRUE);
	SetSortFirstCol(TRUE);
}

void CSheetView::DrawList()
{
	LV_ITEM lvi;
	CListCtrl& ListCtrl = GetListCtrl();
	int i = 0;
	char cNum[100];
	CString key;
	CString strName;

	// delete list items
	ListCtrl.DeleteAllItems();

	lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
	lvi.iSubItem = 0;
	lvi.iImage = 0;
	lvi.stateMask = LVIS_STATEIMAGEMASK;
	lvi.state = INDEXTOSTATEIMAGEMASK(1);
	
	BOOL bCanEdit[64];
	bCanEdit[0] = FALSE;	
	bCanEdit[1] = FALSE;	
	bCanEdit[2] = FALSE;	
	bCanEdit[3] = FALSE;	
	bCanEdit[4] = FALSE;	
	bCanEdit[5] = FALSE;	
	bCanEdit[6] = FALSE;	
	bCanEdit[7] = FALSE;	
	if( m_strTeacher == theApp.GetLogin() || theApp.IsAdmin() )
	{
		if( theApp.IsAdmin() )
			bCanEdit[5] = TRUE;	//管理员调整指导老师
		bCanEdit[6] = TRUE;	 // 修改联系方式
	}
	SetCanEdit(bCanEdit);

	CStudentList& studentList = CGlobal::GetInstance().m_studentList;
	for ( POSITION pos = studentList.GetHeadPosition(); pos != NULL; )
	{
		CStudent* pStudent = studentList.GetNext( pos );
		if( pStudent )
		{
			BOOL bDisplay = TRUE;
			if( m_strTeacher != "" && m_strTeacher != pStudent->GetTeacher() )
				bDisplay = FALSE;
			if( m_strClass != "" && m_strClass != pStudent->GetClass() )
				bDisplay = FALSE;
			if( bDisplay )
			{
				// insert items
				sprintf(cNum,"%d",pStudent->GetID());
				lvi.iItem = i;
				lvi.pszText = (LPTSTR)cNum;
				ListCtrl.InsertItem(&lvi);

				// set SelectedItem text for additional columns
				ListCtrl.SetItemText(i, 1, pStudent->GetClass());
				ListCtrl.SetItemText(i, 2, pStudent->GetNumber());
				ListCtrl.SetItemText(i, 3, pStudent->GetName());
				ListCtrl.SetItemText(i, 4, pStudent->GetSex());
				ListCtrl.SetItemText(i, 5, pStudent->GetTeacher());
				ListCtrl.SetItemText(i, 6, pStudent->GetContact());
				ListCtrl.SetItemText(i, 7, pStudent->GetPlace());
						
				i++;
			}
		}
	}

}

BOOL CSheetView::PreCreateWindow(CREATESTRUCT& cs) 
{
	// TODO: Add your specialized code here and/or call the base class
	return CListVwEx::PreCreateWindow(cs);
}

void CSheetView::OnContextMenu(CWnd* pWnd, CPoint point) 
{
	// TODO: Add your message handler code here
	BCMenu menu;
	menu.LoadMenu(IDR_POPUP_MENU);
	menu.LoadToolbar(IDR_TOOLBAR_CONTEXT);		
	CMenu* psubmenu = NULL;
	psubmenu = menu.GetSubMenu(3);

	if( psubmenu )
	{
		psubmenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, AfxGetMainWnd());
	}
	
}

void CSheetView::OnSheetCount() 
{
	// TODO: Add your command handler code here
	CSheetCountDlg	SheetCountDlg(this);

	SheetCountDlg.DoModal();
}

void CSheetView::OnEndLabelEdit(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_DISPINFO *plvDispInfo = (LV_DISPINFO *)pNMHDR;
	LV_ITEM	*plvItem = &plvDispInfo->item;

	int nID = atoi(GetListCtrl().GetItemText(plvItem->iItem, 0));
	CString strNumber = GetListCtrl().GetItemText(plvItem->iItem, 2);
	CStudent* pStudent = CGlobal::GetInstance().FindStudent(nID, strNumber);

	CString sTeacher = pStudent->GetTeacher();
	CString sPhone = pStudent->GetContact();
	CString sPlace = pStudent->GetPlace();
	
	if( m_subitem == 5 && plvItem->pszText != NULL )
	{
		sTeacher = plvItem->pszText;
	}
	if( m_subitem == 6 && plvItem->pszText != NULL )
	{
		sPhone = plvItem->pszText;
	}
	if( plvItem->iSubItem == 7 && plvItem->pszText != NULL )
	{
		GetListCtrl().SetItemText( plvItem->iItem, plvItem->iSubItem, plvItem->pszText);				
		sPlace = plvItem->pszText;
	}

	if( pStudent )
	{
		pStudent->SetTeacher(sTeacher);
		pStudent->SetContact(sPhone);
		pStudent->SetPlace(sPlace);
		CStudent::Update(*pStudent);

		CMainFrame* pMainFrm = (CMainFrame*)GetParentFrame();
		pMainFrm->SetModifySheet(TRUE);
	}

	CListVwEx::OnEndLabelEdit(pNMHDR, pResult);
}


void CSheetView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo) 
{
	// TODO: Add your specialized code here and/or call the base class
	CRect Rect;
	long lWidth, lHeight;

	GetClientRect(&Rect);
	lWidth = Rect.Width();
	lHeight = Rect.Height();

	PrintList(pDC);
	lHeight = m_lHeight;
	// get toolbar state
	m_nPageWidth  = pDC->GetDeviceCaps(HORZRES);
	m_nPageHeight = pDC->GetDeviceCaps(VERTRES);

	m_nXPage = (unsigned int)((float)lWidth*2.54+m_nPageWidth-5)/m_nPageWidth;
	m_nYPage = (unsigned int)((float)lHeight*2.54+m_nPageHeight-5)/m_nPageHeight;
	m_nXPage = (m_nXPage > 0) ? m_nXPage : 1;
	m_nYPage = (m_nYPage > 0) ? m_nYPage : 1;
	pInfo->SetMaxPage(m_nXPage*m_nYPage);
	
	CListVwEx::OnBeginPrinting(pDC, pInfo);
}

void CSheetView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	CListVwEx::OnEndPrinting(pDC, pInfo);
}

void CSheetView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo) 
{
	// TODO: Add your specialized code here and/or call the base class
	CListVwEx::OnPrepareDC(pDC, pInfo);

	if(!pInfo)
		return;

	pDC->SetViewportOrg(-m_nPageWidth*((pInfo->m_nCurPage-1)/m_nYPage), -m_nPageHeight*((pInfo->m_nCurPage-1)%m_nYPage));
}

BOOL CSheetView::OnPreparePrinting(CPrintInfo* pInfo) 
{
	// TODO: call DoPreparePrinting to invoke the Print dialog box
	return DoPreparePrinting(pInfo);

//	return CListVwEx::OnPreparePrinting(pInfo);
}

void CSheetView::PrintList(CDC *pDC)
{
	CRect Rect1,Rect2;
	CMyListCtrl& ListCtrl = (CMyListCtrl&)GetListCtrl();
	CHeaderCtrl* pHeaderCtrl = ListCtrl.GetHeaderCtrl();
	CString strTemp, strTitle;
	int nTitleY = 10;
	int nHeight = 100;
	int nLeft, nRight;
	int sum = NUM1_COLUMNS;
	_TCHAR **szLabel;
	int *nFmt;

	szLabel = _gszLabel1;
	nFmt = _gnFmt1;

	pDC->SetMapMode(MM_ISOTROPIC );
	pDC->SetTextAlign(TA_LEFT);

	CFont* pOldFont = pDC->SelectObject(&m_ftFont);

	for( int j = 0; j<pHeaderCtrl->GetItemCount(); j++) 
	{
		pHeaderCtrl->GetItemRect(j, &Rect1);
		
		strTemp.Format("%s",szLabel[j]);
		Rect2.left = (LONG)(Rect1.left*2.54);
		Rect2.right = (LONG)(Rect1.right*2.54);
		Rect2.top = (LONG)(-Rect1.top*2.54-nHeight);
		Rect2.bottom = (LONG)(-Rect1.bottom*2.54-nHeight);
		if( nFmt[j] == LVCFMT_LEFT )
			pDC->DrawText(strTemp,Rect2,DT_LEFT|DT_VCENTER|DT_SINGLELINE);
		if( nFmt[j] == LVCFMT_CENTER )
			pDC->DrawText(strTemp,Rect2,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
		if( nFmt[j] == LVCFMT_RIGHT )
			pDC->DrawText(strTemp,Rect2,DT_RIGHT|DT_VCENTER|DT_SINGLELINE);
		pDC->MoveTo(Rect2.left, Rect2.bottom);
		pDC->LineTo(Rect2.right, Rect2.bottom);
		if( j == 0 )
			nLeft = Rect2.left;
		if( j == pHeaderCtrl->GetItemCount()-1 )
			nRight = Rect2.right;

		for( int i = 0; i<ListCtrl.GetItemCount(); i++)
		{
			ListCtrl.GetItemRect(i,&Rect2,LVIR_BOUNDS);   
			strTemp = ListCtrl.GetItemText(i,j);
			Rect2.left = (LONG)(Rect1.left*2.54);
			Rect2.right = (LONG)(Rect1.right*2.54);
			Rect2.top = (LONG)(-(Rect2.top*2.54 + 10)-nHeight);
			Rect2.bottom = (LONG)(-(Rect2.bottom*2.54 + 10)-nHeight);
			if( nFmt[j] == LVCFMT_LEFT )
				pDC->DrawText(strTemp,Rect2,DT_LEFT|DT_VCENTER|DT_SINGLELINE);
			if( nFmt[j] == LVCFMT_CENTER )
				pDC->DrawText(strTemp,Rect2,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
			if( nFmt[j] == LVCFMT_RIGHT )
				pDC->DrawText(strTemp,Rect2,DT_RIGHT|DT_VCENTER|DT_SINGLELINE);

		}
	}
	pDC->MoveTo(nLeft, Rect2.bottom);
	pDC->LineTo(nRight, Rect2.bottom);

	pDC->SelectObject(pOldFont);

	m_lHeight = -Rect2.bottom+60;
}


void CSheetView::OnDeleteStudent() 
{
	// TODO: Add your command handler code here
	if( AfxMessageBox("确认删除所选学生?", MB_YESNO|MB_ICONQUESTION) == IDNO )
		return;
	CListCtrl& ctrl = GetListCtrl();
	POSITION pos = ctrl.GetFirstSelectedItemPosition();
	if( !pos )
		return;
	int nindex = ctrl.GetNextSelectedItem(pos);
	if( nindex < 0 )
		return;
	int nID = atoi(ctrl.GetItemText(nindex, 0));
	CString sNumber = ctrl.GetItemText(nindex, 2);
	CStudent* pStudent = CGlobal::GetInstance().FindStudent(nID, sNumber);
	if( pStudent )
	{
		if( CStudent::Delete(*pStudent) )
		{
			CTheme theme = pStudent->GetTheme();
			CScore score = pStudent->GetScore();
			CTheme::Delete(theme);
			CScore::Delete(score);
			CStudentList& list = CGlobal::GetInstance().m_studentList;
			pos = list.Find(pStudent);
			if( pos )
			{
				POSITION prev = pos;
				list.GetNext(pos);
				while( pos )
				{
					CStudent* pStudent = list.GetNext(pos);
					if( pStudent )
					{
						CStudent::Delete(*pStudent);
						pStudent->SetID(pStudent->GetID() - 1);
						CStudent::Create(*pStudent);
					}
				}
				list.RemoveAt(prev);
			}
			CMainFrame* pMainFrm = (CMainFrame*)GetParentFrame();
			pMainFrm->SetModifySheet(TRUE);
			pMainFrm->GetSheetView()->DrawList();
			pMainFrm->GetScoreView()->DrawList();
			pMainFrm->GetThemeView()->DrawList();
		}
	}
}

void CSheetView::OnUpdateDeleteStudent(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(theApp.IsAdmin());
	
}

⌨️ 快捷键说明

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