MFC学生信息管理系统
MFC 学生信息管理系统
一、实现功能
- 1)新建、保存(导出)、导入学生信息文档;
- 2)增加、修改、删除、排序学生信息。
二、数据结构
Stu_ 结构体
struct Stu_{
CString Stu_Id; //学号
CString Stu_Name; //姓名
CString Stu_Sex; //性别
CString Stu_BirthDate; //出生年月
CString Stu_HomeTown; //籍贯
CString Stu_Address; //住址
Stu_() :Stu_Id(""), Stu_Name(""), Stu_Sex(""), Stu_BirthDate(""), Stu_HomeTown(""), Stu_Address(""){}
Stu_(const Stu_& a){
Stu_Id = a.Stu_Id; Stu_Name = a.Stu_Name; Stu_Sex = a.Stu_Sex;
Stu_BirthDate = a.Stu_BirthDate; Stu_HomeTown = a.Stu_HomeTown; Stu_Address = a.Stu_Address;
}
};
其实这里也可以单独建一个类 class Student,声明成其他类的友元类,便于访问内部数据成员
class CStuDoc : public CDocument
public:
CArray<Stu_> Stu_Info; //存储学生信息的线性表
我在CStuDoc类中放了一个 Stu_类型的存储学生信息的线性表,之后再CView类中还会访问,为了方便就设成了public。
这个线性表,一方面要显示,一方面键控修改,一方面写入/读出。CDoc、CView都要访问。其实这个设为全局变量也未尝不可。
class CStuView : public CScrollView
public:
int calculate_row(int y, int std);//calculate current row
int m_Point; //mouse clik location
bool m_Click; //if mouse click
int m_Index; //mouse point to which row
int nLineHeight; //width of character字宽
public:
afx_msg void OnAddition(); //增加学生信息
afx_msg void OnLButtonDown(UINT nFlags, CPoint point); //鼠标点击
afx_msg void OnModify(); //修改学生信息
afx_msg void On32782(); //删除学生信息
afx_msg void On32784(); //按id排序
afx_msg void On32785(); //按name排序
afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); //双击
afx_msg…是点些东西可以自动生成的,里面涉及到消息的传递。
三、一些功能函数
void CStuDoc::Serialize(CArchive& ar)
void CStuDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << Stu_Info.GetSize();
for (int i = 0; i < Stu_Info.GetSize(); i++){
ar << Stu_Info[i].Stu_Id << Stu_Info[i].Stu_Name << Stu_Info[i].Stu_Sex << Stu_Info[i].Stu_BirthDate << Stu_Info[i].Stu_HomeTown << Stu_Info[i].Stu_Address;
}// TODO: 在此添加存储代码
SetModifiedFlag(false); //标记为已修改
}
else
{
int num = 0,loc = 0;
ar >> num; //number of row
while (num > 0){
Stu_ a;
ar >> a.Stu_Id >> a.Stu_Name >> a.Stu_Sex >> a.Stu_BirthDate >> a.Stu_HomeTown >> a.Stu_Address;
Stu_Info.InsertAt(loc, a);
loc++;
num--;
}
// TODO: 在此添加加载代码
}
void CStuView::OnDraw(CDC* pDC)
void CStuView::OnDraw(CDC* pDC)
{
CStuDoc* pDoc = GetDocument(); //get document
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CPoint loc(0,0); //set pDC location
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
nLineHeight = (int)((tm.tmHeight + tm.tmExternalLeading)); //行高为1倍字的高度
CString info;
info.Format(_T("%-40s%-40s%-40s%-40s%-40s%-40s"), _T("学号"), _T("姓名"), _T("性别"), _T("出生日期"), _T("籍贯"), _T("住址"));
pDC->TextOut(loc.x, loc.y, info);
loc.y += nLineHeight;
for (int i = 0; i < pDoc->Stu_Info.GetSize(); i++){
if ((m_Click == true && i == m_Index) || (m_Click == false && i == pDoc->Stu_Info.GetSize() - 1)){
COLORREF old_text_color = pDC->SetTextColor(RGB(255, 255, 255)); //被鼠标点击的,把字符颜色设置成“白”色。
COLORREF old_bk_color = pDC->SetBkColor(RGB(0, 0, 0)); //把字符背景颜色设置成“黑”色。
}
else{
COLORREF old_text_color = pDC->SetTextColor(RGB(0, 0, 0)); //把字符颜色设置成“黑”色。
COLORREF old_bk_color = pDC->SetBkColor(RGB(255, 255, 255)); //把字符背景颜色设置成“白”色。
}
info.Format(_T("%-40s%-40s%-40s%-40s%-40s%-40s"), pDoc->Stu_Info[i].Stu_Id, pDoc->Stu_Info[i].Stu_Name, pDoc->Stu_Info[i].Stu_Sex,
pDoc->Stu_Info[i].Stu_BirthDate, pDoc->Stu_Info[i].Stu_HomeTown, pDoc->Stu_Info[i].Stu_Address);
pDC->TextOut(loc.x, loc.y, info);
loc.y += nLineHeight;
}
m_Click = false;
// TODO: 在此处为本机数据添加绘制代码
}