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

📄 scoreview.cpp

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

#include "stdafx.h"
#include "gpmis.h"
#include "ScoreView.h"
#include "MainFrm.h"
#include "global.h"
#include "student.h"
#include "bcmenu.h"
#include "teacher.h"
#include "ScoreDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// CScoreView
extern CGPMISApp theApp;

#define NUM1_COLUMNS	9

static _TCHAR *_gszLabel1[NUM1_COLUMNS] =
{
    _T("序号"), _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, LVCFMT_CENTER
};
static int _gnWidth1[NUM1_COLUMNS] = 
{
	45, 85, 60, 60, 265, 42, 60, 72, 80
};

IMPLEMENT_DYNCREATE(CScoreView, CListVwEx)

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

CScoreView::~CScoreView()
{
}


BEGIN_MESSAGE_MAP(CScoreView, CListVwEx)
	//{{AFX_MSG_MAP(CScoreView)
	ON_WM_CONTEXTMENU()
	ON_NOTIFY_REFLECT(LVN_ENDLABELEDIT, OnEndLabelEdit)
	ON_COMMAND(ID_STATISTICS, OnStatistics)
	ON_COMMAND(ID_FILE_PRINT, OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, OnFilePrintPreview)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CScoreView drawing

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

/////////////////////////////////////////////////////////////////////////////
// CScoreView diagnostics

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

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

/////////////////////////////////////////////////////////////////////////////
// CScoreView message handlers

void CScoreView::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);

	GetListCtrl().SetExtendedStyle(LVS_EX_GRIDLINES);
	
}

void CScoreView::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(5);

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

void CScoreView::OnStatistics() 
{
	// TODO: Add your command handler code here
	CScoreDlg	ScoreDlg(this);
	ScoreDlg.DoModal();
}

void CScoreView::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 CScoreView::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;	
	bCanEdit[8] = FALSE;	
	if( m_strTeacher == theApp.GetLogin() || theApp.IsAdmin() )
	{
		bCanEdit[5] = TRUE;	 // 修改联系方式
		bCanEdit[8] = TRUE;	
	}
	SetCanEdit(bCanEdit);

	m_nSum = 0;
	m_nScoreSum[0] = m_nScoreSum[1] = m_nScoreSum[2] = m_nScoreSum[3] = m_nScoreSum[4] = m_nScoreSum[5] = 0;
	
	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
				CTeacher* pTeacher = CGlobal::GetInstance().FindTeacher(pStudent->GetTeacher());

				ListCtrl.SetItemText(i, 1, pStudent->GetNumber());
				ListCtrl.SetItemText(i, 2, pStudent->GetName());
				ListCtrl.SetItemText(i, 3, pStudent->GetClass());
				ListCtrl.SetItemText(i, 4, pStudent->GetTheme().GetTheme());
				CString sScore = "";
				int nScore = pStudent->GetScore().GetScore();
				if( nScore > 0 )
					sScore.Format("%d",nScore);
				ListCtrl.SetItemText(i, 5, sScore);
				ListCtrl.SetItemText(i, 6, pStudent->GetTeacher());
				if( pTeacher )
				{
					ListCtrl.SetItemText(i, 7, pTeacher->GetTitle(CGlobal::GetInstance().m_TitleMap));
				}
						
				i++;
				m_nSum++;

				if( nScore >= 90 )
				{
					m_nScoreSum[0]++;
				}
				else if( nScore >= 80 )
				{
					m_nScoreSum[1]++;
				}
				else if( nScore >= 70 )
				{
					m_nScoreSum[2]++;
				}
				else if( nScore >= 60 )
				{
					m_nScoreSum[3]++;
				}
				else if( nScore > 0 )
				{
					m_nScoreSum[4]++;
				}
				else 
				{
					m_nScoreSum[5]++;
				}
			}
		}
	}

	Calculate();
}

void CScoreView::Calculate()
{
	m_nSum = 0;
	m_nScoreSum[0] = m_nScoreSum[1] = m_nScoreSum[2] = m_nScoreSum[3] = m_nScoreSum[4] = m_nScoreSum[5] = 0;
	
	CStudentList& studentList = CGlobal::GetInstance().m_studentList;
	for ( POSITION pos = studentList.GetHeadPosition(); pos != NULL; )
	{
		CStudent* pStudent = studentList.GetNext( pos );
		if( pStudent )
		{
			m_nSum++;

			int nScore = pStudent->GetScore().GetScore();
			if( nScore >= 90 )
			{
				m_nScoreSum[0]++;
			}
			else if( nScore >= 80 )
			{
				m_nScoreSum[1]++;
			}
			else if( nScore >= 70 )
			{
				m_nScoreSum[2]++;
			}
			else if( nScore >= 60 )
			{
				m_nScoreSum[3]++;
			}
			else if( nScore > 0 )
			{
				m_nScoreSum[4]++;
			}
			else 
			{
				m_nScoreSum[5]++;
			}
		}
	}
}
void CScoreView::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, 1);
	CStudent* pStudent = CGlobal::GetInstance().FindStudent(nID, strNumber);

	CString sScore;
	CString sTemp = GetListCtrl().GetItemText(plvItem->iItem, 8);
	sScore.Format("%d", pStudent->GetScore().GetScore());
	
	if( m_subitem == 5 && plvItem->pszText != NULL )
	{
		sScore = plvItem->pszText;
		if( sScore == "" )
			sScore = "0";
		else
		{
			int nScore = atoi(plvItem->pszText);
			if( nScore < 0 || nScore > 100 )
			{
				plvItem->pszText = NULL;
				CString strInfo;
				strInfo = "输入的成绩不正确!\r\n";
				AfxMessageBox(strInfo, MB_OK|MB_ICONINFORMATION);
				CListVwEx::OnEndLabelEdit(pNMHDR, pResult);
				return;
			}
			if( nScore == 0 )
				plvItem->pszText = NULL;
		}
	}
	if( m_subitem == 8 && plvItem->pszText != NULL )
	{
		sTemp = plvItem->pszText;
	}

	if( pStudent )
	{
		CScore score = pStudent->GetScore();
		score.SetScore(atoi(sScore));
		pStudent->SetScore(score);
		CScore::Update(score);

		Calculate();

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

	CListVwEx::OnEndLabelEdit(pNMHDR, pResult);
}



void CScoreView::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 CScoreView::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 CScoreView::OnPreparePrinting(CPrintInfo* pInfo) 
{
	// TODO: call DoPreparePrinting to invoke the Print dialog box
	return DoPreparePrinting(pInfo);

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

void CScoreView::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;
}

⌨️ 快捷键说明

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