MFC課程設計 --學生成績管理系統
MFC課程設計 ,C++課程設計 --學生成績管理系統
ps:因為課設完成的過程大家都不太一樣,以下的程式碼僅供學習一下在MFC下各個控制元件的用法,有問題歡迎留言討論。
- 實驗目的
- 使用MFC類庫編制應用程式:按鈕控制元件、靜態控制元件及編輯框的應用。
- 瞭解MFC類的層次結構及主要類的用法,掌握使用MFC和嚮導來編寫Windows應用程式。
- 熟悉Microsoft Visual Studio2013的開發環境。
- 掌握在Microsoft Visual Studio2013開發環境除錯程式的方法。
- 掌握靜態控制元件、按鈕、流動條、編輯框、列表框、組合框和對話方塊的建立、訊息傳送和控制元件控制等內容。
- 對前面所學知識的總結,通過一個比較完整的應用程式的設計,將學過的知識連貫起來,掌握開發一個實際應用程式的步驟,同時學會使用開發工具實現介面友好的應用程式。並通過本實驗,掌握如何運用面向物件技術對具體的應用系統進行分析和設計。
二、實驗內容
本次c++課設的學生成績管理系統是面向學生和教師的。該系統有三種身份賬號,其中學生賬號可以在裡面查詢自己的成績,而教師賬號可以新增,刪除和修改學生的成績,而管理員賬號可以新增,刪除和修改學生的成績外,還能可以新增,刪除和修改登入使用的賬號。
另外,用單文件設計的學生成績分析圖形繪製。並用該學生成績管理系統呼叫該畫圖的exe檔案,實現在該學生成績管理系統中顯示學生成績的直方圖和曲線圖。
登入介面:
學生成績管理介面:
(1)、設計一個學生類Student,包括資料成員:姓名、學號、五門課程(高等數學,離散數學,C++課設,大學英語,大學體育)的成績。
(2)、建立一個基於對話方塊的MFC應用程式,程式視窗的標題上有你姓名、學號和應用程式名稱。使用(1)的類,實現對學生資訊和成績的輸入和管理。
(3)、建立一個單文件的MFC應用程式,讀取(2)中儲存的檔案中的學生成績,分別用直方圖和折線方式顯示所有學生某課程的成績分佈圖。
(4)建立一個登入管理介面,學生可以用學生賬號登入檢視成績,教師可以使用教師賬號登入檢視並新增,刪除,修改學生的成績。而管理員賬號可以新增,刪除和修改學生和老師的登入賬號,老師和學生賬號只能修改自身的登入密碼。
(5)建立一個學生成績管理主介面,上面有list控制元件之間將儲存在檔案的學生資訊顯示在主介面上,另外還有查詢控制元件,組合控制元件進行排序,新增,刪除和修改控制元件。還有賬號管理,重新登入和退出控制元件。
(6)建立一個學生資訊查詢後顯示的學生詳細資訊介面,擁有教師賬號的使用者可以通過對這個介面資訊的修改,按下“修改儲存”的控制元件進行資訊的修改。
(7)點選組合框排序,按確定鍵後,會通過list和檔案的操作,進行對應的排序。可以進行的排序為:學號,高數成績,離散成績,c++課設成績,英語成績,體育成績。排序後的內容會直接顯示在學生成績管理的主介面list中。
(8)用單文件對學生成績儲存的檔案進行操作,並進行直方圖和折線圖的繪畫。在學生成績管理住介面點選統計分析,可以直接呼叫該單文件exe.
(8)建立一個重新登入介面,使用者可以通過重新登入的方法進行該學生成績管理系統使用者的更換。該介面需要輸入學號,舊密碼,新密碼,再次輸入新密碼才能修改該賬號的密碼。
(9)建立一個登入賬號管理介面,只有admin的管理員賬號才能進行賬號的新增,修改和刪除。
三實驗裝置
Win7作業系統
Microsoft Visual Studio2013
四、實驗要求
1. 使用MFC類庫編制應用程式:按鈕控制元件、靜態控制元件及編輯框的應用。
2. 瞭解MFC類的層次結構及主要類的用法,掌握使用MFC和嚮導來編寫Windows應用程式。
3掌握靜態控制元件、按鈕、流動條、編輯框、列表框、組合框和對話方塊的建立、訊息傳送和控制元件控制等內容。
4對前面所學知識的總結,通過一個比較完整的應用程式的設計,將學過的知識連貫起來,掌握開發一個實際應用程式的步驟,同時學會使用開發工具實現介面友好的應用程式。並通過本實驗,掌握如何運用面向物件技術對具體的應用系統進行分析和設計。
五、實驗程式
(1)登入介面
LoginDlg.cpp的主要關鍵程式碼
//在主介面呼叫之前在BOOL CMFC課設學生成績管理系統App::InitInstance()
中新增
CLoginDlg dl;
if (IDCANCEL == dl.DoModal())
return FALSE;
功能是實現先呼叫登入視窗。
void CLoginDlg::OnBnClickedOk() //點選登入的響應函式
{
if (CheckSuer()) //登入賬號和密碼的確定是否正確
CDialog::OnOK();
else
{
AfxMessageBox("使用者名稱或密碼錯誤"); //密碼錯誤則彈出視窗提示錯誤
SetDlgItemText(IDC_NAME, ""); //重置兩個編輯框
SetDlgItemText(IDC_PASS, "");
this->SetFocus();
}
}
bool CLoginDlg::CheckSuer() //賬戶和密碼確認
{
CString szName, szPass;
GetDlgItemText(IDC_NAME, szName);
GetDlgItemText(IDC_PASS, szPass);
szName.MakeLower();
if (szName == "admin"&&szPass == "123") //是否為管理員賬號
{
SUser u = { "admin", "123", 1 };
theApp.m_us = u; //將登入人員的資訊記錄在theApp中
return TRUE;
}
SUser u;
CFile file;
if (!file.Open("./user.dat", CFile::modeRead))
{
CreatUser();
if (!file.Open("./user.dat", CFile::modeRead))
return FALSE;
}
while (file.Read(&u, sizeof(u)))
{
if (szName == u.sName&&szPass == u.sPass)
{
theApp.m_us = u;
return TRUE;
}
}
return FALSE;
}
void CLoginDlg::CreatUser() //如果不存在賬號和密碼儲存的檔案,則新建一個儲存檔案
{
CFile file;
if (!file.Open("./user.dat", CFile::modeCreate | CFile::modeWrite))
{
AfxMessageBox("使用者檔案建立失敗");
return;
}
}
(2)學生成績管理主介面
BEGIN_MESSAGE_MAP(CMFC課設學生成績管理系統Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_ManagePower, &CMFC課設學生成績管理系統Dlg::OnBnClickedManagepower)
ON_BN_CLICKED(IDC_AGAIN_LOGIN, &CMFC課設學生成績管理系統Dlg::OnBnClickedAgainLogin)
ON_BN_CLICKED(IDC_STUDENT_ADD, &CMFC課設學生成績管理系統Dlg::OnBnClickedStudentAdd)
ON_BN_CLICKED(IDC_STUDENT_DEL, &CMFC課設學生成績管理系統Dlg::OnBnClickedStudentDel)
ON_BN_CLICKED(IDC_STUDENT_SEEK, &CMFC課設學生成績管理系統Dlg::OnBnClickedStudentSeek)
ON_BN_CLICKED(IDC_STUDENT_CHANGE, &CMFC課設學生成績管理系統Dlg::OnBnClickedStudentChange)
ON_BN_CLICKED(IDC_BUTTON8, &CMFC課設學生成績管理系統Dlg::OnBnClickedButton8)
ON_BN_CLICKED(IDC_STUDENT_IDCANCEL, &CMFC課設學生成績管理系統Dlg::OnBnClickedStudentIdcancel)
ON_BN_CLICKED(IDC_STUDENT_DIALOG_OKSORT, &CMFC課設學生成績管理系統Dlg::OnBnClickedStudentDialogOksort)
ON_BN_CLICKED(IDC_PICTURE_ANALYSIS, &CMFC課設學生成績管理系統Dlg::OnBnClickedPictureAnalysis)
END_MESSAGE_MAP()
// CMFC課設學生成績管理系統Dlg 訊息處理程式
BOOL CMFC課設學生成績管理系統Dlg::OnInitDialog() //初始化視窗
{
CDialogEx::OnInitDialog();
CString str = "1606100*** 卟咚君 學生成績管理系統 使用者:"; //在視窗左上角設定自己的姓名和學號(課設要求),以及本次顯示登入的賬號
str += theApp.m_us.sName;
SetWindowText(str);
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST); // 初始化(IDC_STUDENT_DIALOG)ListCtrl控制元件
pList->InsertColumn(0, "體育", 0, 80);
pList->InsertColumn(0, "英語", 0, 80);
pList->InsertColumn(0, " c++", 0, 80);
pList->InsertColumn(0, "離散", 0, 80);
pList->InsertColumn(0, "高數", 0, 80);
pList->InsertColumn(0, "姓名", 0, 100);
pList->InsertColumn(0, "學號", 0, 100);
SortStudent(0);
ReadStudent(pList);
CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_STUDENT_DIALOG_SORTLIST); //設定(IDC_STUDENT_DIALOG)CComboBox控制元件
pComb->AddString("學號");
pComb->AddString("高數");
pComb->AddString("離散");
pComb->AddString("c++");
pComb->AddString("英語");
pComb->AddString("體育");
pComb->SetCurSel(0);
CComboBox* pComb1 = (CComboBox*)GetDlgItem(IDC_STUDENT_DIALOG_SORTLIST); //獲得排列組合控制元件的資訊
int nSel = pComb1->GetCurSel();
GetDlgItem(IDC_STUDENT_ADD)->EnableWindow(theApp.m_us.nPrior); //對應相應的身份許可權設定是否遮蔽新增許可權
GetDlgItem(IDC_STUDENT_DEL)->EnableWindow(theApp.m_us.nPrior); //對應相應的身份許可權設定是否遮蔽刪除許可權
GetDlgItem(IDC_STUDENT_CHANGE)->EnableWindow(theApp.m_us.nPrior); //對應相應的身份許可權設定是否遮蔽修改許可權
//pComb->SetItemHeight(25,25);
//GetDlgItem(IDC_ManagePass)->EnableWindow(theApp.m_us.nPrior);
//GetDlgItem(IDC_ManagePower)->EnableWindow(theApp.m_us.nPrior);
// 將“關於...”選單項新增到系統選單中。
// IDM_ABOUTBOX 必須在系統命令範圍內。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 設定此對話方塊的圖示。 當應用程式主視窗不是對話方塊時,框架將自動
// 執行此操作
SetIcon(m_hIcon, TRUE); // 設定大圖示
SetIcon(m_hIcon, FALSE); // 設定小圖示
// TODO: 在此新增額外的初始化程式碼
return TRUE; // 除非將焦點設定到控制元件,否則返回 TRUE
}
void CMFC課設學生成績管理系統Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向對話方塊新增最小化按鈕,則需要下面的程式碼
// 來繪製該圖示。 對於使用文件/檢視模型的 MFC 應用程式,
// 這將由框架自動完成。
void CMFC課設學生成績管理系統Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用於繪製的裝置上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使圖示在工作區矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 繪製圖標
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
//當用戶拖動最小化視窗時系統呼叫此函式取得游標
//顯示。
HCURSOR CMFC課設學生成績管理系統Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMFC課設學生成績管理系統Dlg::OnBnClickedManagepower() //“賬號管理”控制元件響應函式,呼叫 CPower(管理許可權)類的視窗
{
CPower dl;
dl.DoModal();
}
void CMFC課設學生成績管理系統Dlg::OnBnClickedAgainLogin() //“重新登入”控制元件響應函式
{
CDialog::OnCancel(); //關閉當前的學生成績管理系統視窗
CLoginDlg dl; //呼叫登入視窗
if (IDOK == dl.DoModal()) //成功登入返回IDOK,在呼叫新的學生成績管理系統視窗
{ //登入退出則返回IDCANCEL
CMFC課設學生成績管理系統Dlg dlg;
dlg.DoModal();
}
}
void CMFC課設學生成績管理系統Dlg::OnBnClickedStudentAdd() //“新增”控制元件響應函式,呼叫IDD_StudentSpecificAddDlg新增視窗,新增學號和相應成績資訊
{
CStudentSpecificAddDlg dl;
if (IDCANCEL == dl.DoModal())
{
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST); //關閉IDD_StudentSpecificAddDlg新增視窗,讀取儲存學生成績的檔案重新整理學生成績管理系統視窗
CMFC課設學生成績管理系統Dlg::ReadStudent(pList);
OnBnClickedStudentDialogOksort();
}
}
void CMFC課設學生成績管理系統Dlg::ReadStudent(CListCtrl* pList) //讀取儲存學生成績的檔案,並載入在學生成績管理系統視窗的CListCtrl中
{
CFile file;
if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
{
GreatStudentfile();
return;
}
pList->DeleteAllItems();
Student u;
int i = 0;
while (file.Read(&u, sizeof(u)) == sizeof(u))
{
pList->InsertItem(i, u.sId);
pList->SetItemText(i, 1, u.sName);
pList->SetItemText(i, 2, u.sHigher_math);
pList->SetItemText(i, 3, u.sDiscrete_math);
pList->SetItemText(i, 4, u.sC_program);
pList->SetItemText(i, 5, u.sEnglish);
pList->SetItemText(i, 6, u.sSports);
i++;
}
file.Close();
}
void CMFC課設學生成績管理系統Dlg::GreatStudentfile() //建立使用者登入賬號儲存檔案
{
CFile file;
if (!file.Open("./studentfile.dat", CFile::modeCreate | CFile::modeWrite))
{
AfxMessageBox("使用者檔案建立失敗");
return;
}
file.Close();
}
void CMFC課設學生成績管理系統Dlg::OnBnClickedStudentDel() // “刪除”控制元件響應函式
{
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);
Student ur;
int nSel = pList->GetSelectedCount(); //獲取當前滑鼠選擇的學號數量
if (nSel < 1)
{
AfxMessageBox("請選擇一個賬戶再刪除!");
return;
}
int nSelText = pList->GetSelectionMark(); //獲取當前滑鼠選擇的一個學號位置
pList->GetItemText(nSelText, 0, ur.sId, sizeof(ur.sId));
pList->DeleteItem(nSelText); //刪除當前滑鼠選擇的學號位置
CFile file;
if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
{
AfxMessageBox("檔案無法開啟!");
return;
}
CFile temporaryfile;
if (!temporaryfile.Open("./temporarystudentfile.dat", CFile::modeCreate|CFile::modeWrite| CFile::shareDenyNone))
{
GreatTemporaryStudentfile();
return;
}
Student u;
while (file.Read(&u, sizeof(u)) == sizeof(u)) //讀取學生成績儲存檔案,將未刪除的學生資訊寫入臨時檔案temporaryfile中
{
if ((CString)u.sId == (CString)ur.sId)
continue;
temporaryfile.Write(&u, sizeof(u));
}
file.Close();
temporaryfile.Close();
if (!file.Open("./studentfile.dat", CFile::modeCreate|CFile::modeWrite | CFile::shareDenyNone))
{
AfxMessageBox("檔案無法開啟!");
return;
}
if (!temporaryfile.Open("./temporarystudentfile.dat", CFile::modeRead | CFile::shareDenyNone))
{
AfxMessageBox("檔案無法開啟!");
return;
}
while (temporaryfile.Read(&u, sizeof(u)) == sizeof(u)) //讀取學生成績儲存檔案,將臨時檔案temporarystudentfile.dat中學生資訊寫入真正儲存學生資訊的studentfile.dat中
file.Write(&u, sizeof(u));
CMFC課設學生成績管理系統Dlg::ReadStudent(pList); //更新學生成績管理系統介面的資訊
OnBnClickedStudentDialogOksort();
return;
}
void CMFC課設學生成績管理系統Dlg::OnBnClickedStudentSeek() //“查詢”控制元件對應的函式,查詢學生的學號
{
int nNum;
char str[20];
GetDlgItemText(IDC_STUDENT_DIALOG_ID, str, sizeof(str)); //獲取編輯框的學號資訊
if ((CString)str == "")
{
AfxMessageBox("請在學號框裡輸入學號!");
return;
}
nNum = Seek_Student(str); //查詢該學號是否存在
if (nNum == -1)
{
AfxMessageBox("該使用者不存在!");
}
Student u;
CFile file;
if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
{
AfxMessageBox("檔案無法開啟!");
return;
}
while (file.Read(&u, sizeof(u)) == sizeof(u)) //查詢該學號同學的詳細資訊
{
if ((CString)u.sId == (CString)str)
{
theApp.m_student = u;
file.Close();
CStudentSpecificSeekDlg dlg; //將該學號同學的詳細資訊顯示在詳細資訊視窗(IDD_STUDENT_SPECIFIC_DIALOG)
if (IDCANCEL == dlg.DoModal())
{
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST); //更新學生成績管理系統介面的資訊
CMFC課設學生成績管理系統Dlg::ReadStudent(pList);
}
return;
}
}
file.Close();
}
int CMFC課設學生成績管理系統Dlg::Seek_Student(char *str) //查詢該同學是否存在學生成績管理系統的CListCtrl中
{
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);
int nCount = pList->GetItemCount();
int i = 0;
while (i < nCount)
{
if (pList->GetItemText(i, 0) == (CString)str)
{
return i;
}
i++;
}
return -1;
}
void CMFC課設學生成績管理系統Dlg::OnBnClickedStudentChange() //"修改“控制元件響應的函式,修改學生的資訊
{
OnBnClickedStudentSeek(); //呼叫查詢函式,修改在查詢函式中實現
}
void CMFC課設學生成績管理系統Dlg::OnBnClickedButton8() //"退出”控制元件響應函式,退出學生成績管理系統
{
CDialog::OnCancel();
}
void CMFC課設學生成績管理系統Dlg::OnBnClickedStudentIdcancel()
{
CDialog::OnCancel();
}
void CMFC課設學生成績管理系統Dlg::GreatTemporaryStudentfile() //建立臨時儲存學生資訊的檔案
{
CFile file;
if (!file.Open("./temporarystudentfile.dat", CFile::modeCreate | CFile::modeWrite))
{
AfxMessageBox("使用者檔案建立失敗");
return;
}
file.Close();
}
void CMFC課設學生成績管理系統Dlg::OnBnClickedStudentDialogOksort() //排序"確定”控制元件響應函式,進行(學號,高數,離散,c++課設,英語,體育成績)的排序
{
CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_STUDENT_DIALOG_SORTLIST);
int nSel = pComb->GetCurSel();
SortStudent(nSel);
}
bool nsort_id(Student a, Student b) //學號(ID)大小比較函式
{
return _ttoi((CString)a.sId)<_ttoi((CString)b.sId); //將char轉換成CString,在轉化成int
}
bool sort_higher_math(Student a, Student b)
{
return _ttoi((CString)a.sHigher_math)>_ttoi((CString)b.sHigher_math); //高數(Higher_math)大小比較函式
}
bool sort_discrete_math(Student a, Student b)
{
return _ttoi((CString)a.sDiscrete_math) > _ttoi((CString)b.sDiscrete_math); //離散(Discrete_math)大小比較函式
}
bool sort_c_program(Student a, Student b)
{
return _ttoi((CString)a.sC_program) > _ttoi((CString)b.sC_program); //c++(C_program)大小比較函式
}
bool sort_english(Student a, Student b)
{
return _ttoi((CString)a.sEnglish) > _ttoi((CString)b.sEnglish); //英語(English)大小比較函式
}
bool sort_sports(Student a, Student b)
{
return _ttoi((CString)a.sSports)> _ttoi((CString)b.sSports); //英語(Sports)大小比較函式
}
void CMFC課設學生成績管理系統Dlg::SortStudent(int nNum) //對應排序對學生資訊進行排序
{
Student SomeStudent[1000];
CFile file;
if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
{
AfxMessageBox("檔案無法開啟,無法排序!");
return;
}
int i = 0;
while (file.Read(&SomeStudent[i], sizeof(SomeStudent[i])) == sizeof(SomeStudent[i]))
{
i++;
}
file.Close();
int b = (CString)SomeStudent[0].sId < (CString)SomeStudent[1].sId;
if (nNum == 0) //0是學號成績排序
std::sort(SomeStudent, SomeStudent+i, nsort_id); //排序是直接呼叫STL中的快排
if (nNum == 1) //1是高數成績排序
std::sort(SomeStudent, SomeStudent + i, sort_higher_math);
if (nNum == 2) //2是離散成績排序
std::sort(SomeStudent, SomeStudent + i, sort_discrete_math);
if (nNum == 3) //3是C++課設成績排序
std::sort(SomeStudent, SomeStudent + i, sort_c_program);
if (nNum == 4) //4是英語成績排序
std::sort(SomeStudent, SomeStudent + i, sort_english);
if (nNum == 5) //5是體育成績排序
std::sort(SomeStudent, SomeStudent + i, sort_sports);
if (!file.Open("./studentfile.dat", CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone))
{
AfxMessageBox("檔案無法開啟,無法排序!");
return;
}
int t = 0;
while (t<i) //將排好序的資訊寫入學生成績儲存檔案
{
file.Write(&SomeStudent[t], sizeof(SomeStudent[t]));
t++;
}
file.Close();
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);
CMFC課設學生成績管理系統Dlg::ReadStudent(pList); //將排好序的學生資訊更新到學生成績管理系統的CListCtrl中
}
void CMFC課設學生成績管理系統Dlg::OnBnClickedPictureAnalysis() //"統計分析“控制元件響應的函式
{
ShellExecute(NULL, "open", "E://打編碼//MFC//MFC課程設計-學生成績管理系統//MFC課設-學生成績管理系統//Debug//MFCApplication1.exe", NULL, NULL, SW_SHOWNORMAL);
//用ShellExecute呼叫可以畫直方圖和折線圖的exe檔案
}
(3)新增學生資訊的視窗
BEGIN_MESSAGE_MAP(CStudentSpecificAddDlg, CDialog)
ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_ADD_SAVE, &CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddSave)
ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_ADD_INCANCE, &CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddIncance)
END_MESSAGE_MAP()
// CStudentSpecificAddDlg 訊息處理程式
BOOL CStudentSpecificAddDlg::OnInitDialog()
{
CDialog::OnInitDialog();
return TRUE;
}
void CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddSave() //"新增儲存:控制元件響應函式
{
// TODO: 在此新增控制元件通知處理程式程式碼
Student u;
GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_ID, u.sId, sizeof(u.sId)); //將學號編輯框的內容寫入u.sId
GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_NAME, u.sName, sizeof(u.sName)); //將姓名編輯框的內容寫入u.sName
if (IDC_STUDENG_SPECIFIC_ADD_MALE == GetCheckedRadioButton(IDC_STUDENG_SPECIFIC_ADD_MALE, IDC_STUDENG_SPECIFIC_ADD_FEMALE))
u.nSex = true;
else
u.nSex = false;
//IDC_STUDENG_SPECIFIC_ADD_MALE為“男”控制元件ID,IDC_STUDENG_SPECIFIC_ADD_FEMALE為“女'控制元件的ID
//用GetCheckedRadioButton函式獲取RadioButton控制元件的資訊,GetCheckedRadioButton(IDC_STUDENG_SPECIFIC_ADD_MALE, IDC_STUDENG_SPECIFIC_ADD_FEMALE)返回
//IDC_STUDENG_SPECIFIC_ADD_MALE則為男,否則為女
GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_AGE, u.sAge, sizeof(u.sAge)); //將年齡編輯框的內容寫入u.sAge
GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_ADDRESS, u.sAddress, sizeof(u.sAddress)); //將地址編輯框的內容寫入u.sAddress
GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_HIGHERMATH, u.sHigher_math, sizeof(u.sHigher_math)); //將高數編輯框的內容寫入u.sHigher_math
GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_DISCRETEMATH, u.sDiscrete_math, sizeof(u.sDiscrete_math)); //將離散編輯框的內容寫入u.sDiscrete_math
GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_CPROGRAM, u.sC_program, sizeof(u.sC_program)); //將C++課設編輯框的內容寫入u.sC_program
GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_ENGLISH, u.sEnglish, sizeof(u.sEnglish)); //將英語編輯框的內容寫入u.sEnglish
GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_SPORTS, u.sSports, sizeof(u.sSports)); //將體育編輯框的內容寫入u.sSports
CFile file;
if (!file.Open("./studentfile.dat", CFile::modeReadWrite|CFile::shareDenyNone))
{
AfxMessageBox("新增失敗,檔案打不開!");
return ;
}
Student ur;
while (file.Read(&ur, sizeof(ur))) //讀取學生檔案資訊,看學號是否重複
{
if ((CString)ur.sId == (CString)u.sId)
{
AfxMessageBox("使用者已存在!");
return;
}
}
file.SeekToEnd(); //將指標移到檔案末尾
file.Write(&u, sizeof(u)); //在檔案末尾寫入新的學生資訊
AfxMessageBox("新增儲存成功!"); //提示儲存成功
}
void CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddIncance() //“退出”控制元件響應函式,退出新增視窗
{
CDialog::OnCancel();
// TODO: 在此新增控制元件通知處理程式程式碼
}
(4)查詢和刪除視窗
BEGIN_MESSAGE_MAP(CStudentSpecificSeekDlg, CDialog)
ON_BN_CLICKED(IDOK, &CStudentSpecificSeekDlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_CHANGE_SAVE, &CStudentSpecificSeekDlg::OnBnClickedStudengSpecificChangeSave)
ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_IDCACEL, &CStudentSpecificSeekDlg::OnBnClickedStudengSpecificIdcacel)
END_MESSAGE_MAP()
// CStudentSpecificSeekDlg 訊息處理程式
BOOL CStudentSpecificSeekDlg::OnInitDialog()
{
CDialog::OnInitDialog();
GetDlgItem(IDC_STUDENG_SPECIFIC_CHANGE_SAVE)->EnableWindow(theApp.m_us.nPrior); //獲取賬號的許可權資訊,是否遮蔽“刪除”控制元件
SetDlgItemText(IDC_STUDENG_SPECIFIC_ID,theApp.m_student.sId); //設定顯示的學生的學號
SetDlgItemText(IDC_STUDENG_SPECIFIC_NAME, theApp.m_student.sName); //設定顯示的學生的姓名
if (theApp.m_student.nSex==1)
CheckRadioButton(IDC_STUDENG_SPECIFIC_MALE, IDC_STUDENG_SPECIFIC_FEMALE, IDC_STUDENG_SPECIFIC_MALE);
else
CheckRadioButton(IDC_STUDENG_SPECIFIC_MALE, IDC_STUDENG_SPECIFIC_FEMALE, IDC_STUDENG_SPECIFIC_FEMALE);
//設定顯示的學生的性別
//用CheckRadioButton設定RadioButton的顯示
SetDlgItemText(IDC_STUDENG_SPECIFIC_AGE, theApp.m_student.sAge); //設定顯示的學生的年齡
SetDlgItemText(IDC_STUDENG_SPECIFIC_ADDRESS, theApp.m_student.sAddress); //設定顯示的學生的地址
SetDlgItemText(IDC_STUDENG_SPECIFIC_HIGHERMATH, theApp.m_student.sHigher_math);//設定顯示的學生的高數成績
SetDlgItemText(IDC_STUDENG_SPECIFIC_DISCRETEMATH, theApp.m_student.sDiscrete_math);//設定顯示的學生的離散成績
SetDlgItemText(IDC_STUDENG_SPECIFIC_CPROGRAM, theApp.m_student.sC_program);//設定顯示的學生的c++課設成績
SetDlgItemText(IDC_STUDENG_SPECIFIC_ENGLISH, theApp.m_student.sEnglish);//設定顯示的學生的英語成績
SetDlgItemText(IDC_STUDENG_SPECIFIC_SPORTS, theApp.m_student.sSports);//設定顯示的學生的體育成績
return TRUE;
}
void CStudentSpecificSeekDlg::OnBnClickedOk() //"退出“控制元件響應函式
{
// TODO: 在此新增控制元件通知處理程式程式碼
CDialog::OnOK();
}
void CStudentSpecificSeekDlg::OnBnClickedStudengSpecificChangeSave() //"修改”控制元件響應函式
{
// TODO: 在此新增控制元件通知處理程式程式碼
Student u;
GetDlgItemText(IDC_STUDENG_SPECIFIC_ID, u.sId, sizeof(u.sId)); //將新的資訊寫入u(Student)中
GetDlgItemText(IDC_STUDENG_SPECIFIC_NAME, u.sName, sizeof(u.sName));
if (IDC_STUDENG_SPECIFIC_MALE == GetCheckedRadioButton(IDC_STUDENG_SPECIFIC_MALE, IDC_STUDENG_SPECIFIC_FEMALE))
u.nSex = true;
else
u.nSex = false;
GetDlgItemText(IDC_STUDENG_SPECIFIC_AGE, u.sAge, sizeof(u.sAge));
GetDlgItemText(IDC_STUDENG_SPECIFIC_ADDRESS, u.sAddress, sizeof(u.sAddress));
GetDlgItemText(IDC_STUDENG_SPECIFIC_HIGHERMATH, u.sHigher_math, sizeof(u.sHigher_math));
GetDlgItemText(IDC_STUDENG_SPECIFIC_DISCRETEMATH, u.sDiscrete_math, sizeof(u.sDiscrete_math));
GetDlgItemText(IDC_STUDENG_SPECIFIC_CPROGRAM, u.sC_program, sizeof(u.sC_program));
GetDlgItemText(IDC_STUDENG_SPECIFIC_ENGLISH, u.sEnglish, sizeof(u.sEnglish));
GetDlgItemText(IDC_STUDENG_SPECIFIC_SPORTS, u.sSports, sizeof(u.sSports));
CFile file;
//file.Open("./studentfile.dat", CFile::modeWrite | CFile::shareDenyNone);
if ((CString)u.sId != (CString)theApp.m_student.sId)
{
AfxMessageBox("請輸入同一學號!");
SetDlgItemText(IDC_STUDENG_SPECIFIC_ID, theApp.m_student.sId);
return;
}
if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
{
AfxMessageBox("修改失敗,檔案打不開!");
return;
}
int i = 0;
Student ur;
while (file.Read(&ur, sizeof(ur))) //讀取學生成績儲存檔案,找到該學生資訊儲存的對應位置
{
if ((CString)theApp.m_student.sId == (CString)ur.sId)
{
break;
}
i++;
}
file.Close();
if (!file.Open("./studentfile.dat", CFile::modeWrite | CFile::shareDenyNone))
{
AfxMessageBox("修改失敗,檔案打不開!");
return;
}
file.SeekToBegin(); // 重新設定file檔案的寫指標時期剛好在要修改的學生資訊那裡
file.Seek(i*sizeof(u), CFile::current);
file.Write(&u, sizeof(u)); //用新的資訊對原來的資訊進行覆蓋,實現修改
AfxMessageBox("修改儲存成功!");
file.Close();
}
void CStudentSpecificSeekDlg::OnBnClickedStudengSpecificIdcacel() // "退出“控制元件響應函式
{
CDialog::OnCancel();
// TODO: 在此新增控制元件通知處理程式程式碼
}
(5)“賬號管理”視窗
BEGIN_MESSAGE_MAP(CPower, CDialog)
ON_BN_CLICKED(IDC_ManagePass, &CPower::OnBnClickedManagepass)
ON_BN_CLICKED(IDC_ChangePass, &CPower::OnBnClickedChangepass)
ON_BN_CLICKED(IDC_MANAGE_CHANGE_PASS, &CPower::OnBnClickedManageChangePass)
ON_BN_CLICKED(IDC_GENERAL_CHANGE_PASS, &CPower::OnBnClickedGeneralChangePass)
ON_BN_CLICKED(IDCANCEL, &CPower::OnBnClickedCancel)
END_MESSAGE_MAP()
// CPower 訊息處理程式
void CPower::OnBnClickedManagepass() //“學號密碼新增與刪除”控制元件響應函式,呼叫管理員視窗,進行學號密碼新增與刪除
{
// TODO: 在此新增控制元件通知處理程式程式碼
CManagePower dl;
dl.DoModal();
}
void CPower::OnBnClickedChangepass()
{
// TODO: 在此新增控制元件通知處理程式程式碼
}
void CPower::OnBnClickedManageChangePass() //“學號密碼新增與刪除”控制元件響應函式,呼叫管理員(CManagePower)視窗,進行學號密碼的修改
{
CManagePower dl;
dl.DoModal();
// TODO: 在此新增控制元件通知處理程式程式碼
}
void CPower::OnBnClickedGeneralChangePass() //“學號密碼修改”控制元件響應函式,呼叫密碼修改(CChangePass)視窗,學生和教師許可權的賬號可通過這個進行學號密碼的修改
{
CChangePass dl;
dl.DoModal();
// TODO: 在此新增控制元件通知處理程式程式碼
}
BOOL CPower::OnInitDialog() //賬號管理視窗的初始化,根據使用者的許可權是否遮蔽“學號密碼新增與刪除”控制元件
{
CDialog::OnInitDialog();
GetDlgItem(IDC_MANAGE_CHANGE_PASS)->EnableWindow((CString)theApp.m_us.sName=="admin");
return TRUE;
}
void CPower::OnBnClickedCancel() //“退出”控制元件響應函式,退出賬號管理視窗
{
// TODO: 在此新增控制元件通知處理程式程式碼
CDialog::OnCancel();
}
(6)學號密碼修改視窗
BEGIN_MESSAGE_MAP(CChangePass, CDialog)
ON_BN_CLICKED(IDC_OKCHANGE_PASS, &CChangePass::OnBnClickedOkchangePass)
END_MESSAGE_MAP()
// CChangePass 訊息處理程式
BOOL CChangePass::Check_ChangePass() //修改“確定”控制元件響應函式
{
CString szName, szOrdedPass, szNewPassOne, szNewPasstwo; //獲取要修改的學號和密碼
GetDlgItemText(IDC_CHANGEPASS_NAME, szName);
GetDlgItemText(IDC_CHANGEPASS_ORDEDPASS, szOrdedPass);
GetDlgItemText(IDC_CHANGEPASS_NEWPASS_ONE, szNewPassOne);
GetDlgItemText(IDC_CHANGEPASS_NEWPASS_TWO, szNewPasstwo);
szName.MakeLower();
SUser u;
CFile file;
if (!file.Open("./user.dat", CFile::modeReadWrite))
{
return FALSE;
}
int i = 0;
while (file.Read(&u, sizeof(u))) //兩次輸入新密碼的確認
{
if (szName == (CString)u.sName&&szOrdedPass == (CString)u.sPass)
{
if (szNewPassOne != szNewPasstwo)
{
AfxMessageBox("新密碼兩次輸入不正確!");
InitCCangePassDialog();
}
strcpy_s(u.sPass, szNewPassOne);
file.SeekToBegin();
file.Seek(i*sizeof(u), CFile::current);
file.Write(&u, sizeof(u));
AfxMessageBox("修改成功!");
InitCCangePassDialog();
return TRUE;
}
i++;
}
AfxMessageBox("該使用者或舊密碼不正確!");
InitCCangePassDialog();
return FALSE;
}
void CChangePass::OnBnClickedOkchangePass() //修改“確定”控制元件響應函式
{
Check_ChangePass();
// TODO: 在此新增控制元件通知處理程式程式碼
}
void CChangePass::InitCCangePassDialog() //重置學號密碼修改視窗的編輯框
{
SetDlgItemText(IDC_CHANGEPASS_NAME, "");
SetDlgItemText(IDC_CHANGEPASS_ORDEDPASS, "");
SetDlgItemText(IDC_CHANGEPASS_NEWPASS_ONE, "");
SetDlgItemText(IDC_CHANGEPASS_NEWPASS_TWO, "");
this->SetFocus();
}
(6)學號密碼新增與刪除視窗
BEGIN_MESSAGE_MAP(CManagePower, CDialog)
ON_CBN_SELCHANGE(IDC_MANAGEPOWER_POWER, &CManagePower::OnCbnSelchangeManagepowerPower)
ON_EN_CHANGE(IDC_MANAGEPOWER_PASS, &CManagePower::OnEnChangeManagepowerPass)
ON_BN_CLICKED(IDC_ADD, &CManagePower::OnBnClickedAdd)
ON_BN_CLICKED(IDCANCEL, &CManagePower::OnBnClickedCancel)
ON_BN_CLICKED(IDC_DEL, &CManagePower::OnBnClickedDel)
ON_BN_CLICKED(IDC_CHANGE, &CManagePower::OnBnClickedChange)
ON_EN_CHANGE(IDC_MANAGEPOWER_NAME, &CManagePower::OnEnChangeManagepowerName)
END_MESSAGE_MAP()
// CManagePower 訊息處理程式
BOOL CManagePower::OnInitDialog() //學號密碼新增與刪除視窗的初始化
{
CDialog::OnInitDialog();
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);
pList->InsertColumn(0, "身份", 0, 100); //學號密碼新增與刪除視窗中CListCtrl(IDC_MANAGEPOWER_LIST)初始化
pList->InsertColumn(0, "密碼", 0, 100);
pList->InsertColumn(0, "學號", 0, 100);
ReadUser(pList);
CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_MANAGEPOWER_POWER);
pComb->AddString("學生"); ////學號密碼新增與刪除視窗中CComboBox(IDC_MANAGEPOWER_POWER)初始化
pComb->AddString("老師");
pComb->SetCurSel(0);
return TRUE;
}
void CManagePower::OnCbnSelchangeManagepowerPower()
{
// TODO: 在此新增控制元件通知處理程式程式碼
}
void CManagePower::OnEnChangeManagepowerPass()
{
// TODO: 如果該控制元件是 RICHEDIT 控制元件,它將不
// 傳送此通知,除非重寫 CDialog::OnInitDialog()
// 函式並呼叫 CRichEditCtrl().SetEventMask(),
// 同時將 ENM_CHANGE 標誌“或”運算到掩碼中。
// TODO: 在此新增控制元件通知處理程式程式碼
}
void CManagePower::OnBnClickedAdd() //"新增“控制元件響應函式,新增新的使用者賬號
{
// TODO: 在此新增控制元件通知處理程式程式碼
SUser u;
GetDlgItemText(IDC_MANAGEPOWER_NAME, u.sName, sizeof(u.sName)); //獲取賬號編輯框的資訊
strlwr(u.sName); //u.sName大寫轉小寫
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST); //獲取密碼編輯框的資訊
int i = 0;
int nCount = pList->GetItemCount(); //獲取許可權的資訊
while (i < nCount)
{
if (pList->GetItemText(i, 0) == u.sName) //檢驗是否存在該使用者
{
AfxMessageBox("使用者已存在");
return;
}
i++;
}
pList->InsertItem(nCount, u.sName); //將新使用者的資訊新增入列表
GetDlgItemText(IDC_MANAGEPOWER_PASS, u.sPass, sizeof(u.sPass));
pList->SetItemText(nCount, 1, u.sPass);
CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_MANAGEPOWER_POWER);
int nSel = pComb->GetCurSel();
if (nSel)
pList->SetItemText(nCount, 2, "老師");
else
pList->SetItemText(nCount, 2, "學生");
}
void CManagePower::OnBnClickedCancel() //”退出“控制元件響應函式
{
// TODO: 在此新增控制元件通知處理程式程式碼
OnDestroy(); //退出前進行儲存
CDialog::OnCancel();
}
void CManagePower::OnDestroy() //關閉學號密碼新增與刪除視窗,關閉之前先將列表的資訊儲存在賬戶資訊檔案中
{
CDialog::OnDestroy();
CFile file;
if (!file.Open("./user.dat", CFile::modeCreate | CFile::modeWrite))
{
AfxMessageBox("儲存檔案時失敗!");
return;
}
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);
int i = 0;
int nCount = pList->GetItemCount();
SUser u;
while (i < nCount)
{
pList->GetItemText(i, 0, u.sName, sizeof(u.sName));
pList->GetItemText(i, 1, u.sPass, sizeof(u.sPass));
u.nPrior = pList->GetItemText(i, 2) == "老師";
file.Write(&u, sizeof(u));
i++;
}
file.Close();
AfxMessageBox("儲存檔案成功!");
}
void CManagePower::ReadUser(CListCtrl* pList) //讀取學生成績儲存檔案,將其顯示在學號密碼新增與刪除視窗CListCtrl中
{
CFile file;
if (!file.Open("./user.dat", CFile::modeRead | CFile::shareDenyNone))
return;
pList->DeleteAllItems();
SUser u;
int i = 0;
while (file.Read(&u, sizeof(u)) == sizeof(u))
{
pList->InsertItem(i, u.sName);
pList->SetItemText(i, 1, u.sPass);
pList->SetItemText(i, 2, u.nPrior ? "老師" : "學生");
i++;
}
file.Close();
}
void CManagePower::OnBnClickedDel() //”刪除“控制元件響應函式
{
// TODO: 在此新增控制元件通知處理程式程式碼
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);
SUser u;
GetDlgItemText(IDC_MANAGEPOWER_NAME, u.sName, sizeof(u.sName));
strlwr(u.sName);
int nSel = pList->GetSelectedCount(); //選擇一個賬戶
if (nSel < 1&&u.sName=="")
{
AfxMessageBox("請選擇一個賬戶再刪除!");
return;
}
if (nSel < 1 && (CString)u.sName != "")
{
int i = 0;
int nCount = pList->GetItemCount();
SUser ur;
while (i < nCount)
{
pList->GetItemText(i, 0, ur.sName, sizeof(ur.sName));
pList->GetItemText(i, 1, ur.sPass, sizeof(ur.sPass));
ur.nPrior = pList->GetItemText(i, 2) == "老師";
if ((CString)u.sName == (CString)ur.sName)
{
pList->DeleteItem(i);
return;
}
i++;
}
AfxMessageBox("該賬戶不存在!");
return;
}
else
{
if (nSel >= 1 && (CString)u.sName == "")
{
int nSelText = pList->GetSelectionMark();
pList->DeleteItem(nSelText);
}
else
{
int nSelText = pList->GetSelectionMark();
SUser ur;
pList->GetItemText(nSelText, 0, ur.sName, sizeof(ur.sName));
if ((CString)ur.sName == (CString)u.sName)
pList->DeleteItem(nSelText);
else
{
AfxMessageBox("請選擇同一個賬戶再刪除!");
return;
}
}
}
}
void CManagePower::OnBnClickedChange() //"修改“控制元件響應函式
{
// TODO: 在此新增控制元件通知處理程式程式碼
CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);//獲取需要更改資訊
SUser u;
GetDlgItemText(IDC_MANAGEPOWER_NAME, u.sName, sizeof(u.sName));
GetDlgItemText(IDC_MANAGEPOWER_PASS, u.sPass, sizeof(u.sPass));
strlwr(u.sName);
CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_MANAGEPOWER_POWER);
u.nPrior = pComb->GetCurSel();
int nSel = pList->GetSelectedCount();
if (nSel < 1 && u.sName == "")
{
AfxMessageBox("請選擇一個賬戶再!");
return;
}
if (nSel < 1 && (CString)u.sName != "") //進行賬戶密碼資訊更改
{
int i = 0;
int nCount = pList->GetItemCount();
SUser ur;
while (i < nCount)
{
pList->GetItemText(i, 0, ur.sName, sizeof(ur.sName));
pList->GetItemText(i, 1, ur.sPass, sizeof(ur.sPass));
ur.nPrior = pList->GetItemText(i, 2) == "老師";
if ((CString)u.sName == (CString)ur.sName)
{
pList->DeleteItem(i);
pList->InsertItem(i, u.sName);
pList->SetItemText(i, 1, u.sPass);
pList->SetItemText(i, 2, u.nPrior ? "老師" : "學生");
return;
}
i++;
}
AfxMessageBox("該賬戶不存在!");
return;
}
else
{
if (nSel >= 1 && (CString)u.sName == "")
{
int nSelText = pList->GetSelectionMark();
SUser ur;
pList->GetItemText(nSelText, 0, ur.sName, sizeof(ur.sName));
pList->DeleteItem(nSelText);
pList->InsertItem(nSelText, ur.sName);
pList->SetItemText(nSelText, 1, u.sPass);
pList->SetItemText(nSelText, 2, u.nPrior ? "老師" : "學生");
}
else
{
int nSelText = pList->GetSelectionMark();
SUser ur;
pList->GetItemText(nSelText, 0, ur.sName, sizeof(u.sName));
if ((CString)ur.sName == (CString)u.sName)
{
pList->DeleteItem(nSelText);
pList->InsertItem(nSelText, ur.sName);
pList->SetItemText(nSelText, 1, u.sPass);
pList->SetItemText(nSelText, 2, u.nPrior ? "老師" : "學生");
}
else
{
AfxMessageBox("請選擇同一個賬戶再刪除!");
return;
}
}
}
}
(7)用單文件讀取學生成績檔案,進行直方圖和折線圖的繪畫
void CMFCApplication1View::OnDraw(CDC* pDC)
{
CMFCApplication1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
}
// CMFCApplication1View 列印
BOOL CMFCApplication1View::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默認準備
return DoPreparePrinting(pInfo);
}
void CMFCApplication1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 新增額外的列印前進行的初始化過程
}
void CMFCApplication1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 新增列印後進行的清理過程
}
// CMFCApplication1View 診斷
#ifdef _DEBUG
void CMFCApplication1View::AssertValid() const
{
CView::AssertValid();
}
void CMFCApplication1View::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMFCApplication1Doc* CMFCApplication1View::GetDocument() const // 非除錯版本是內聯的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplication1Doc)));
return (CMFCApplication1Doc*)m_pDocument;
}
#endif //_DEBUG
// CMFCApplication1View 訊息處理程式
void CMFCApplication1View::DrawScore(CDC* pDC, int * fScore, int nNum) //畫直方圖函式
{
// fScore是成績陣列指標,nNum是學生人數
int nScoreNum[] = { 0, 0, 0, 0, 0 }; // 各成績段的人數的初 始值
// 下面是用來統計各分數段的人數
for (int i = 0; i < nNum; i++)
{
int nSeg = (int)(fScore[i]) / 10; // 取數的"十"位上的值
if (nSeg < 6) nSeg = 5; // <60分
if (nSeg == 10) nSeg = 9;// 當為100分,算為>90分數段
nScoreNum[nSeg - 5] ++; // 各分數段計數
}
int nSegNum = sizeof(nScoreNum) / sizeof(int); // 計算有多少個分數段
// 求分數段上最大的人數
int nNumMax = nScoreNum[0];
for (int i = 1; i < nSegNum; i++)
{
if (nNumMax < nScoreNum[i])
nNumMax = nScoreNum[i];
}
CRect rc;
GetClientRect(rc);
rc.DeflateRect(180, 40); // 縮小矩形大小
int nSegWidth = rc.Width() / nSegNum; // 計算每段的寬度
int nSegHeight = rc.Height() / nNumMax; // 計算每段的單位高度
COLORREF crSeg = RGB(0, 0, 192); // 定義一個顏色變數
CBrush brush1(HS_FDIAGONAL, crSeg);
CBrush brush2(HS_BDIAGONAL, crSeg);
CPen pen(PS_INSIDEFRAME, 2, crSeg);
CBrush* oldBrush = pDC->SelectObject(&brush1); // 將brush1選入裝置環境
CPen* oldPen = pDC->SelectObject(&pen); // 將pen選 入裝置環境
CRect rcSeg(rc);
rcSeg.right = rcSeg.left + nSegWidth; // 使每段的矩形寬度等於nSegWidth
CString strSeg[] = { (CString)"<60", (CString)"60-70", (CString)"70-80", (CString)"80-90", (CString)">=90" };
CRect rcStr;
for (int i = 0; i<nSegNum; i++)
{ // 保證相鄰的矩形填充樣式不相同
if (i % 2)
pDC->SelectObject(&brush2);
else
pDC->SelectObject(&brush1);
rcSeg.top = rcSeg.bottom - nScoreNum[i] * nSegHeight - 2; // 計算每段矩形的高度
pDC->Rectangle(rcSeg);
if (nScoreNum[i] > 0)
{
CString str;
str.Format((CString)"%d人", nScoreNum[i]);
pDC->DrawText(str, rcSeg, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
rcStr = rcSeg;
rcStr.top = rcStr.bottom + 2;
rcStr.bottom += 20;
pDC->DrawText(strSeg[i], rcStr, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
rcSeg.OffsetRect(nSegWidth, 0); // 右移矩形
}
pDC->SelectObject(oldBrush); // 恢復原來的畫刷屬性
pDC->SelectObject(oldPen); // 恢復原來的畫筆屬性
CDC* pControlDC = pDC;
pControlDC->SelectStockObject(BLACK_BRUSH);//設定畫刷
CString str;
pControlDC->MoveTo(180, 40); //畫y軸
pControlDC->LineTo(180,380);
pControlDC->MoveTo(180, 380);//畫x軸
pControlDC->LineTo(900, 380);
}
int CMFCApplication1View::OnCreate(LPCREATESTRUCT lpCreateStruct)// 建立各個成績顯示控制元件
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
m_button1.Create((CString)"高等數學(直方)",//按鈕標題
WS_CHILD | WS_VISIBLE | WS_BORDER,//按鈕風格
CRect(10, 10, 120, 40), //按鈕大小
this, //按鈕父指標
IDC_HIGGER_MATH); //該按鈕對應的ID號
m_button1.ShowWindow(SW_SHOWNORMAL);
m_button2.Create((CString)"離散數學(直方)",//按鈕標題
WS_CHILD | WS_VISIBLE | WS_BORDER,//按鈕風格
CRect(10, 60,120, 90), //按鈕大小
this, //按鈕父指標
IDC_DISCRETE_MATH); //該按鈕對應的ID號
m_button2.ShowWindow(SW_SHOWNORMAL);
m_button3.Create((CString)"c+課設(直方)",//按鈕標題
WS_CHILD | WS_VISIBLE | WS_BORDER,//按鈕風格
CRect(10, 110, 120, 140), //按鈕大小
this, //按鈕父指標
IDC_C_PROGRAM); //該按鈕對應的ID號
m_button3.ShowWindow(SW_SHOWNORMAL);
m_button4.Create((CString)"大學英語(直方)",//按鈕標題
WS_CHILD | WS_VISIBLE | WS_BORDER,//按鈕風格
CRect(10, 160, 120, 190), //按鈕大小
this, //按鈕父指標
IDC_ENGLISH); //該按鈕對應的ID號
m_button4.ShowWindow(SW_SHOWNORMAL);
m_button5.Create((CString)"大學體育(直方)",//按鈕標題
WS_CHILD | WS_VISIBLE | WS_BORDER,//按鈕風格
CRect(10, 210, 120, 240), //按鈕大小
this, //按鈕父指標
IDC_SPORTS); //該按鈕對應的ID號
m_button5.ShowWindow(SW_SHOWNORMAL);
// TODO: 在此新增您專用的建立程式碼
m_button6.Create((CString)"(折線)",//按鈕標題
WS_CHILD | WS_VISIBLE | WS_BORDER,//按鈕風格
CRect(120, 10, 170, 40), //按鈕大小
this, //按鈕父指標
IDC_HIGGER_MATH_LINE); //該按鈕對應的ID號
m_button6.ShowWindow(SW_SHOWNORMAL);
m_button7.Create((CString)"(折線)",//按鈕標題
WS_CHILD | WS_VISIBLE | WS_BORDER,//按鈕風格
CRect(120, 60, 170, 90), //按鈕大小
this, //按鈕父指標
IDC_DISCRETE_MATH_LINE); //該按鈕對應的ID號
m_button7.ShowWindow(SW_SHOWNORMAL);
m_button8.Create((CString)"(折線)",//按鈕標題
WS_CHILD | WS_VISIBLE | WS_BORDER,//按鈕風格
CRect(120, 110, 170, 140), //按鈕大小
this, //按鈕父指標
IDC_C_PROGRAM_LINE); //該按鈕對應的ID號
m_button8.ShowWindow(SW_SHOWNORMAL);
m_button9.Create((CString)"(折線)",//按鈕標題
WS_CHILD | WS_VISIBLE | WS_BORDER,//按鈕風格
CRect(120,160 , 170, 190), //按鈕大小
this, //按鈕父指標
IDC_ENGLISH_LINE); //該按鈕對應的ID號
m_button9.ShowWindow(SW_SHOWNORMAL);
m_button10.Create((CString)"(折線)",//按鈕標題
WS_CHILD | WS_VISIBLE | WS_BORDER,//按鈕風格
CRect(120, 210, 170, 240), //按鈕大小
this, //按鈕父指標
IDC_SPORTS_LINE); //該按鈕對應的ID號
m_button10.ShowWindow(SW_SHOWNORMAL);
return 0;
}
void CMFCApplication1View::OnClickButton_higher_math_show() //高數成績直方圖控制元件按鈕對應函式
{
CFile file;
if (!file.Open("e://打編碼//MFC//MFC課程設計-學生成績管理系統//MFC課設-學生成績管理系統//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
{
AfxMessageBox("檔案無法開啟,無法畫圖!");
return;
}
Student u;
int i = 0;
while (file.Read(&u, sizeof(u)) == sizeof(u))
{
m_Num[i] = _ttoi((CString)u.sHigher_math);
i++;
}
InvalidateRect(NULL);
UpdateWindow();
DrawScore(GetDC(), m_Num, i);
file.Close();
}
void CMFCApplication1View::OnClickButton_discrete_math_show() //離散成績直方圖控制元件按鈕對應函式
{
CFile file;
if (!file.Open("e://打編碼//MFC//MFC課程設計-學生成績管理系統//MFC課設-學生成績管理系統//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
{
AfxMessageBox("檔案無法開啟,無法畫圖!");
return;
}
Student u;
int i = 0;
while (file.Read(&u, sizeof(u)) == sizeof(u))
{
m_Num[i] = _ttoi((CString)u.sDiscrete_math);
i++;
}
InvalidateRect(NULL);
UpdateWindow();
DrawScore(GetDC(), m_Num, i);
file.Close();
}
void CMFCApplication1View::OnClickButton_c_program_show() //C++成績直方圖控制元件按鈕對應函式
{
CFile file;
if (!file.Open("e://打編碼//MFC//MFC課程設計-學生成績管理系統//MFC課設-學生成績管理系統//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
{
AfxMessageBox("檔案無法開啟,無法畫圖!");
return;
}
Student u;
int i = 0;
while (file.Read(&u, sizeof(u)) == sizeof(u))
{
m_Num[i] = _ttoi((CString)u.sC_program);
i++;
}
InvalidateRect(NULL);
UpdateWindow();
DrawScore(GetDC(), m_Num, i);
file.Close();
}
void CMFCApplication1View::OnClickButton_english_show() //英語成績直方圖控制元件按鈕對應函式
{
CFile file;
if (!file.Open("e://打編碼//MFC//MFC課程設計-學生成績管理系統//MFC課設-學生成績管理系統//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
{
AfxMessageBox("檔案無法開啟,無法畫圖!");
return;
}
Student u;
int i = 0;
while (file.Read(&u, sizeof(u)) == sizeof(u))
{
m_Num[i] = _ttoi((CString)u.sEnglish);
i++;
}
InvalidateRect(NULL);
UpdateWindow();
DrawScore(GetDC(), m_Num, i);
file.Close();
}
void CMFCApplication1View::OnClickButton_sports_show()//體育成績直方圖控制元件按鈕對應函式
{
CFile file;
if (!file.Open("e://打編碼//MFC//MFC課程設計-學生成績管理系統//MFC課設-學生成績管理系統//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
{
AfxMessageBox("檔案無法開啟,無法畫圖!");
return;
}
Student u;
int i = 0;
while (file.Read(&u, sizeof(u)) == sizeof(u))
{
m_Num[i] = _ttoi((CString)u.sSports);
i++;
}
InvalidateRect(NULL);
UpdateWindow();
DrawScore(GetDC(), m_Num, i);
file.Close();
}
void CMFCApplication1View::Drawlist(CDC* pDC, int* fScore, int nNum)//畫折線圖
{
// fScore是成績陣列指標,nNum是學生人數
int nScoreNum[] = { 0, 0, 0, 0, 0 }; // 各成績段的人數的初 始值
// 下面是用來統計各分數段的人數
for (int i = 0; i < nNum; i++)
{
int nSeg = (int)(fScore[i]) / 10; // 取數的"十"位上的值
if (nSeg < 6) nSeg = 5; // <60分
if (nSeg == 10) nSeg = 9;// 當為100分,算為>90分數段
nScoreNum[nSeg - 5] ++; // 各分數段計數
}
CDC* pControlDC = pDC;
pControlDC->SelectStockObject(BLACK_BRUSH);//設定畫刷
CString str;
CString strSeg[] = { (CString)"<60", (CString)"60-70", (CString)"70-80", (CString)"80-90", (CString)">=90" };
pControlDC->MoveTo(180, 40);//畫線的開始位置
pControlDC->LineTo(180, 380);
pControlDC->MoveTo(180, 380);//畫線的開始位置
pControlDC->LineTo(900, 380);
pControlDC->MoveTo(180, 380);
for (int i = 0; i < 5; i++)
{
pControlDC->SetPixel(0, 290, RGB(0,