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:  在此添加加载代码
 	 }
 }

这个函数主要与从外部文件读入和保存文件有关系,
ar.IsStoring()是True时,表示保存;ar.IsStoring()是False时,表示读入。

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:  在此处为本机数据添加绘制代码
}

这个函数与显示有关,文本显示主要用TextOut函数。操作起来很方便。

CArchive ar被修改之后就会直接调用OnDraw函数, 文件内容就会显示在 “视” 结构中。

这就是基于文档-视的结构。

单击选中

相当于当你有按下鼠标左键的操作时,会得到一个消息,你可以获知鼠标点击的位置。根据位置就知道选中的是哪条信息,选中,相当于修改前景背景色,代码略。

双击修改

双击时调用OnModify()函数,即可显示修改界面窗口。

滚轮

重载基类的OnSize、OnUpdate函数

其余添加、删除、排序等操作。

比如增加

键入信息即可

发布了21 篇原创文章 · 获赞 17 · 访问量 3712

猜你喜欢

转载自blog.csdn.net/qq_33892106/article/details/85331126