📄 studinfomanagerview.cpp
字号:
// StudInfoManagerView.cpp : implementation of the CStudInfoManagerView class
//
#include "stdafx.h"
#include "StudInfoManager.h"
#include "StudInfoManagerDoc.h"
#include "StudInfoManagerView.h"
#include "MainFrm.h"
#include "PropertyDlg.h"
#include "Taxis.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CStudInfoManagerView
IMPLEMENT_DYNCREATE(CStudInfoManagerView, CListView)
BEGIN_MESSAGE_MAP(CStudInfoManagerView, CListView)
//{{AFX_MSG_MAP(CStudInfoManagerView)
ON_COMMAND(IDM_DELITEM, OnDelitem)
ON_COMMAND(IDM_CLEARLIST, OnClearlist)
ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
ON_COMMAND(IDM_PROPERTY, OnProperty)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
ON_COMMAND(IDM_FILEOPEN, OnFileopen)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CListView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CListView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CListView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStudInfoManagerView construction/destruction
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
CStudInfoManagerView::CStudInfoManagerView()
{
// TODO: add construction code here
UINT i;
m_pList =&GetListCtrl();
for(i=0;i<10;i++)
pStudInfo[i].uiStudNum=0;
}
CStudInfoManagerView::~CStudInfoManagerView()
{
}
BOOL CStudInfoManagerView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CListView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CStudInfoManagerView drawing
void CStudInfoManagerView::OnDraw(CDC* pDC)
{
CStudInfoManagerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CStudInfoManagerView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
// TODO: You may populate your ListView with items by directly accessing
// its list control through a call to GetListCtrl().
m_pList->ModifyStyle(NULL, LVS_REPORT);
m_pList->SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_FLATSB | LVS_EX_INFOTIP
| LVS_EX_TWOCLICKACTIVATE);
m_pList->InsertColumn(0,"序号");
m_pList->InsertColumn(1,"姓名");
m_pList->InsertColumn(2,"学号");
m_pList->InsertColumn(3,"年龄");
m_pList->InsertColumn(4,"性别");
m_pList->InsertColumn(5,"课程1");
m_pList->InsertColumn(6,"成绩1");
m_pList->InsertColumn(7,"教师1");
m_pList->InsertColumn(8,"课程2");
m_pList->InsertColumn(9,"成绩2");
m_pList->InsertColumn(10,"教师2");
m_pList->SetColumnWidth(0,60); //序号
m_pList->SetColumnWidth(1,60); //姓名
m_pList->SetColumnWidth(2,80); //学号
m_pList->SetColumnWidth(3,40); //年龄
m_pList->SetColumnWidth(4,40); //性别
m_pList->SetColumnWidth(5,90); //课程1
m_pList->SetColumnWidth(6,50); //成绩1
m_pList->SetColumnWidth(7,60); //教师1
m_pList->SetColumnWidth(8,90); //课程2
m_pList->SetColumnWidth(9,50); //成绩2
m_pList->SetColumnWidth(10,60); //教师2
//显示学生信息
GetStudInfo("学生信息\\StudInfo.txt");
DispAllStudInfo();
m_pMainFrame=(CMainFrame*)::AfxGetApp()->m_pMainWnd;
}
/////////////////////////////////////////////////////////////////////////////
// CStudInfoManagerView printing
BOOL CStudInfoManagerView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CStudInfoManagerView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CStudInfoManagerView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CStudInfoManagerView diagnostics
#ifdef _DEBUG
void CStudInfoManagerView::AssertValid() const
{
CListView::AssertValid();
}
void CStudInfoManagerView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
CStudInfoManagerDoc* CStudInfoManagerView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CStudInfoManagerDoc)));
return (CStudInfoManagerDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CStudInfoManagerView message handlers
void CStudInfoManagerView::GetStudInfo(File *pFile)
{
CourseInfo* pCourseInfo;
CourseInfo* pNext;
FILE* fp;
UINT i;
UINT uiHashAddr; //哈希地址
char pName[10]; //姓名
UINT uiStudNum; //学号,规定为9位,如080210114
UINT uiAge; //年龄
char pSex[2]; //性别
char pCourse1[10]; //课程名
UINT uiMark1; //成绩
char pTeacher1[10];//教师
char pCourse2[10]; //课程名
UINT uiMark2; //成绩
char pTeacher2[10];//教师
fp=fopen(pFile,"r");
for(i=0;i<10;i++)
{
fscanf(fp,"%9d%11s%3d%2s%11s%4d%11s%11s%4d%6s",&uiStudNum,pName,&uiAge,pSex,pCourse1,&uiMark1,pTeacher1,pCourse2,&uiMark2,pTeacher2);
uiHashAddr=HashSelect(uiStudNum);
pCourseInfo=(CourseInfo*)malloc(sizeof(CourseInfo));
pNext=(CourseInfo*)malloc(sizeof(CourseInfo));
pCourseInfo->pNext=pNext;
strcpy(pStudInfo[uiHashAddr].pName,pName);
pStudInfo[uiHashAddr].uiStudNum=uiStudNum;
pStudInfo[uiHashAddr].uiAge=uiAge;
strcpy(pStudInfo[uiHashAddr].pSex,pSex);
strcpy(pCourseInfo->pCourse,pCourse1);
strcpy(pCourseInfo->pTeacher,pTeacher1);
pCourseInfo->uiMark=uiMark1;
strcpy(pNext->pCourse,pCourse2);
strcpy(pNext->pTeacher,pTeacher2);
pNext->uiMark=uiMark2;
pStudInfo[uiHashAddr].pCourseInfo=pCourseInfo;
}
fclose(fp);
}
void CStudInfoManagerView::InsertRecord(StudInfo studInfo)
{
UINT uiIndex=m_pList->GetItemCount();
CString str;
//显示序号
str.Format("%d",uiIndex);
m_pList->InsertItem(uiIndex,str,-1);
//显示姓名
m_pList->SetItemText(uiIndex,1,studInfo.pName);
//显示学号
if(studInfo.uiStudNum/100000000==0)
str.Format("0%d",studInfo.uiStudNum);
else
str.Format("%d",studInfo.uiStudNum);
m_pList->SetItemText(uiIndex,2,str);
//显示年龄
str.Format("%d",studInfo.uiAge);
m_pList->SetItemText(uiIndex,3,str);
//显示性别
m_pList->SetItemText(uiIndex,4,studInfo.pSex);
//显示课程1
m_pList->SetItemText(uiIndex,5,studInfo.pCourseInfo->pCourse);
//显示成绩1
str.Format("%d",studInfo.pCourseInfo->uiMark);
m_pList->SetItemText(uiIndex,6,str);
//显示教师1
m_pList->SetItemText(uiIndex,7,studInfo.pCourseInfo->pTeacher);
//显示课程2
m_pList->SetItemText(uiIndex,8,studInfo.pCourseInfo->pNext->pCourse);
//显示成绩2
str.Format("%d",studInfo.pCourseInfo->pNext->uiMark);
m_pList->SetItemText(uiIndex,9,str);
//显示教师2
m_pList->SetItemText(uiIndex,10,studInfo.pCourseInfo->pNext->pTeacher);
}
void CStudInfoManagerView::OnDelitem()
{
// TODO: Add your command handler code here
}
void CStudInfoManagerView::OnClearlist()
{
// TODO: Add your command handler code here
}
StudInfo* CStudInfoManagerView::GetStudInfo()
{
return this->pStudInfo;
}
void CStudInfoManagerView::OnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
POSITION pos = m_pList->GetFirstSelectedItemPosition();
do
{
if (NULL == pos)
break;
if (m_nCurSel == pos)
break;
m_nCurSel = pos;
OnSelectionChanged();
}
while (FALSE);
*pResult = 0;
}
void CStudInfoManagerView::OnSelectionChanged()
{
CString str;
CString strIndex,strName,strStudNum,strAge,strSex,strCourse1,strMark1,strTeacher1,strCourse2,strMark2,strTeacher2;
strIndex=m_pList->GetItemText((int)m_nCurSel-1,0);
strName=m_pList->GetItemText((int)m_nCurSel-1,1);
strStudNum=m_pList->GetItemText((int)m_nCurSel-1,2);
strAge=m_pList->GetItemText((int)m_nCurSel-1,3);
strSex=m_pList->GetItemText((int)m_nCurSel-1,4);
strCourse1=m_pList->GetItemText((int)m_nCurSel-1,5);
strMark1=m_pList->GetItemText((int)m_nCurSel-1,6);
strTeacher1=m_pList->GetItemText((int)m_nCurSel-1,7);
strCourse2=m_pList->GetItemText((int)m_nCurSel-1,8);
strMark2=m_pList->GetItemText((int)m_nCurSel-1,9);
strTeacher2=m_pList->GetItemText((int)m_nCurSel-1,10);
str=" -------------------------------该学生信息-------------------------------\r\n"
" 学号: "+strIndex+"\r\n"
" 姓名: "+strName+"\r\n"
" 学号: "+strStudNum+"\r\n"
" 年龄: "+strAge+"\r\n"
" 性别: "+strSex+"\r\n"
" 课程1: "+strCourse1+"\r\n"
" 成绩1: "+strMark1+"\r\n"
" 教师1: "+strTeacher1+"\r\n"
" 课程2: "+strCourse2+"\r\n"
" 成绩2: "+strMark2+"\r\n"
" 教师2: "+strTeacher2;
CMainFrame* m_pMainFrame=(CMainFrame*)::AfxGetApp()->m_pMainWnd;
m_pMainFrame->m_wndOutputBar.SetEditText(0,str);
this->UpdateData(false);
}
UINT CStudInfoManagerView::HashSelect(UINT uiStudNum)
{
UINT uiAddr=(uiStudNum-uiStudNum/1000*1000)%11;
if(!pStudInfo[uiAddr].uiStudNum)
return uiAddr;
else
{
while(pStudInfo[uiAddr].uiStudNum)
uiAddr=(uiAddr+1)%10;
return uiAddr;
}
}
void CStudInfoManagerView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
this->OnProperty();
*pResult = 0;
}
void CStudInfoManagerView::OnProperty()
{
// TODO: Add your command handler code here
UINT uiIndex;
uiIndex=m_pList->GetItemCount();
if(uiIndex==0)
return;
CString strNum,strName,strStudNum,strAge,strSex,strCourse1,strMark1,strTeacher1,strCourse2,strMark2,strTeacher2;
strNum=m_pList->GetItemText((int)m_nCurSel-1,0);
strName=m_pList->GetItemText((int)m_nCurSel-1,1);
strStudNum=m_pList->GetItemText((int)m_nCurSel-1,2);
strAge=m_pList->GetItemText((int)m_nCurSel-1,3);
strSex=m_pList->GetItemText((int)m_nCurSel-1,4);
strCourse1=m_pList->GetItemText((int)m_nCurSel-1,5);
strMark1=m_pList->GetItemText((int)m_nCurSel-1,6);
strTeacher1=m_pList->GetItemText((int)m_nCurSel-1,7);
strCourse2=m_pList->GetItemText((int)m_nCurSel-1,8);
strMark2=m_pList->GetItemText((int)m_nCurSel-1,9);
strTeacher2=m_pList->GetItemText((int)m_nCurSel-1,10);
CPropertyDlg dlg;
dlg.DispData(strNum,strName,strStudNum,strAge,strSex,strCourse1,strMark1,strTeacher1,strCourse2,strMark2,strTeacher2);
dlg.DoModal();
}
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
return 1;
}
void CStudInfoManagerView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
// m_pList->SortItems(ListCompare,(DWORD)pStudInfo);
switch(pNMListView->iSubItem)
{
case 2:
TaxisByStudNum();
break;
case 3:
TaxisByAge();
break;
case 6:
case 9:
TaxisByAllMark();
break;
default:
break;
}
*pResult = 0;
}
void CStudInfoManagerView::OnFileopen()
{
// TODO: Add your command handler code here
CString strStudInfoFile;
char* pStudInfoFile;
CFileDialog m_OpenDlg(TRUE,"asd","StudInfo.txt",0,"任何文件(*.*)|*.*||");
if(m_OpenDlg.DoModal()==IDOK)
{
strStudInfoFile=m_OpenDlg.GetPathName();
pStudInfoFile=(LPSTR)(LPCTSTR)strStudInfoFile;
}
else
{
m_pMainFrame->m_wndStatusBar.SetPaneText(0,"你取消了打开文件",TRUE);
return;
}
UINT i;
for(i=0;i<10;i++)
pStudInfo[i].uiStudNum=0;
GetStudInfo(pStudInfoFile);
m_pList->DeleteAllItems();
for(i=0;i<10;i++)
InsertRecord(pStudInfo[i]);
m_pMainFrame->m_wndStatusBar.SetPaneText(0,"加载学生信息成功",TRUE);
}
void CStudInfoManagerView::TaxisByAge()
{
//CTaxis taxis(pStudInfo,TAXISBYAGE);
UINT i,j;
StudInfo siTemp;
for(i=0;i<10;i++)
for(j=i;j<10;j++)
if(pStudInfo[i].uiAge>pStudInfo[j].uiAge)
{
siTemp=pStudInfo[i];
pStudInfo[i]=pStudInfo[j];
pStudInfo[j]=siTemp;
}
DispAllStudInfo();
}
void CStudInfoManagerView::TaxisByAllMark()
{
//CTaxis taxis(pStudInfo,TAXISBYALLMARK);
UINT i,j;
StudInfo siTemp;
for(i=0;i<10;i++)
for(j=i;j<10;j++)
if((pStudInfo[i].pCourseInfo->uiMark+pStudInfo[i].pCourseInfo->pNext->uiMark)<
(pStudInfo[j].pCourseInfo->uiMark+pStudInfo[j].pCourseInfo->pNext->uiMark))
{
siTemp=pStudInfo[i];
pStudInfo[i]=pStudInfo[j];
pStudInfo[j]=siTemp;
}
DispAllStudInfo();
}
void CStudInfoManagerView::TaxisByStudNum()
{
CTaxis taxis(pStudInfo,TAXISBYSTUDNUM);
DispAllStudInfo();
}
void CStudInfoManagerView::DispAllStudInfo()
{
UINT i;
m_pList->DeleteAllItems();
for(i=0;i<10;i++)
InsertRecord(pStudInfo[i]);
}
void CStudInfoManagerView::OnFileOpen()
{
// TODO: Add your command handler code here
this->OnFileopen();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -