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