您的位置:首页 > 其它

MFC编写个简单学生管理信息程序

2017-01-17 10:20 661 查看
这个应用参考了许多博客然后自己汇总在编写而成功能大体完善的应用。



大体框架如图

附上核心代码

// Student_sys_YYYDlg.h : 头文件
//

#pragma once
#include "afxwin.h"
#include "afxcmn.h"

// CStudent_sys_YYYDlg 对话框
class CStudent_sys_YYYDlg : public CDialogEx
{
// 构造
public:
CStudent_sys_YYYDlg(CWnd* pParent = NULL);	// 标准构造函数

// 对话框数据
enum { IDD = IDD_STUDENT_SYS_YYY_DIALOG };

protected:
virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持

// 实现
protected:
HICON m_hIcon;

// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnEnChangeEdit1();
afx_msg void OnBnClickedChange();
CButton m_add;
int age;
CButton m_change;
CButton m_del;
CListCtrl m_list;
CString m_name;
CButton m_save;
int m_sex;
afx_msg void OnBnClickedRadio1();
afx_msg void OnBnClickedRadio2();
afx_msg void OnBnClickedAdd();
afx_msg void OnBnClickedButton5();
afx_msg void OnBnClickedOk();
afx_msg void OnLvnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult);
CString m_num;
CString m_scoreC;
CString m_scoreM;
afx_msg void OnBnClickedDel();
afx_msg void OnBnClickedSave();

int ExportToTXT(CString& strFilePath);   //定义转化为txt文件的函数
CButton m_load;
afx_msg void OnBnClickedLoad();
afx_msg void OnEnChangeAge();
afx_msg void OnEnChangeName();
afx_msg void OnEnChangeNum();
afx_msg void OnBnClickedShow();
CButton m_show;
afx_msg void OnColumnclickList(NMHDR *pNMHDR, LRESULT *pResult);
};

//////////////////定义学生类
class student
{
public:
CString namee;
CString agee;
CString sexx;
CString cc;
CString mathh;
CString numm;
};
class Management
{
public:
CString addd[100];
CString dell[100];
CString sort[100];

};


// Student_sys_YYYDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "Student_sys_YYY.h"
#include "Student_sys_YYYDlg.h"
#include "afxdialogex.h"
#include
#include
using namespace std;

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CStudent_sys_YYYDlg 对话框

CStudent_sys_YYYDlg::CStudent_sys_YYYDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CStudent_sys_YYYDlg::IDD, pParent)
, age(0)
, m_name(_T(""))
, m_sex(0)
, m_num(_T(""))
, m_scoreC(_T(""))
, m_scoreM(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CStudent_sys_YYYDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_ADD, m_add);
DDX_Text(pDX, IDC_AGE, age);
DDX_Control(pDX, IDC_CHANGE, m_change);
DDX_Control(pDX, IDC_DEL, m_del);
DDX_Control(pDX, IDC_LIST, m_list);
DDX_Text(pDX, IDC_NAME, m_name);
DDX_Control(pDX, IDC_SAVE, m_save);
DDX_Text(pDX, IDC_NUM, m_num);
DDX_Text(pDX, IDC_SCORE_C, m_scoreC);
DDX_Text(pDX, IDC_SCORE_M, m_scoreM);
DDX_Control(pDX, IDC_LOAD, m_load);
DDX_Control(pDX, IDC_Show, m_show);

}

BEGIN_MESSAGE_MAP(CStudent_sys_YYYDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//	ON_EN_CHANGE(IDC_EDIT1, &CStudent_sys_YYYDlg::OnEnChangeEdit1)
ON_BN_CLICKED(IDC_CHANGE, &CStudent_sys_YYYDlg::OnBnClickedChange)
ON_BN_CLICKED(IDC_RADIO1, &CStudent_sys_YYYDlg::OnBnClickedRadio1)
ON_BN_CLICKED(IDC_RADIO2, &CStudent_sys_YYYDlg::OnBnClickedRadio2)
ON_BN_CLICKED(IDC_ADD, &CStudent_sys_YYYDlg::OnBnClickedAdd)
//	ON_BN_CLICKED(IDC_BUTTON5, &CStudent_sys_YYYDlg::OnBnClickedButton5)
ON_BN_CLICKED(IDOK, &CStudent_sys_YYYDlg::OnBnClickedOk)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST, &CStudent_sys_YYYDlg::OnLvnItemchangedList)
ON_BN_CLICKED(IDC_DEL, &CStudent_sys_YYYDlg::OnBnClickedDel)
ON_BN_CLICKED(IDC_SAVE, &CStudent_sys_YYYDlg::OnBnClickedSave)
ON_BN_CLICKED(IDC_LOAD, &CStudent_sys_YYYDlg::OnBnClickedLoad)
ON_EN_CHANGE(IDC_AGE, &CStudent_sys_YYYDlg::OnEnChangeAge)
ON_EN_CHANGE(IDC_NAME, &CStudent_sys_YYYDlg::OnEnChangeName)
ON_EN_CHANGE(IDC_NUM, &CStudent_sys_YYYDlg::OnEnChangeNum)
ON_BN_CLICKED(IDC_Show, &CStudent_sys_YYYDlg::OnBnClickedShow)

ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST, &CStudent_sys_YYYDlg::OnColumnclickList)
END_MESSAGE_MAP()

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE);			// 设置大图标
SetIcon(m_hIcon, FALSE);		// 设置小图标

// TODO: 在此添加额外的初始化代码                                       //给列表框标题附上文字
m_list.SetExtendedStyle(m_list.GetExtendedStyle()|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //列表视图控件添加全行选中和栅格风格
m_list.InsertColumn(0,_T("姓名"),LVCFMT_CENTER,40,0);
m_list.InsertColumn(1,_T("年龄"),LVCFMT_CENTER,40,1);
m_list.InsertColumn(2,_T("性别"),LVCFMT_CENTER,40,2);
m_list.InsertColumn(3,_T("C++"),LVCFMT_CENTER,40,3);
m_list.InsertColumn(4,_T("数学"),LVCFMT_CENTER,40,4);
m_list.InsertColumn(5,_T("学号"),LVCFMT_CENTER,100,5);
return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CStudent_sys_YYYDlg::OnBnClickedChange()               // 修改按钮的功能
{
// TODO: 在此添加控件通知处理程序代码
CListCtrl *plist=(CListCtrl *)GetDlgItem(IDC_LIST);//获取list控件IDC_LIST的指针
//这里获取鼠标选取的位置
//若没有任何选择,这两行函数得出的nSel为-1,反之,nSel为现在选的行数
POSITION pos=plist->GetFirstSelectedItemPosition();
int nSel=plist->GetNextSelectedItem(pos);
if(nSel<0)
{
MessageBox(_T("请选中要修改的项!"),MB_OK);
}
else
{
//,_T("修改确认"),MB_OKCANCEL);//后面的参数是添加确定按钮
if(AfxMessageBox(_T("确认修改?"),MB_YESNO)==IDYES)
{
CString str;
//把现在的值替换被选择那行的第0项,以此类推
GetDlgItemText(IDC_NAME,str);
plist->SetItemText(nSel,0,str);
GetDlgItemText(IDC_AGE,str);
plist->SetItemText(nSel,1,str);
if(m_sex==0)
{
GetDlgItemText(IDC_RADIO1,str);
plist->SetItemText(nSel,2,str);
}
else if(m_sex==1)
{
GetDlgItemText(IDC_RADIO2,str);
plist->SetItemText(nSel,2,str);
}
GetDlgItemText(IDC_SCORE_C,str);
plist->SetItemText(nSel,3,str);
GetDlgItemText(IDC_SCORE_M,str);
plist->SetItemText(nSel,4,str);
GetDlgItemText(IDC_NUM,str);
plist->SetItemText(nSel,5,str);

}

}

}

void CStudent_sys_YYYDlg::OnBnClickedRadio1()     //男
{
// TODO: 在此添加控件通知处理程序代码
m_sex=0;
}

void CStudent_sys_YYYDlg::OnBnClickedRadio2()     //女
{
// TODO: 在此添加控件通知处理程序代码
m_sex=1;
}

void CStudent_sys_YYYDlg::OnBnClickedAdd()                   //录入数据  (核心)
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
int i=0;
CString sex;
if(m_sex==0)
sex="男";
else if(m_sex==1)
sex="女";

//类型转化是道槛
// CString a,b,c,d;
CString a;
a.Format(_T("%d"),age);
//c.Format(_T("%f"),m_scoreC);
//d.Format(_T("%f"),m_scoreM);
m_list.InsertItem(i,m_name);
m_list.SetItemText(i,1,a);
m_list.SetItemText(i,2,sex);
m_list.SetItemText(i,3,m_scoreC);
m_list.SetItemText(i,4,m_scoreM);
m_list.SetItemText(i,5,m_num);

MessageBox(_T("添加成功!"));

UpdateData(false);

i++;
}

void CStudent_sys_YYYDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
}

void CStudent_sys_YYYDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CDialogEx::OnOK();
}

void CStudent_sys_YYYDlg::OnLvnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);

*pResult = 0;
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
}

void CStudent_sys_YYYDlg::OnBnClickedDel()      //删除按钮的功能
{
// TODO: 在此添加控件通知处理程序代码
POSITION pos=m_list.GetFirstSelectedItemPosition();//得出
if (pos==NULL)
{
return;
}
else
{
while(pos)
{
int nItem = m_list.GetNextSelectedItem(pos);
m_list.DeleteItem(nItem);
}
}

}

int CStudent_sys_YYYDlg::ExportToTXT(CString & strFilePath)
{
USES_CONVERSION;

CFile mytxtFile;
CString strCaption,strMsg;

if(!mytxtFile.Open(strFilePath,CFile::modeCreate|CFile::modeReadWrite))
{
MessageBox(_T("无法打开"));
return 0;
}

//计算列的宽度
int width[6]={0};
int i=0,j=0,nLen=0;
int nCount=m_list.GetItemCount();

//构造格式化字符串
char format[512]={0};
char buf[1024]={0};

CString str0,str1,str2,str3,str4,str5;

str0.LoadString(IDC_NAME);//名字
width[0]=strlen(T2A(str0));

str1.LoadString(IDC_AGE);//年龄
width[1]=strlen(T2A(str1));

if(m_sex==0)   //性别
{
str2.LoadString(IDC_RADIO1);
width[2]=strlen(T2A(str2));
}
else if(m_sex==1)
{
str2.LoadString(IDC_RADIO2);
width[2]=strlen(T2A(str2));
}

str3.LoadString(IDC_SCORE_C);//c++分数
width[3]=strlen(T2A(str3));

str4.LoadString(IDC_SCORE_M);//数学
width[4]=strlen(T2A(str4));

str5.LoadString(IDC_NUM); //学号
width[5]=strlen(T2A(str5));

for(i=0;i<6;i++)
{
for(j=0;jwidth[i])
width[i]=nLen;
}
//多点间隔
//width[i]+=10;

}

//format
sprintf_s(format,"%%-%ds %%-%ds %%-%ds %%-%ds %%-%ds %%-%ds \r\n"
,width[0],width[1],width[2],width[3],width[4],width[5]);

//打印列名
//sprintf_s(buf,format,T2A(str0),T2A(str1),T2A(str2),T2A(str3)
// ,T2A(str4),T2A(str5));
mytxtFile.Write(buf,strlen(buf));

for(i=0;iDoModal()==IDOK)//假如点击对话框的确定按钮
{
strPath=pFile->GetPathName();//得到打开文件的路径
}
else
{
return;
}

//得到文件路径strPath之后,按路径将文件读入字符串数组变量strFile
CStdioFile file;
CString strLine,temp;
CStringArray strFile;
int count=m_list.GetItemCount();
int i=0;//列表行号
setlocale(LC_CTYPE,("chs"));  //重要函数,能够将文本中文数据返回而不生成乱码

//CString str0,str1,str2,str3,str4,str5;
student stu; //定义学生变量,输入信息
if(!file.Open(strPath,CFile::modeRead))
{
temp.Format(_T("缺少文件%s!"),strPath);
AfxMessageBox(temp);
return ;
}

while( file.ReadString(strLine))
{
AfxExtractSubString(stu.namee,strLine,0,'-');
AfxExtractSubString(stu.agee,strLine,1,'-');
AfxExtractSubString(stu.sexx,strLine,2,'-');
AfxExtractSubString(stu.cc,strLine,3,'-');
AfxExtractSubString(stu.mathh,strLine,4,'-');
AfxExtractSubString(stu.numm,strLine,5,'-');

m_list.InsertItem(count,stu.namee);
m_list.SetItemText(count,1,stu.agee);
m_list.SetItemText(count,2,stu.sexx);
m_list.SetItemText(count,3,stu.cc);
m_list.SetItemText(count,4,stu.mathh);
m_list.SetItemText(count,5,stu.numm);

}

file.Close();

}

void CStudent_sys_YYYDlg::OnBnClickedShow()          //展示
{
// TODO: 在此添加控件通知处理程序代码
const wchar_t *str1=L"open";
const wchar_t *str2=L"E:\\成绩分布图\\Debug\\成绩分布图.exe";
ShellExecute(NULL,str1,str2,NULL,NULL,SW_SHOWNORMAL);

}

///////////////////////////////实现ListCrtl点击列头排序
int sort_column; //记录点击的列
bool method;  //记录比较方法

//比较函数  (回调函数)
static int CALLBACK MyCompareProc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
{
//从参数中提取所需比较lc的两行数据
int row1=(int)lParam1;
int row2=(int)lParam2;
CListCtrl *lc=(CListCtrl*)lParamSort;
CString lp1=lc->GetItemText(lParam1,sort_column);
CString lp2=lc->GetItemText(lParam2,sort_column);
//比较,对不同的列,不同比较,注意记录前一次排序方向,下一次要相反排序
if(sort_column<2)
{
//int型比较
int a=_wtoi(lp1.GetBuffer());
int b=_wtoi(lp2.GetBuffer());
//int a=_atoi(lp1);
//int b=_atoi(lp2);
if(method)
return a-b;
else
return b-a;
}
else
{
//文字型比较
if(method)
return lp1.CompareNoCase(lp2);
else
return lp2.CompareNoCase(lp1);
}
return 0;

}

void CStudent_sys_YYYDlg::OnColumnclickList(NMHDR *pNMHDR, LRESULT *pResult)  //点击ListCrtl控件头的消息响应
{
LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR);

// TODO: 在此添加控件通知处理程序代码
sort_column=pNMLV->iSubItem; //点击的列
int count=m_list.GetItemCount();

