仓库地址
GitHub - mierhaosi3/StudentManageSystem
MFC--学生管理系统_m0_53252742的博客-CSDN博客
Bilibili代码分析视频:bilibili传送门
这个是之前做的,这次进行更新,整个项目会在元旦左右上传到github,到时会附上链接
如果想提前要用来应付作业,欢迎私信。
下面对更新内容进行介绍
1.更新了登陆系统
2. 进入程序是弹出文件所含条数
3.创建了下面的状态栏,一个是坐标随着鼠标实时改变,一个是得到系统当前时间
更新了,点击列表头可进行排序
4.在菜单栏中加入了绘制图,链接是详细讲解
MFC--对话框的一个画图控件-HighSpeedChart_m0_53252742的博客-CSDN博客
(1)折线图
(2)柱状图
(3).混合式图
光标变为十字,更方便查信息
具体实现,等明天起床再说!
=============================12.6更新===================
代码实现
1.登陆窗口:
- 这段代码实现了输入用户名和密码的操作
-
if (IsDlgButtonChecked(IDC_CHECK1) == BST_CHECKED) //如果被选中 { //MessageBox(_T("ok")); UpdateData(true); CEdit* pEdit = (CEdit*)(this)->GetDlgItem(IDC_EDIT2_password); pEdit->SetPasswordChar(0); SetDlgItemText(IDC_EDIT2_password, password_value); UpdateData(false); } else { UpdateData(true); CEdit* pEdit = (CEdit*)(this)->GetDlgItem(IDC_EDIT2_password); pEdit->SetPasswordChar('*'); SetDlgItemText(IDC_EDIT2_password, password_value); UpdateData(false); } GetDlgItem(IDC_EDIT2_password)->SetFocus();
2.这里用来设置密码窗口是否可见,当然也可以直接选中编辑窗口的的密码选项
void login::OnBnClickedButtonOk()
{
// TODO: 在此添加控件通知处理程序代码
static int k = 3;
CString name;
CString password; // 创造两个字符串变量来接受用户输入的信息(用户名和密码等)
GetDlgItemText(IDC_EDIT1, name); // 返回用户名
GetDlgItemText(IDC_EDIT2, password); // 返回密码
UpdateData(true);
if (password_value.IsEmpty())
{
MessageBox(L"用户名不能为空");
}
if (password_value.IsEmpty())
MessageBox(L"密码不能为空");
if (username_value == " " && password_value == " ")
{
// 进入主对话框界面
m_SuccessLogin = true;
CDialogEx::OnOK(); // 关闭登陆界面
}
else
{
// 弹出窗口提示用户名或密码不正确
MessageBox(_T("用户名或密码不正确!"), _T("提示"), MB_OK);
// 清空用户名和密码,便于重新输入
username_value = "";
password_value = "";
UpdateData(FALSE); // 更新编辑框控件的显示值
}
}
3.依然要加一个回车响应,如果点击回车就会自动判断密码用户名是否正确
BOOL login::PreTranslateMessage(MSG* pMsg) //屏蔽回车响应
{
// TODO: 在此添加专用代码和/或调用基类
if (pMsg->message == WM_KEYDOWN)
{
switch (pMsg->wParam)
{
case VK_RETURN: // 屏蔽回车
OnBnClickedButtonOk();
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
4.要在XXXXXXX.cpp中添加
login dlg_login; //建立登陆对话框对象
dlg_login.DoModal(); //弹出登陆对话框
if(dlg_login.m_SuccessLogin) //这个判断是为了保证加入的函数能正常运行
{
xxxxxxxxxxxxxxxxxxxxxxxxxxxxx.......
m_pMainWnd = &dlg;
.....................................
.................................
}
2.出现条数统计:
实现这个功能要在
XXXXXDlg::OnInitDialog()中先打开文件,更新到列表框之后
int index = list1.GetItemCount(); //开局显示文件中一共含有多少条数据
tot.Format(_T("%d"), index); //float转cstring
MessageBox((tot), L"文件记录");
就可以了。
3.更新表头排序
一个是需要新增点击列表头的函数,这个是在类向导中添加,
DWORD select_line;//选择列
bool ASC = FALSE;//是否升序
bool method; // 记录比较方法
static int CALLBACK CompareFunc(LPARAM select_line1, LPARAM select_line2, LPARAM Sort);
void CMFCApplication6Dlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
select_line = pNMLV->iSubItem;//点击的列
int count = list1.GetItemCount();
for (int i = 0; i < count; i++)
list1.SetItemData(i, i); //每行的比较关键字,此处为列序号(点击的列号),可以设置为其他比较函数的第一二个参数
list1.SortItems(CompareFunc, (DWORD_PTR)&list1); // 排序第二个参数是比较函数的第三个参数
method = !method;
*pResult = 0;
}
这个是排序函数
static int CALLBACK CompareFunc(LPARAM select_line1, LPARAM select_line2, LPARAM Sort)
{
USES_CONVERSION;
int row1 = (int)select_line1;
int row2 = (int)select_line2;
CListCtrl* lc = (CListCtrl*)Sort;
CString lp1 = lc->GetItemText(row1, select_line);
CString lp2 = lc->GetItemText(row2, select_line);
if (select_line != (0||2)) //只有名字和性别那列是无序排列
{
if (method)
return lp1.CompareNoCase(lp2);
else
return lp2.CompareNoCase(lp1);
}
else //float类型的比较
{
if (method)
return _ttof(lp1) - _ttof(lp2);
else
return _ttof(lp2) - _ttof(lp1);
}
return 0;
}
都需要在头文件中进行定义。
4.画图
画图使用HIGH-SPEED-chart的控件画的,这里先附上初始化的代码(基本样式和坐标轴等信息),这个控件后期会继续写一篇博客来更新的
//折线图
CChartStandardAxis* pBottomAxis =
m_chartctrl.CreateStandardAxis(CChartCtrl::BottomAxis); //绘制坐标轴
pBottomAxis->SetMinMax(0, 20); //暂时只用得到20
CChartStandardAxis* pLeftAxis =
m_chartctrl.CreateStandardAxis(CChartCtrl::LeftAxis);
CChartAxis* pAxis1;
CChartAxisLabel* pLabel;
CString str1;
pLeftAxis->SetMinMax(0, 105);
pBottomAxis->SetTickIncrement(false, 2.0);
pBottomAxis->SetDiscrete(true);
CChartLineSerie* pSeries = m_chartctrl.CreateLineSerie();
m_chartctrl.GetBottomAxis()->GetLabel()->SetText(L"学号");
m_chartctrl.SetBackGradient(RGB(255, 255, 255), (RGB(252,230,201)), gtVertical);//花里胡哨的背景
m_chartctrl.EnableRefresh(false);
m_chartctrl.GetLegend()->SetVisible(true); //分类图
m_chartctrl.GetLegend()->SetHorizontalMode(true);
m_chartctrl.GetLegend()->UndockLegend(450, 250);
条形图
CChartStandardAxis* pBottomAxis_z =m_chartctr2.CreateStandardAxis(CChartCtrl::BottomAxis); //绘制坐标轴(x)
pBottomAxis_z->SetMinMax(0, 20); //一共有0到20
pBottomAxis_z->SetDiscrete(true);
CChartStandardAxis* pLeftAxis_z=m_chartctr2.CreateStandardAxis(CChartCtrl::LeftAxis);//y轴
pLeftAxis_z->SetMinMax(0, 400);
pLeftAxis_z->GetLabel()->SetText(_T("成绩"));
m_chartctr2.GetBottomAxis()->GetLabel()->SetText(L"学号");
m_chartctr2.GetTitle()->AddString(_T("柱状图")); //设置柱状图的表头
CChartFont titleFont;
titleFont.SetFont(_T("Arial Black"), 120, true, false, true); //设置标题字体
m_chartctr2.GetTitle()->SetFont(titleFont);
m_chartctr2.GetTitle()->SetColor(RGB(0, 0, 128));
m_chartctr2.SetBackGradient(RGB(255, 255, 255), RGB(255, 127, 80), gtVertical); //花里胡哨背景色
m_chartctr2.EnableRefresh(false);
m_chartctr2.GetLegend()->SetVisible(true);
m_chartctr2.GetLegend()->SetHorizontalMode(true);
m_chartctr2.GetLegend()->UndockLegend(450, 10);