for(int i=0;i


映射变量的图



由于我程序是对话框+单文档的。(点击成绩分布图可以弹出单文档,即显示成绩的直方图和折线图)

怎么可以弄成这效果。只需简单的3行代码,即成绩分布图按钮中的函数

void CStudent_sys_YYYDlg::OnBnClickedShow()          //展示

{
// TODO: 在此添加控件通知处理程序代码
const wchar_t *str1=L"open";
const wchar_t *str2=L"E:\\成绩分布图\\Debug\\成绩分布图.exe";//自己写路径,注意要用\\双斜线
ShellExecute(NULL,str1,str2,NULL,NULL,SW_SHOWNORMAL);

}

附上单文档的代码:

//头文件

 
///////////////////自定义类
class
student
{
public:
    CString name[100];
    CString age[100];
    CString sex[100];
    CString num[100];
    CString C[100];
    CString M[100];
 
 
};

//=============================================声明根据成绩绘制直方图的函数
#include

static int c_num[4]={0,0,0,0};//分为4个阶段
static int number=0;//学生人数
void C成绩分布图View::OnDraw(CDC* pDC)
{
C成绩分布图Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;

// TODO: 在此处为本机数据添加绘制代码
CFileDialog *pFile;
CString strPath;
//得到文件路径
pFile = new CFileDialog(TRUE,_T("txt"),NULL,OFN_FILEMUSTEXIST |OFN_HIDEREADONLY
,_T("文件类型(*.txt)|*.txt|所有文件(*.*)|*.*|"));
if(pFile->DoModal()==IDOK)
{
strPath=pFile->GetPathName();
}
else
return;
CStringArray strFile;
CStdioFile file;
file.Open(strPath,CFile::modeRead);
CString strLine;
setlocale(LC_CTYPE,("chs"));  //重要函数,能够将文本中文数据返回而不生成乱码
student stu;//定义一个学生变量

int CC,MM;
CString str0,str1,str2,str3,str4,str5;
while (file.ReadString(strLine))
{
//读取并处理txt文件中的数据
number++;
AfxExtractSubString(str0,strLine,0,'-');
AfxExtractSubString(str1,strLine,1,'-');
AfxExtractSubString(str2,strLine,2,'-');
AfxExtractSubString(str3,strLine,3,'-');
AfxExtractSubString(str4,strLine,4,'-');
AfxExtractSubString(str5,strLine,5,'-');

CC=_ttoi(str3);
MM=_ttoi(str4);

//用于统计各阶段的人数
if(CC>90)
c_num[3]++;
if(CC<=90&&CC>80)
c_num[2]++;
if(CC<=80&&CC>70)
c_num[1]++;
if(CC<=70)
c_num[0]++;
}

pDC->MoveTo(420,193);
pDC->LineTo(420,13);
pDC->LineTo(425,18);
pDC->MoveTo(420,13);
pDC->LineTo(415,18);
pDC->TextOut(430,13,_T("人数"));

pDC->MoveTo(400,173);
pDC->LineTo(640,173);
pDC->LineTo(635,168);
pDC->MoveTo(640,173);
pDC->LineTo(635,178);
pDC->TextOut(650,173,_T("成绩/分"));

int i=160/number;
//画直方图
pDC->Rectangle(430,173-i*c_num[0],480,173);
pDC->Rectangle(480,173-i*c_num[1],530,173);
pDC->Rectangle(530,173-i*c_num[2],580,173);
pDC->Rectangle(580,173-i*c_num[3],630,173);

//折线图
CPen pen;
pen.CreatePen(PS_SOLID,3,RGB(255,0,0));
CPen* oldpen=pDC->SelectObject(&pen);

pDC->MoveTo(450,173-i*c_num[0]);
pDC->LineTo(505,173-i*c_num[1]);
pDC->LineTo(560,173-i*c_num[2]);
pDC->LineTo(615,173-i*c_num[3]);

CPen pen1;
pen1.CreatePen(PS_SOLID,0,RGB(0,0,200));
CPen* newpen=pDC->SelectObject(&pen1);

CString aaa,bbb,ccc,ddd;
int aa,bb,cc,dd;
aa=c_num[0];
bb=c_num[1];
cc=c_num[2];
dd=c_num[3];
aaa.Format(_T("%d"),aa);
bbb.Format(_T("%d"),bb);
ccc.Format(_T("%d"),cc);
ddd.Format(_T("%d"),dd);
pDC->TextOut(450,173-i*c_num[0]-20,aaa);
pDC->TextOut(505,173-i*c_num[1]-20,bbb);
pDC->TextOut(560,173-i*c_num[2]-20,ccc);
pDC->TextOut(615,173-i*c_num[3]-20,ddd);

pDC->TextOut(430,183,_T("<70"));
pDC->TextOut(485,183,_T("70~80"));
pDC->TextOut(540,183,_T("80~90"));
pDC->TextOut(595,183,_T(">90"));

pDC->TextOut(450,210,_T("成绩分布直方图&折线图"));

file.Close();

}


-----------------------------------------------------------------------------------------------------
附上一些参考资料: http://blog.csdn.net/lovton/article/details/6527208      (MFC
ListControl用法)
http://blog.csdn.net/abidepan/article/details/8266028     (MFC学习之 将 list 表里的信息写入.txt文本 和 .xls EXCEL 文件中)
http://blog.csdn.net/jilong17/article/details/6943755    (MFC之MessageBox用法)
http://blog.csdn.net/yongh701/article/details/42404619  (【mfc】学生信息管理,实现List控件节点的增删改查)
http://blog.csdn.net/zwgdft/article/details/7565331   (MFC总结之CListCtrl用法及技巧(二))
http://blog.csdn.net/zwgdft/article/details/7560592    (MFC总结之CListCtrl用法及技巧(一))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mfc csdn
相关文章推荐