- 程序主体设计
程序由主界面界面、添加学生界面、删除学生界面、修改学生界面、查询学生界面和显示学生界面构成的基本模块和由登录界面,关于系统界面以及退出程序构成的辅助模块组成。

程序主体设计示意图
程序登录界面截图:

学生信息管理系统登录界面
程序主界面截图:

学生信息管理系统主界面
- 各模块简介
2.1 基本模块
基本模块是指用户可以对学生信息进行增删查改功能。每个界面点击确定按钮后,即执行完后系统会自动保存数据,无需手动保存。
2.1.1 主界面
主界面用于显示其他界面的按钮,比如说添加学生按钮、删除学生按钮等。用户点击相应按钮即可跳转至相应界面执行相应功能。
2.1.2 增加学生界面
该界面用于录入新学生信息,目前只能录入学生的学号、姓名、性别、班级以及三门成绩。用户在相对于的文本框内输入相对于的数据后点击添加即可。用户不可添加学号相同的学生,否则系统会提示用户添加失败。
2.1.3 查询学生界面
该界面用于查询单个学生的信息,用户可以选择以学号查询和以姓名查询两种模式。在文本框中输入查询的学生的学号或姓名即可查询。
2.1.4 删除学生界面
同查询学生一样,用户需输入学生的学号或名字才能进行删除。如果没有查询到学生,文本框内将会提示用户没有查询到该学生。
2.1.5 修改学生界面
用户需输入要修改的学生的学号,即可显示该学生的原信息,用户可以对原信息进行修改。
2.1.6 输出学生界面
该界面用于显示系统所存储的全部学生信息,用户可以在该界面对学生信息进行查看或复制,但不可修改。
2.2 辅助模块
辅助模块是指除程序基本模块外的模块,比如登陆和提示帮助等。
2.2.1 登陆界面
登陆模块用于检索用户身份,但目前学生信息管理系统版本号为1.0,故仅支持管理员登陆。默认管理员账号为:123456789,密码为:abcdefg。当前版本暂不能修改账号密码。
2.2.2 关于系统界面
这里笔者主要用来输出关于项目的一些基本信息的文本。用户可以对源码进行修改,让关于系统这个界面具有更多的意义。
2.2.3 退出程序
程序在退出前会检查存储数据的本地文件是否存在,改文件为.txt类型,如果不存在会创建。
2.2.4 关于存储文件
程序全部数据将会存储在存储文件内,当程序运行时会先检查文件是否存在,不存在则会自动创建。存储文件的文件路径为"D:\\学生信息管理系统\\student.txt"。用户尽量不要打开此文件进行增删查改等操作。否则学生信息管理系统输出学生信息时,数据可能会出现乱码。数据的增删查改请在学生信息管理系统进行。
- 开发环境
本文使用VS 2022进行编写与编译。图形库采用EasyX与HiEasyX。用户需要下载EasyX图形库,否则程序将会报错。其他有关开发环境说明见代码注释。
- 注意事项
1.程序图标是添加资源文件进去的。该图标在项目文件夹的根目录下。
2.用户添加学生时,学生的学号尽量在10到13位数,比如20221104001。
3.用户添加学生时,学生的班级名尽量在5到8字左右,比如【计算机1班】、【计算机2201班】。
4.用户添加学生时,学生的名字尽量在2到4字左右,比如【张三】,尽量不要出现英文字母。
项目下载链接,请使用百度网盘获取:
https://pan.baidu.com/s/1KhIV9UHi_OBt2H3ElqUD4w 提取码:jk4r
HiEasyX链接: https://github.com/zouhuidong/HiEasyX
EasyX链接:https://easyx.cn/
- 代码
源文件主要有3个,分别是main.cpp、UI.h、UI.cpp,剩下是添加资源图标时他产生的配套头文件resource.h以及HiEasyX的源文件。其中main.cpp用于负责登陆界面,UI.h用于负责函数的声明,UI.cpp用于程序主界面和除登陆界面外的全部界面。数据结构采用链表结构。
5.1 main.cpp代码:
#define _CRT_SECURE_NO_WARNINGS
#include "UI.h"
/*
项目名称:学生信息管理系统(学生成绩管理系统)。
作者:似锦。
当前版本:1.0。
第一版完成日期:二〇二三年一月十四日。
说明:
1.项目基于EasyX与HiEasyX制作。
2.编译环境为:VS 2022。
3.项目属性字符集为:Unicode,安全开发生命周期为:否。
4.编程语言为:C/C++。
如果你没有下载EasyX图形库,则此项目会报错。EasyX链接:https://easyx.cn/。
HiEasyX链接:https://github.com/zouhuidong/HiEasyX。 本项目自带HiEasyX。
最后感谢HiEasyX作者。
*/
// 本项目网盘下载链接:
// https://pan.baidu.com/s/1KhIV9UHi_OBt2H3ElqUD4w
// 提取码:jk4r
/*--------------------------------------------------------------------------------------*/
// 检查密码的合法性
void CheckPassWord(HWND hWnd, wstring s1, wstring w2)
{
if ((_wcsicmp((s1.c_str()), L"123456789") == 0))
{
if ((_wcsicmp((w2.c_str()), L"abcdefg") == 0))
{
FILE* fp = fopen("D:\\学生信息管理系统\\student.txt", "r");
if (fp == NULL)
{
CreateDirectoryA("D:\\学生信息管理系统", NULL);
fp = fopen("D:\\学生信息管理系统\\student.txt", "w");
MessageBox(hWnd,L"暂时没有存储文件,即将为你创建一个,位置\nD:\\学生信息管理系统\\student.txt\ntps:请勿修改,删除或重命名改存储文件,当前是测试版,没有做自定义指定存储文件,谢谢\ntime:2022.01.13.20:00",L"提示",MB_OK);
fclose(fp);
}
fclose(fp);
CloseWindow(hWnd); ShowWindow(hWnd,SW_HIDE);
CreateGraphicsWindow();
MainInterface();
}
else if (((_wcsicmp((w2.c_str()), L"abcdefg") != 0)))
{
MessageBox(hWnd, L"账号或密码错误,\n请重新输入!", L"提示", MB_OK);
}
}
else if (((_wcsicmp((s1.c_str()), L"123456789") != 0)))
{
MessageBox(hWnd, L"账号或密码错误,\n请重新输入!", L"提示", MB_OK);
}
}
// 登录界面
void LoginInterface()
{
// 设置程序图标
SetCustomIcon(MAKEINTRESOURCE(IDI_ICON1), MAKEINTRESOURCE(IDI_ICON1));
Window wnd;
PreSetWindowPos(650, 380);
HWND hWnd = wnd.Create(420, 245, EW_NORMAL, L"学生信息管理系统");
SetWindowStyle(hWnd);
SysStatic label1, label2, label3, label4;
label1.Create(hWnd, 85, 25, 300, 30, L"学生信息管理系统登陆界面");
label2.Create(hWnd, 30, 80, 60, 30, L"账号");
label3.Create(hWnd, 30, 130, 45, 30, L"密码");
SysEdit Text1, Text2;
Text1.Create(hWnd, 80, 78, 240, 30, L"");
Text2.Create(hWnd, 80, 128, 240, 30, L"");
Text1.SetMaxTextLength(18);
Text2.SetMaxTextLength(20);
Text1.NumberOnly(true);
Text2.Password(true);
SysButton btn1, btn2, btn3, btn4;
btn1.Create(hWnd, 50, 180, 100, 30, L"退出系统");
btn2.Create(hWnd, 220, 180, 100, 30, L"登录系统");
btn3.Create(hWnd, 325, 78, 60, 30, L"清空");
btn4.Create(hWnd, 325, 128, 60, 30, L"清空");
SysCheckBox CheckBox;
CheckBox.Create(hWnd, 67, 135, 10, 20, L"");
ExMessage msg;
while (1)
{
peekmessage(&msg, EM_MOUSE);
if (btn1.isClicked())
{
exit(0);
}
if (btn2.isClicked())
{
wstring w1 = Text1.GetText();
wstring w2 = Text2.GetText();
CheckPassWord(hWnd, w1, w2);
}
if (btn3.isClicked())
{
Text1.SetText(L"");
}
if (btn4.isClicked())
{
Text2.SetText(L"");
}
if (CheckBox.isChecked())
{
Text2.Password(0);
}
else if (CheckBox.isChecked() == false)
{
Text2.Password(1);
}
if (GetAsyncKeyState(VK_RETURN) & 0x8000)
{
wstring w1 = Text1.GetText();
wstring w2 = Text2.GetText();
CheckPassWord(hWnd, w1, w2);
}
}
}
// 主函数
int main()
{
FILE* fp; fp = fopen("D:\\学生信息管理系统\\student.txt","r");
if (fp==NULL)
{
CreateDirectory(L"D:\\学生信息管理系统\\student.txt",NULL);
Sleep(10);
fp = fopen("D:\\学生信息管理系统\\student.txt", "w");
}
fclose(fp);
LoginInterface();
system("pause");
return 0;
}
5.2 UI.h代码:
#pragma once
#include "resource.h"
#include "HiEasyX.h"
#include <stdio.h>
#include <string.h>
#include <Windows.h>
#include <time.h>
using namespace std;
using namespace hiex;
// 获取当前系统时间。
void GetTime();
// 显示当前系统时间。
void ShowTime(HWND);
// char*转wstring。
wstring StringConvertWstring(char*);
// 程序主界面
void MainInterface();
// 设置窗口风格。
void SetWindowStyle(HWND);
// 初始化主界面按钮。
void InitButton(HWND);
// 检索鼠标是否按下按钮,按下则返回按钮编号。
int RetrieveMouse();
// 对按钮编号进行处理,跳转至相关界面。
void SwitchInterface(int);
// 声明链表结构体。
typedef struct _list List;
// 声明节点结构体。
typedef struct _student Student;
// 从文件中读取信息。
List* ReadNodeFile();
// 创建链表,申请内存。
List* CreateList();
// 创建节点,申请内存。
Student* CreateNewNode();
// 创建图形化窗口。
void CreateGraphicsWindow();
// 输出(显示)学生界面。
void PrintStudentInterface();
// 以学号查询学生。
Student* SearchStudentByNumber(List*, long long int);
// 以名字查询学生。
Student* SearchStudentByName(List*, wstring);
// 查询学生界面。
void SearchStudentInterface();
// 是否显示主界面按钮。
void ShowBaseButton(bool);
// 保存链表信息。
void SaveData(List*, const char*);
// 获取链表成员数量。
int StatisticsCount();
// 删除学生界面。
void DeleteStudentInterface();
// 添加学生界面。
void AddititonStudentInterface();
// wstring转char*
char* WstringConvertString(wstring);
// 修改学生界面。
void RevsiseStudentInterface();
// 关于系统界面
void AboutSystemInterface();
5.3 UI.cpp代码:
#include "UI.h"
SysStatic ShowTimeControl;
SysStatic TitleLabel;
SysButton MainModuleLabel, SearchModuleLabel, AdditionModuleLabel, DeleteModuleLabel,
ReviseModuleLabel, PrintModuleLabel, AboutModuleLabel, ExitModuleLabel;
HWND g_hwnd; // 窗口句柄的全局变量 因为HiEasyX创建控件需要窗口句柄。
enum Page
{
// 各个界面的页码 根据界面页码进行跳转。
MainPage, SearchPage, AdditionPage, DeletePage, RevisePage, PrintPage, AboutPage, ExitPage
}page;
struct _time
{
char CurrentYear[10];
char CurrentMon[10];
char CurrentDay[10];
char CurrentHour[10];
char CurrentMinute[10];
char CurrentSecond[10];
char TimeAggregate[110]; // 时间合集。
}Time;
typedef struct _student
{
long long int Number;
char Name[20];
char Grader[4];
char Class[20];
int score1, score2, score3;
struct _student* next; // 指针域,指向下一个节点。
}Student;
typedef struct _list
{
Student* Front; // 指向头节点
Student* Tail; // 指向尾节点
}List;
void SetWindowStyle(HWND hWnd)
{
// 获取窗口风格
long Sryle = GetWindowLong(hWnd, GWL_STYLE);
// 对窗口风格的一些值进行与和取反 比如下面的WS_MAXIMIZEBOX,这个是窗口最大化按钮,对他取反就是取消最大化按钮,WS_THICKFRAME是窗口大小是否可变
Sryle &= ~(WS_MAXIMIZEBOX) & ~(WS_THICKFRAME);
SetWindowLong(hWnd, GWL_STYLE, Sryle);
}
// 初始化基本按钮 基本按钮就是主界面的[查询学生][修改学生][删除学生]等
void InitButton(HWND hWnd)
{
SearchModuleLabel.Create(hWnd, 260, 130, 200, 40, L"查 询 学 生");
AdditionModuleLabel.Create(hWnd, 260, 130 + 60, 200, 40, L"添 加 学 生");
DeleteModuleLabel.Create(hWnd, 260, 130 + 120, 200, 40, L"删 除 学 生");
ReviseModuleLabel.Create(hWnd, 260, 130 + 180, 200, 40, L"修 改 学 生");
PrintModuleLabel.Create(hWnd, 260, 130 + 240, 200, 40, L"显 示 学 生");
AboutModuleLabel.Create(hWnd, 260, 130 + 300, 200, 40, L"关 于 系 统");
ExitModuleLabel.Create(hWnd, 260, 130 + 360, 200, 40, L"退 出 系 统");
// Create函数用来创建该控件
// 参数1是窗口句柄 说白了要把控件创建在哪个窗口上
// 参数2与3是控件在窗口的坐标
// 参数3与4是控件的长与宽
// 最后一个参数是控件的初始显示文本
SearchModuleLabel.SetFont(25, 0, L"幼圆");
AdditionModuleLabel.SetFont(25, 0, L"幼圆");
DeleteModuleLabel.SetFont(25, 0, L"幼圆");
ReviseModuleLabel.SetFont(25, 0, L"幼圆");
SearchModuleLabel.SetFont(25, 0, L"幼圆");
PrintModuleLabel.SetFont(25, 0, L"幼圆");
AboutModuleLabel.SetFont(25, 0, L"幼圆");
ExitModuleLabel.SetFont(25, 0, L"幼圆");
// SetFont函数用来修改文本的大小和字体
// 参数1是文本的宽度 参数2写0是高度自适应
// 最后一个参数是字体
SearchModuleLabel.Show(1);
AdditionModuleLabel.Show(1);
DeleteModuleLabel.Show(1);
ReviseModuleLabel.Show(1);
SearchModuleLabel.Show(1);
PrintModuleLabel.Show(1);
AboutModuleLabel.Show(1);
ExitModuleLabel.Show(1);
// Show函数是用来显示控件,如果是1就是显示是0就是隐藏,他其实是bool 你写true是显示 写入false是隐藏
}
int RetrieveMouse()
{
// GetClickCount等效于isClicked()用来判断鼠标左键有没有按下按钮
if (SearchModuleLabel.GetClickCount() > 0)
{
return 1;
}
else if (AdditionModuleLabel.GetClickCount() > 0)
{
return 2;
}
else if (DeleteModuleLabel.GetClickCount() > 0)
{
return 3;
}
else if (ReviseModuleLabel.GetClickCount() > 0)
{
return 4;
}
else if (PrintModuleLabel.GetClickCount() > 0)
{
return 5;
}
else if (AboutModuleLabel.GetClickCount() > 0)
{
return 6;
}
else if (ExitModuleLabel.GetClickCount() > 0)
{
return 7;
}
}
void SwitchInterface(int Select)
{
// 对参数进行判断
switch (Select)
{
case 0:page = MainPage; break;
case 1:page = SearchPage; break;
case 2:page = AdditionPage; break;
case 3:page = DeletePage; break;
case 4:page = RevisePage; break;
case 5:page = PrintPage; break;
case 6:page = AboutPage; break;
case 7:page = ExitPage; break;
}
// 进行跳转
switch (page)
{
case MainPage:
MainInterface();
break;
case SearchPage:
SearchStudentInterface();
break;
case AdditionPage:
AddititonStudentInterface();
break;
case DeletePage:DeleteStudentInterface();
break;
case RevisePage:RevsiseStudentInterface();
break;
case PrintPage:
PrintStudentInterface();
break;
case AboutPage:AboutSystemInterface(); break;
case ExitPage:
FILE* fp = fopen("D:\\学生信息管理系统\\student.txt", "r");
if (fp == NULL)
{
CreateDirectory(L"D:\\学生信息管理系统",NULL);
}
fclose(fp);
exit(666);
break;
}
}
// 创建链表
List* CreateList()
{
// 需要包含stdlib或windows头文件
// calloc向堆区申请内存,他会自动初始化0,相对于malloc,但是malloc不初始化
List* newList = (List*)calloc(1, sizeof(List));
return newList;
}
// 创建节点
Student* CreateNewNode()
{
// 注释和上面创建链表相似
Student* headNode = (Student*)calloc(1, sizeof(Student));
return headNode;
}
// 显示学生界面函数
void PrintStudentInterface()
{
// 1.先修改标题为显示学生 在SetPos()修改控件的坐标
TitleLabel.SetText(L" 显 示 学 生");
TitleLabel.SetPos(235, 30);
ShowBaseButton(0);// 这个写0是让基本按钮隐藏 也就是主界面的那七个按钮 写1就是显示
// 获取链表的成员数量
List* list = ReadNodeFile();
Student* cntNode = list->Front->next; int acnt = 0;
while (cntNode!=NULL)
{
acnt++; cntNode = cntNode->next;
}
// 创建静态控件 就是VB里的Label控件
SysStatic cntlabel; char charcnt[15]; sprintf(charcnt,"人数:%d",acnt);
wstring wcnt = StringConvertWstring(charcnt);
cntlabel.Create(g_hwnd,700,50,80,30,L"");
cntlabel.SetText(wcnt);
SysEdit Text;
Text.PreSetStyle(true, false, true, true, false, false);
Text.Create(g_hwnd, 35, 80, 710, 500, L"");
Text.SetFont(20, 0, L"宋体");
Text.ReadOnly(true);
// 创建按钮控件
SysButton btn, btn1; btn1.Create(g_hwnd,650,20,120,30,L"重置学生信息");
btn.Create(g_hwnd, 10, 10, 80, 30, L"返回主页");
btn.SetFont(15, 0, L"黑体");
FILE* fp; btn.SetFont(20,0,L"黑体"); btn1.SetFont(20, 0, L"黑体");
fp = fopen("D:\\学生信息管理系统\\student.txt", "r");
fseek(fp, 0, SEEK_END);
int Len = ftell(fp);
char* buf = (char*)malloc(Len);
fseek(fp, 0, SEEK_SET);
fread(buf, Len, 1, fp);
fclose(fp);
wstring w1;
w1 = StringConvertWstring(buf);
Text.Show(1);
Text.SetText(w1);
Text.SetFont(22, 0, L"楷体");
FLUSH_DRAW();
DWORD t1, t2;
t1 = t2 = GetTickCount();
int Select = 999;
SysStatic label; label.Create(g_hwnd, 600, 60, 100, 20, L"");
FLUSH_DRAW();
while (1)
{
if (btn1.isClicked())
{
remove("D:\\学生信息管理系统\\student.txt");
MessageBox(g_hwnd,L"重置成功",L"重置学生信息",MB_OK|MB_ICONASTERISK);
}
if (btn.GetClickCount() > 0)
{
btn.Show(false); btn1.Show(false);
btn.Enable(false);
Text.Show(0); cntlabel.Show(0);
Select = 0; label.Show(0);
SwitchInterface(Select);
}
t1 = GetTickCount();
if (t1 - t2 >= 990)
{
FLUSH_DRAW();
ShowTime(g_hwnd);
t1 = t2 = GetTickCount();
}
Sleep(30); FLUSH_DRAW();
}
}
Student* SearchStudentByNumber(List* list, long long int num)
{
Student* destNode = CreateNewNode();
destNode = list->Front->next;
while (destNode != NULL)
{
if (num == destNode->Number)
{
return destNode;
}
destNode = destNode->next;
}
return NULL;
}
Student* SearchStudentByName(List* list, wstring sourceName)
{
int Len = WideCharToMultiByte(CP_ACP, 0, sourceName.c_str(), sourceName.length(), 0, 0, 0, 0);
char* destName = new char[Len];
WideCharToMultiByte(CP_ACP, 0, sourceName.c_str(), sourceName.length(), destName, Len, 0, 0);
Student* destNode = list->Front->next;
while (destNode != NULL)
{
if (strcmp(destName, destNode->Name) == 0)
{
return destNode;
}
destNode = destNode->next;
}
return NULL;
}
void SearchStudentInterface()
{
page = SearchPage;
FLUSH_DRAW();
ShowBaseButton(false);
TitleLabel.SetText(L"查 询 学 生");
TitleLabel.SetPos(300, 20);
SysStatic label1, label2, label3, label4, retTitle,imglabel;
label1.Show(1);
label1.Create(g_hwnd, 370 - 5 - 5, 165, 300, 30, L"查询模式");
SysButton btn1, btn2, btn3, btn4, btn5;
btn1.Create(g_hwnd, 310 - 5 - 5, 200, 200, 30, L"以学号查询");
btn2.Create(g_hwnd, 310 - 5 - 5, 270, 200, 30, L"以名字查询");
btn1.Show(1); btn1.Show(2); btn5.Create(g_hwnd, 20, 20, 80, 30, L"返回主页");
SysEdit Text1, Text2, Text3;
DWORD t1, t2; t1 = t2 = GetTickCount();
List* list = ReadNodeFile();
SysStatic l1, l2, l3, l4, l5, l6, l7, l8,l9;
FLUSH_DRAW();
while (1)
{
t1 = GetTickCount();
if (t1 - t2 >= 990)
{
FLUSH_DRAW();
ShowTime(g_hwnd);
t1 = t2 = GetTickCount();
}
if (btn5.isClicked())
{
int a = 0; Text1.Show(0); Text2.Show(0); Text3.Show(0); l9.Show(false);
btn1.Show(0); btn2.Show(0); btn3.Show(0); btn4.Show(0); btn5.Show(0);
label1.Show(0); label2.Show(0); label3.Show(0); label4.Show(0); retTitle.Show(0);
l1.Show(0); l2.Show(0); l3.Show(0); l4.Show(0);
l5.Show(0); l6.Show(0); l7.Show(0); l8.Show(0); l9.Show(0);
Sleep(10); FLUSH_DRAW(); break;
}
if (btn1.isClicked())
{
label1.Show(0); btn1.Show(0); btn2.Show(0);
label2.Create(g_hwnd, 100 + 60, 200-120, 140, 30, L"请输入学生学号:");
Text1.Create(g_hwnd, 240 + 60, 200-120, 180 + 18, 30, L"");
Text1.SetMaxTextLength(18); Text1.SetFont(25, 0, L"华文宋体");
btn3.Create(g_hwnd, 360 + 60 + 20 + 60, 200-120, 120, 30, L"查询");
FLUSH_DRAW();
}
if (btn2.isClicked())
{
label3.Show(0); btn1.Show(0); btn2.Show(0);
label4.Create(g_hwnd, 100 + 60, 200-120, 140, 30, L"请输入学生名字:");
Text3.Create(g_hwnd, 240 + 60, 200-120, 180 + 18, 30, L"");
Text3.SetMaxTextLength(18); Text3.SetFont(25, 0, L"华文宋体");
btn4.Create(g_hwnd, 360 + 60 + 20 + 60, 200-120, 120, 30, L"查询");
FLUSH_DRAW();
}
if (btn3.isClicked())
{
label1.Show(0);
label3.Create(g_hwnd, 300, 240-120, 140, 30, L"查询结果");
label3.SetFont(30, 0, L"宋体");
wstring w1 = Text1.GetText();
char* destNum = WstringConvertString(w1);
long long int num = atoll(destNum);
free(destNum); destNum = NULL;
Student* ret = SearchStudentByNumber(list, num);
l1.Create(g_hwnd, 250, 180, 60, 500, L"学号 姓名 性别 班级 语文 数学 英语 总分");
l1.SetFont(23, 0, L"楷体"); l8.Create(g_hwnd, 330, 350 + 70 - 7 + 45, 400, 30, L"/");
l2.Create(g_hwnd, 330, 180, 400, 30, L"/"); l3.Create(g_hwnd, 330, 180 + 46, 400, 30, L"/");
l4.Create(g_hwnd, 330, 180 + 95, 400, 30, L"/"); l5.Create(g_hwnd, 330, 180 + 140, 400, 30, L"/");
l6.Create(g_hwnd, 330, 350 + 20 - 3, 400, 30, L"/"); l7.Create(g_hwnd, 330, 350 + 70 - 7, 400, 30, L"/");
l9.Create(g_hwnd, 330, 350 + 70 - 7 + 95 - 3, 400, 30, L"/");
if (ret == NULL)
{
l2.SetText(L"查无此人!"); l3.SetText(L"/"); l4.SetText(L"/");
l5.SetText(L"/"); l6.SetText(L"/"); l7.SetText(L"/");
l8.SetText(L"/"); l9.SetText(L"/");
}
else if (ret != NULL)
{
char number[18]; sprintf(number, "%lld", ret->Number);
char score1[10]; char score2[10]; char score3[10];
sprintf(score1, "%d", ret->score1); sprintf(score2, "%d", ret->score2); sprintf(score3, "%d", ret->score3);
wstring w1 = StringConvertWstring(number);
wstring w2 = StringConvertWstring(ret->Name);
wstring w3 = StringConvertWstring(ret->Grader);
wstring w4 = StringConvertWstring(ret->Class);
wstring w5 = StringConvertWstring(score1);
wstring w6 = StringConvertWstring(score2);
wstring w7 = StringConvertWstring(score3);
int abc1, abc2, abc3; char abc[10];
abc1 = atoi(score1); abc2 = atoi(score2); abc3 = atoi(score3);
sprintf(abc, "%d", abc1 + abc2 + abc3);
wstring w8 = StringConvertWstring(abc);
l2.SetText(w1); l3.SetText(w2); l4.SetText(w3); l9.SetText(w8);
l5.SetText(w4); l6.SetText(w5); l7.SetText(w6); l8.SetText(w7);
}
}
if (btn4.isClicked())
{
label1.Show(0);
label3.Create(g_hwnd, 300, 130, 140, 30, L"查询结果");
label3.SetFont(30, 0, L"宋体");
wstring w1 = Text3.GetText();
Student* ret = SearchStudentByName(list, w1);
l1.Create(g_hwnd,250,180,60,500,L"学号 姓名 性别 班级 语文 数学 英语 总分");
l1.SetFont(23,0,L"楷体"); l8.Create(g_hwnd, 330, 350 + 70 - 7 +45, 400, 30, L"/");
l2.Create(g_hwnd, 330, 180, 400, 30,L"/"); l3.Create(g_hwnd, 330, 180+46, 400, 30, L"/");
l4.Create(g_hwnd, 330, 180+95, 400, 30, L"/"); l5.Create(g_hwnd, 330, 180 + 140, 400, 30, L"/");
l6.Create(g_hwnd, 330, 350+20-3, 400, 30, L"/"); l7.Create(g_hwnd, 330, 350+70-7, 400, 30, L"/");
l9.Create(g_hwnd, 330, 350 + 70 - 7 + 95-3, 400, 30, L"/");
if (ret == NULL)
{
l2.SetText(L"查无此人!"); l3.SetText(L"/"); l4.SetText(L"/");
l5.SetText(L"/"); l6.SetText(L"/"); l7.SetText(L"/");
l8.SetText(L"/"); l9.SetText(L"/");
}
else if (ret != NULL)
{
char number[18]; sprintf(number,"%lld",ret->Number);
char score1[10]; char score2[10]; char score3[10];
sprintf(score1,"%d",ret->score1); sprintf(score2, "%d", ret->score2); sprintf(score3, "%d", ret->score3);
wstring w1 = StringConvertWstring(number);
wstring w2 = StringConvertWstring(ret->Name);
wstring w3 = StringConvertWstring(ret->Grader);
wstring w4 = StringConvertWstring(ret->Class);
wstring w5 = StringConvertWstring(score1);
wstring w6 = StringConvertWstring(score2);
wstring w7 = StringConvertWstring(score3);
int abc1, abc2, abc3; char abc[10];
abc1 = atoi(score1); abc2 = atoi(score2); abc3 = atoi(score3);
sprintf(abc,"%d",abc1+abc2+abc3);
wstring w8 = StringConvertWstring(abc);
l2.SetText(w1); l3.SetText(w2); l4.SetText(w3); l9.SetText(w8);
l5.SetText(w4); l6.SetText(w5); l7.SetText(w6); l8.SetText(w7);
}
}
Sleep(30); FLUSH_DRAW();
}
Sleep(10); SwitchInterface(0);
}
void ShowBaseButton(bool a)
{
if (a)
{
MainModuleLabel.Show(true); SearchModuleLabel.Show(true); AdditionModuleLabel.Show(true);
DeleteModuleLabel.Show(true); ReviseModuleLabel.Show(true); PrintModuleLabel.Show(true);
AboutModuleLabel.Show(true); ExitModuleLabel.Show(true);
}
else
{
MainModuleLabel.Show(false); SearchModuleLabel.Show(false); AdditionModuleLabel.Show(false);
DeleteModuleLabel.Show(false); ReviseModuleLabel.Show(false); PrintModuleLabel.Show(false);
AboutModuleLabel.Show(false); ExitModuleLabel.Show(false);
}
}
void SaveData(List* list, const char* filepath)
{
FILE* fp = fopen("D:\\学生信息管理系统\\student.txt", "w"); Student* saveNode = CreateNewNode();
saveNode = list->Front->next;
while (saveNode != NULL)
{
if (strlen(saveNode->Name) == 4)
{
fprintf(fp, "%lld\t%s \t%s\t%s\t%d %d %d\n", saveNode->Number,
saveNode->Name, saveNode->Grader, saveNode->Class, saveNode->score1, saveNode->score2, saveNode->score3);
}
else if (strlen(saveNode->Name) == 6)
{
fprintf(fp, "%lld\t%s\t%s\t%s\t%d %d %d\n", saveNode->Number,
saveNode->Name, saveNode->Grader, saveNode->Class, saveNode->score1, saveNode->score2, saveNode->score3);
}
else if (strlen(saveNode->Name) == 8)
{
fprintf(fp, "%lld\t%s\t%s\t%s\t%d %d %d\n", saveNode->Number,
saveNode->Name, saveNode->Grader, saveNode->Class, saveNode->score1, saveNode->score2, saveNode->score3);
}
saveNode = saveNode->next;
}
fclose(fp);
}
int StatisticsCount()
{
List* list = ReadNodeFile();
Student* a1; a1 = list->Front->next; int cnt = 0;
while (a1 != NULL)
{
cnt++;
a1 = a1->next;
}
return cnt;
}
void DeleteStudentInterface()
{
page = DeletePage;
ShowBaseButton(false);
TitleLabel.SetText(L"删 除 学 生");
TitleLabel.SetPos(285, 30); FLUSH_DRAW(); Sleep(5);
SysStatic label1;
label1.Create(g_hwnd, 295, 100, 200, 30, L"查询与删除模式");
label1.SetFont(25, 0, L"宋体");
SysButton btn1, btn2, btn3, btn4, btn5;
btn1.Create(g_hwnd, 295 - 10, 135, 200, 30, L"以学号查询并删除");
btn2.Create(g_hwnd, 280 + 5, 135 + 50, 200, 30, L"以名字查询并删除");
btn1.SetFont(22, 0, L"宋体"); btn2.SetFont(22, 0, L"宋体");
SysEdit Text1, Text2; List* list = ReadNodeFile();
btn5.Create(g_hwnd, 20, 20, 80, 30, L"返回主页");
DWORD t1, t2; t1 = t2 = GetTickCount();
FLUSH_DRAW(); ExMessage msg = { 0 }; Student* node, * preNode;
while (1)
{
if (btn1.isClicked() == true)
{
btn1.Show(0); btn2.Show(0); label1.SetText(L"请输入学生学号"); btn3.Create(g_hwnd, 295 - 10, 135 + 80, 200, 30, L"确定");
Text1.Create(g_hwnd, 280 + 5, 135 + 40, 200, 30, L""); Text2.Show(0); btn4.Show(0); FLUSH_DRAW();
}
if (btn3.isClicked() == true)
{
label1.SetText(L"请输入学生学号");
FLUSH_DRAW();
long long int num = 0; wstring w1 = Text1.GetText();
char* a1 = WstringConvertString(w1);
num = atoll(a1); int cnt = 0; long long int getnum = 0;
preNode = node = list->Front->next; bool a2 = false;
while (node != NULL)
{
if (num == node->Number)
{
getnum = node->Number;
a2 = true;
break;
}
preNode = node;
node = node->next;
}
if (a2 == true)
{
if (node == list->Front->next)
{
list->Front->next = node->next;
}
else
{
preNode->next = node->next;
}
SaveData(list, "D:\\学生信息管理系统\\student.txt"); char t[25]; sprintf(t, "%lld -> 删除成功!", getnum);
wstring print = StringConvertWstring(t);
Text1.SetText(print); free(preNode); FLUSH_DRAW();
}
else if (a2 == false)
{
wstring getcurnum = Text1.GetText();
int len = WideCharToMultiByte(CP_ACP, 0, getcurnum.c_str(), getcurnum.length(), 0, 0, 0, 0);
char* md = new char[len];
WideCharToMultiByte(CP_ACP, 0, getcurnum.c_str(), getcurnum.length(), md, len, 0, 0);
long long int md1; md1 = atoll(md); int cnt = 0;
while (md1 > 9)
{
md1 = md1 / 10;
cnt++;
}
md1 = atoll(md);
if (cnt >= 10)
{
md1 = md1 / 10;
}
char msg[25]; sprintf(msg, "未找到[%lld]信息", md1);
wstring m1 = StringConvertWstring(msg);
Text1.SetText(m1); FLUSH_DRAW();
}
}
if (btn2.isClicked() == true)
{
btn3.Show(0); Text1.Show(0);
label1.SetText(L"请输入学生名字"); btn1.Show(0); btn2.Show(0);
Text2.Create(g_hwnd, 280 + 5, 135 + 40, 200, 30, L""); btn4.Create(g_hwnd, 295 - 10, 135 + 80, 200, 30, L"确定"); FLUSH_DRAW();
}
if (btn4.isClicked() == true)
{
wstring w1 = Text2.GetText(); int len = WideCharToMultiByte(CP_ACP, 0, w1.c_str(), w1.length(), 0, 0, 0, 0);
char* text = new char[len]; WideCharToMultiByte(CP_ACP, 0, w1.c_str(), w1.length(), text, len, 0, 0);
node = preNode = list->Front->next; bool a1 = false; char curname[10] = "\0";
while (node != NULL)
{
if (strcmp(node->Name, text) == 0)
{
strcpy(curname, text); strcat(curname, "\0");
a1 = true;
break;
}
preNode = node;
node = node->next;
}
if (a1 == true)
{
if (node == list->Front->next)
{
list->Front->next = node->next;
}
else
{
preNode->next = node->next;
}
SaveData(list, "D:\\学生信息管理系统\\student.txt"); free(node); node = NULL;
char msg[30]; sprintf(msg, "[%s] -----> 删除成功 ", curname);
wstring ww1 = StringConvertWstring(msg); Text2.SetText(ww1);
}
else if (a1 == false)
{
wstring curtext = Text2.GetText(); int len = WideCharToMultiByte(CP_ACP, 0, curtext.c_str(), curtext.length(), 0, 0, 0, 0);
char* destname = new char[len]; WideCharToMultiByte(CP_ACP, 0, curtext.c_str(), curtext.length(), destname, len, 0, 0);
char msg[30]; sprintf(msg, "没找到[%s]相关信息 ", destname); wstring w1;
w1 = StringConvertWstring(msg); Text2.SetText(w1); FLUSH_DRAW();
}
}
if (btn5.isClicked() == true)
{
btn1.Show(0); btn2.Show(0); btn3.Show(0); btn4.Show(0); btn5.Show(0);
Text1.Show(0); Text2.Show(0); label1.Show(0);
FLUSH_DRAW(); break;
}
t1 = GetTickCount();
if (t1 - t2 >= 990)
{
FLUSH_DRAW();
ShowTime(g_hwnd);
t1 = t2 = GetTickCount();
}
Sleep(30); FLUSH_DRAW();
}
Sleep(10); SwitchInterface(0);
}
char* WstringConvertString(wstring w)
{
int Len = WideCharToMultiByte(CP_ACP,0,w.c_str(), w.length(), 0, 0, 0, 0);
char* buf = new char[Len + 1];
WideCharToMultiByte(CP_ACP, 0, w.c_str(), w.length(), buf, Len,0,0);
buf[Len]='\0'; return buf;
}
bool ReviseStudent(long long int a1, long long int Num,const char* Name,const char* Grader,const char* Class,int score1,int score2,int score3)
{
List* list = ReadNodeFile();
Student* s1, * s2; s1 = s2 = list->Front->next;
while (s1!=NULL)
{
if ((a1 == s1->Number))
{
s1->Number = Num;
s1->score1 = score1; s1->score2 = score2; s1->score3 = score3;
strcpy(s1->Name, Name); strcpy(s1->Grader, Grader); strcpy(s1->Class,Class);
SaveData(list, "D:\\学生信息管理系统\\student.txt");
return true;
}
s1 = s1->next;
}
return false;
}
void RevsiseStudentInterface()
{
ShowBaseButton(false);
TitleLabel.SetText(L"修 改 学 生"); TitleLabel.SetPos(305,20);
SysButton btn1,btn2,btn3,btn4,btn5;
btn1.Create(g_hwnd,20,20,80,30,L"返回主页");
SysStatic label1, label2,label3, label4, label5, label6, label7, label8, label9,label10, label11;
label1.Create(g_hwnd, 310, 70, 200, 30, L"");
List* list = ReadNodeFile(); SysEdit t1; Student* ret,*node;
SysStatic l1, l2, l3, l4, l5, l6, l7;
SysEdit x1, x2, x3, x4, x5, x6, x7;
label1.SetText(L"请输入学生学号"); btn2.Show(0); btn3.Show(0);
t1.Create(g_hwnd, 310, 100, 200, 30, L""); t1.NumberOnly(1);
btn4.Create(g_hwnd, 310, 130, 200, 30, L"确定"); btn4.SetFont(20, 0, L"楷体");
x1.NumberOnly(1); x5.NumberOnly(1); x6.NumberOnly(1); x7.NumberOnly(1);
long long int ReviseNum = 0; DWORD tt1, tt2; tt1 = tt2 = GetTickCount();
while (1)
{
if (btn1.isClicked())
{
x1.Show(0); x2.Show(0); x3.Show(0); x4.Show(0);
x5.Show(0); x6.Show(0); x7.Show(0);
l1.Show(0); l2.Show(0); l3.Show(0); l4.Show(0);
l5.Show(0); l6.Show(0); l7.Show(0); btn5.Show(0);
btn1.Show(0); label1.Show(0); label2.Show(0); label9.Show(0);
btn2.Show(0); btn3.Show(0); btn4.Show(0); t1.Show(0); label10.Show(0);
label3.Show(0); label4.Show(0); label5.Show(0); label11.Show(0);
label6.Show(0); label7.Show(0); label8.Show(0);
FLUSH_DRAW(); Sleep(10); break;
}
if (btn4.isClicked())
{
btn5.Create(g_hwnd,310,470+40,150,30,L"确定修改");
{
x1.Create(g_hwnd,440, 130 + 100,150,30,L"");
x2.Create(g_hwnd, 440, 170 + 100, 150, 30, L"");
x3.Create(g_hwnd, 440, 210 + 100, 150, 30, L"");
x4.Create(g_hwnd, 440, 250 + 100, 150, 30, L"");
x5.Create(g_hwnd, 440, 290 + 100, 150, 30, L"");
x6.Create(g_hwnd, 440, 330 + 100, 150, 30, L"");
x7.Create(g_hwnd, 440, 370 + 100, 150, 30, L"");
}
{
l1.Create(g_hwnd, 200 + 50, 130 + 100, 130, 30, L"");
l2.Create(g_hwnd, 200 + 50, 170 + 100, 130, 30, L"");
l3.Create(g_hwnd, 200 + 50, 210 + 100, 130, 30, L"");
l4.Create(g_hwnd, 200 + 50, 250 + 100, 130, 30, L"");
l5.Create(g_hwnd, 200 + 50, 290 + 100, 130, 30, L"");
l6.Create(g_hwnd, 200 + 50, 330 + 100, 130, 30, L"");
l7.Create(g_hwnd, 200 + 50, 370 + 100, 130, 30, L"");
}
{
label3.Create(g_hwnd, 200, 130 + 100, 40, 30, L"学号");
label4.Create(g_hwnd, 200, 170 + 100, 40, 30, L"名字");
label5.Create(g_hwnd, 200, 210 + 100, 40, 30, L"性别");
label6.Create(g_hwnd, 200, 250 + 100, 40, 30, L"班级");
label7.Create(g_hwnd, 200, 290 + 100, 40, 30, L"语文");
label8.Create(g_hwnd, 200, 330 + 100, 40, 30, L"数学");
label9.Create(g_hwnd, 200, 370 + 100, 40, 30, L"英语");
}
wstring info = t1.GetText(); char* buf = WstringConvertString(info);
if (info.c_str() == NULL)
{
continue;
}
long long int searchNum = atoll(buf);
free(buf); buf = NULL; ReviseNum = searchNum;
ret = CreateNewNode(); ret = SearchStudentByNumber(list, searchNum);
x1.Enable(1); x2.Enable(1); x3.Enable(1);
x4.Enable(1); x5.Enable(1); x6.Enable(1); x7.Enable(1);
if (ret == NULL)
{
l1.SetText(L"查无此人"); l2.SetText(L"\\"); l3.SetText(L"\\");
l4.SetText(L"\\"); l5.SetText(L"\\"); l6.SetText(L"\\");
l7.SetText(L"\\"); x1.Enable(0); x2.Enable(0); x3.Enable(0);
x4.Enable(0); x5.Enable(0); x6.Enable(0); x7.Enable(0); continue;
}
long long int srcNum = ret->Number;
char srcChar1[20] ; sprintf(srcChar1, "%lld", ret->Number);
char srcChar2[20]; sprintf(srcChar2,"%d", ret->score1);
char srcChar3[20]; sprintf(srcChar3, "%d", ret->score2);
char srcChar4[20]; sprintf(srcChar4, "%d", ret->score3);
wstring srcNumber = StringConvertWstring(srcChar1);
wstring srcGrader = StringConvertWstring(ret->Grader);
wstring srcName = StringConvertWstring(ret->Name);
wstring srcClass = StringConvertWstring(ret->Class);
wstring srcs1 = StringConvertWstring(srcChar2);
wstring srcs2 = StringConvertWstring(srcChar3);
wstring srcs3 = StringConvertWstring(srcChar4);
{
l1.SetText(srcNumber); l2.SetText(srcName); l3.SetText(srcGrader);
l4.SetText(srcClass); l5.SetText(srcs1); l6.SetText(srcs2); l7.SetText(srcs3);
}
label10.Create(g_hwnd,250,200,70,30,L"原信息");
label11.Create(g_hwnd, 220 + 220, 200, 70, 30, L"新信息");
t1.SetText(L"");
}
if (btn5.isClicked())
{
if ((x1.GetTextLength()>=4) && (x2.GetTextLength() >= 1) && (x4.GetTextLength() >= 4))
{
wstring w1 = x1.GetText(); wstring w2 = x2.GetText();
wstring w3 = x3.GetText(); wstring w4 = x4.GetText();
wstring w5 = x5.GetText(); wstring w6 = x6.GetText();
wstring w7 = x7.GetText();
char* srcNum = WstringConvertString(w1);
char* srcName = WstringConvertString(w2);
char* srcGrader = WstringConvertString(w3);
char* srcClass = WstringConvertString(w4);
char* srcScore1 = WstringConvertString(w5);
char* srcScore2 = WstringConvertString(w6);
char* srcScore3 = WstringConvertString(w7);
long long destNum = atoll(srcNum);
int s1 = atoi(srcScore1); int s2 = atoi(srcScore2); int s3 = atoi(srcScore3);
bool ret = ReviseStudent(ReviseNum,destNum, srcName, srcGrader, srcClass,s1,s2,s3);
if (ret == false)
{
MessageBox(g_hwnd, L"修改失败!原因可能是如下\n1.存储数据的文件不存在\n2.存储数据的文件有损坏或非正常修改\ntip:用户请勿直接修改存储文件的文件内容\n", L"提示", MB_OK);
}
}
else
{
MessageBox(g_hwnd,L"修改失败!原因可能是如下\n1.姓名错误\n2.学号错误\n3.班级错误\n请修改。",L"提示",MB_OK);
}
}
tt1 = GetTickCount();
if (tt1 - tt2 >= 990)
{
FLUSH_DRAW();
ShowTime(g_hwnd);
tt1 = tt2 = GetTickCount();
}
Sleep(30); FLUSH_DRAW();
}
Sleep(10);
SwitchInterface(0);
}
void AboutSystemInterface()
{
page = AboutPage; DWORD t1, t2; t1 = t2 = GetTickCount();
ShowBaseButton(false);
TitleLabel.SetText(L"关 于 系 统"); TitleLabel.SetPos(305,20);
SysButton btn1, btn2, btn3;
btn2.Create(g_hwnd,200,520,150,30,L"后续版本"); btn3.Create(g_hwnd, 450, 520, 150, 30, L"使用帮助");
btn1.Create(g_hwnd,20,20,80,30,L"返回主页");
SysStatic l1, l2, l3,l4,l5,l6,l7,l8,l9,l;
l1.Create(g_hwnd,50,70,100,30,L"关于本程序");
l2.Create(g_hwnd,80,100,570,50,L"1.存储文件:此程序将会在D盘新建一个学生信息管理系统的文件夹,此文件夹下保存着用于存储本程序的数据的数据文件。");
l3.Create(g_hwnd,80,150,570,50,L"2.请勿直接的[删除]或[修改]该存储文件以及该文件内的内容,该文件为本程序本地存储空间,该文件名为:student.dat。");
l4.Create(g_hwnd,80,200,570,50,L"3.作者:似锦(SiJin),日期2023年1月13日,语言:C/C++,编译环境:Visual Studio2022,图形库:[EasyX][HiEasyX]。");
l5.Create(g_hwnd,80,250,570,30,L"4.[EasyX]与[HiEasyX]均属于开源库,感谢[EasyX]与[HiEasyX]作者。");
l6.Create(g_hwnd,80,280,570,50,L"5.为避免更多BUG的出现,请使用本程序对数据进行\"增删查改\"功能。严禁直接对存储文件进行\"增删查改\"等操作。");
l7.Create(g_hwnd,80,330,570,50,L"6.当前版本:V1.0,程序目前仅支持日常的增删查改功能,对数据来说,仅有[学号、姓名、性别、班级以及语数英三门成绩]。");
l8.Create(g_hwnd,80,380,570,50,L"7.V1.0测试版发布日期:2022.1.13,程序本体大小:171kb左右。本系统仅用于交流学习,不作为其他目的。");
l9.Create(g_hwnd,80,430,570,30,L"最后感谢EasyX和HiEasyX的作者,同时也感谢使用本程序的用户。");
l.Create(g_hwnd,80,460,570,50,L"Finally, I would like to thank the authors of EasyX and HiEasyX, as well as the users who use this program.");
while (1)
{
if (btn1.isClicked())
{
btn1.Show(0); btn2.Show(0); btn3.Show(0);
l1.Show(0); l2.Show(0); l3.Show(0); l7.Show(0);
l4.Show(0); l5.Show(0); l6.Show(0); l8.Show(0);
l9.Show(0); l.Show(0); FLUSH_DRAW(); Sleep(10); break;
}
if (btn2.isClicked())
{
MessageBox(g_hwnd,L"当前版本V1.0,暂无后续版本,敬请期待!",L"后续版本",MB_OK);
}
if (btn3.isClicked())
{
MessageBox(g_hwnd, L"学号请使用10-13位数,不要把学号设置为个位数比如说111111,222222等,姓名尽量在2-4个汉字,不推荐用英文姓名\n如在程序中出现乱码,重新返回主页并重新点击该模块即可。\n乱码原因是本程序字符集使用Unicode编码,而非多字节字符集。为此程序使用WideCharToMultiByte和MultiByteToWideChar进行字符集之间的相互转换,但难免还会有部分乱码情况。如遇乱码,返回主页后重新进入模块即可。请正常使用本程序对数据进行增删查改。如遇闪退,重新载入程序即可。", L"使用帮助", MB_OK);
}
t1 = GetTickCount();
if (t1-t2>1000)
{
FLUSH_DRAW(); ShowTime(g_hwnd);
}
Sleep(30); FLUSH_DRAW();
}
SwitchInterface(0);
}
bool AdditionStudent(Student* s)
{
List* list;;list = ReadNodeFile();
Student* nextNode; nextNode = CreateNewNode();
Student* cmp = CreateNewNode();
cmp = list->Front->next;
while (cmp!=NULL)
{
if (cmp->Number == s->Number)
return false;
cmp = cmp->next;
}
nextNode = list->Front->next;
list->Front->next = s;
list->Front->next->next = nextNode;
s->next = nextNode;
SaveData(list, "D:\\学生信息管理系统\\student.txt");
return true;
}
void AddititonStudentInterface()
{
ShowBaseButton(0); TitleLabel.SetText(L"添 加 学 生"); TitleLabel.SetPos(305, 20); FLUSH_DRAW(); SysStatic label9, label10;
SysStatic label1, label2, label3, label4, label5, label6, label7, label8; label8.Create(g_hwnd, 330, 420, 150, 30, L" 状态");
label1.Create(g_hwnd,270,100,60,30,L"学号"); label2.Create(g_hwnd, 270, 100+40, 60, 30, L"名字");
label3.Create(g_hwnd, 270, 100+80, 60, 30, L"性别"); label4.Create(g_hwnd, 270, 100 + 40+80, 60, 30, L"班级");
label5.Create(g_hwnd, 270, 100+120+40, 60, 30, L"语文"); label6.Create(g_hwnd, 270, 100 + 160+40, 60, 30, L"数学");
label7.Create(g_hwnd, 270, 100 + 160+40+40, 60, 30, L"英语"); label7.SetFont(25, 0, L"楷体");
label1.SetFont(25,0,L"楷体"); label2.SetFont(25, 0, L"楷体"); label3.SetFont(25, 0, L"楷体");
label4.SetFont(25, 0, L"楷体"); label5.SetFont(25, 0, L"楷体"); label6.SetFont(25, 0, L"楷体");
SysButton btn,btn1; btn.Create(g_hwnd, 330, 380, 150, 30, L"确定添加"); btn.SetFont(25, 0, L"新宋体"); label8.SetFont(23, 0, L"新宋体");
SysEdit t1, t2, t3, t4, t5, t6, t7; wstring w1, w2, w3, w4, w5, w6, w7;
{
t1.Create(g_hwnd, 270 + 60, 100 - 1, 200, 30, L""); t1.SetMaxTextLength(18);
t2.Create(g_hwnd, 270 + 60, 100 +40 - 1, 200, 30, L""); t2.SetMaxTextLength(4);
t3.Create(g_hwnd, 270 + 60, 100 + 80 - 1, 200, 30, L""); t3.SetMaxTextLength(1);
t4.Create(g_hwnd, 270 + 60, 100 + 120 - 1, 200, 30, L""); t4.SetMaxTextLength(12);
t5.Create(g_hwnd, 270 + 60, 100 + 160 - 1, 200, 30, L""); t5.SetMaxTextLength(3);
t6.Create(g_hwnd, 270 + 60, 100 + 200 - 1, 200, 30, L""); t6.SetMaxTextLength(3);
t7.Create(g_hwnd, 270 + 60, 100 + 240 - 1, 200, 30, L""); t7.SetMaxTextLength(3);
}
t1.NumberOnly(1); t5.NumberOnly(1); t6.NumberOnly(1); t7.NumberOnly(1); FLUSH_DRAW();
label9.Create(g_hwnd, 100, 400 + 50, 700, 30, L"学号 名字 性别 班级 语文 数学 英语");
label10.Create(g_hwnd, 100, 510 - 30, 700, 30, L""); DWORD tt1, tt2; tt1 = tt2 = GetTickCount();
btn1.Create(g_hwnd, 20, 20, 80, 30, L"返回主页");
while (1)
{
if (btn.isClicked()==true)
{
btn.SetText(L"继续添加");
int y1 = t1.GetTextLength(); int y2 = t2.GetTextLength(); int y3 = t3.GetTextLength();
int y4 = t4.GetTextLength(); int y5 = t5.GetTextLength(); int y6 = t6.GetTextLength(); int y7 = t7.GetTextLength();
if ((y1 <= 4) || (y2 == 0) || (y3 == 0) || (y4 == 0) || (y5 == 0) || (y6 == 0) || (y7 == 0))
{
label10.SetText(L"添加失败! 请把学生信息填写完整。"); continue;
}
char* s1; char* s2; char* s3; char* s4; char* s5; char* s6; char* s7;
w1 = t1.GetText();
w2 = t2.GetText();
w3 = t3.GetText();
w7 = t7.GetText();
w4 = t4.GetText();
w5 = t5.GetText();
w6 = t6.GetText();
s7 = WstringConvertString(w7);
s1 = WstringConvertString(w1);
s2 = WstringConvertString(w2);
s3 = WstringConvertString(w3);
s4 = WstringConvertString(w4);
s5 = WstringConvertString(w5);
s6 = WstringConvertString(w6);
wstring view; char v[100]; sprintf(v, "%s %s %s %s %s %s %s", s1, s2, s3, s4, s5, s6, s7);
view = StringConvertWstring(v); label10.SetText(view);
Student* newNode = CreateNewNode(); long long newnum = atoll(s1);
newNode->Number = newnum; strcpy(newNode->Name, s2); strcpy(newNode->Grader, s3); strcpy(newNode->Class, s4);
newNode->score1 = atoi(s5); newNode->score2 =atoi(s6); newNode->score3 = atoi(s7);
printf("添加:%lld %s %s %s %d %d %d\n",newNode->Number,newNode->Name,newNode->Grader,newNode->Class,newNode->score1,newNode->score2,newNode->score3);
bool a = AdditionStudent(newNode);
if (a==false)
{
label10.SetText(L"添加失败! 原因可能是如下:学生学号、名字、班级错误以及重复等。");
}
free(newNode); newNode = NULL;
}
if (btn1.isClicked() == true)
{
label1.Show(0); label2.Show(0); label3.Show(0); label4.Show(0); label5.Show(0);
label6.Show(0); label7.Show(0); label8.Show(0); label9.Show(0);label10.Show(0);
btn1.Show(0); btn.Show(0); t1.Show(0); t2.Show(0); t3.Show(0);
t4.Show(0); t5.Show(0); t6.Show(0); t7.Show(0);
FLUSH_DRAW(); Sleep(10); break;
}
tt1 = GetTickCount();
if (tt1 - tt2 >= 990)
{
FLUSH_DRAW();
ShowTime(g_hwnd);
tt1 = tt2 = GetTickCount();
}
Sleep(30); FLUSH_DRAW();
}
Sleep(10); SwitchInterface(0);
}
List* ReadNodeFile()
{
Student* headNode = (Student*)malloc( sizeof(Student));
List* list = (List*)malloc(sizeof(List));
list->Front = headNode;
list->Tail = headNode;
FILE* fp;
fp = fopen("D:\\学生信息管理系统\\student.txt", "r");
if (fp == NULL)
{
CreateDirectory(L"D:\\学生信息管理系统",0);
fp = fopen("D:\\学生信息管理系统\\student.txt", "w");
}
Student* newNode;
while (!feof(fp))
{
newNode = CreateNewNode();
int ret = fscanf(fp, "%lld %s %s %s %d %d %d\n", &newNode->Number,
newNode->Name, newNode->Grader, newNode->Class,
&newNode->score1, &newNode->score2, &newNode->score3);
if (ret ==EOF)
{
break;
}
list->Tail->next = newNode;
list->Tail = newNode;
}
fclose(fp);
return list;
}
void GetTime()
{
SYSTEMTIME time;
GetLocalTime(&time);
sprintf(Time.TimeAggregate, "%d年%d月%d日%d时%d分%d秒\n", time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond);
}
void ShowTime(HWND hWnd)
{
GetTime();
wstring CurrentTime;
CurrentTime = StringConvertWstring(Time.TimeAggregate);
ShowTimeControl.SetText(CurrentTime);
}
wstring StringConvertWstring(char str[])
{
int Len = MultiByteToWideChar(CP_ACP, 0, str, strlen(str), 0, NULL);
wchar_t* buf = new wchar_t[Len+1];
memset(buf, 0, Len);
MultiByteToWideChar(CP_ACP, 0, str, strlen(str), buf, (Len));
buf[Len]='\0'; return buf;
}
void CreateGraphicsWindow()
{
SetCustomIcon(MAKEINTRESOURCE(IDI_ICON1), MAKEINTRESOURCE(IDI_ICON1));
Window wnd;
PreSetWindowPos(550, 180);
HWND hWnd = wnd.Create(780, 600, EW_NORMAL , L"学生信息管理系统");
g_hwnd = hWnd;
SetWindowStyle(hWnd);
}
void MainInterface()
{
page = MainPage;
ShowTimeControl.Create(g_hwnd, 500, 580, 300, 13, L"");
ShowTimeControl.SetFont(15, 0, L"黑体");
TitleLabel.Create(g_hwnd, 225, 50, 400, 40, L"学生信息管理系统");
TitleLabel.SetFont(35, 0, L"楷体"); TitleLabel.SetPos(225, 50);
InitButton(g_hwnd);
TitleLabel.SetText(L"学生信息管理系统");
ShowTime(g_hwnd);
DWORD t1, t2;
t1 = t2 = GetTickCount();
int Select = 0;
List* list = ReadNodeFile();
while (1)
{
Select = RetrieveMouse();
if (Select > 0)
{
SwitchInterface(Select);
}
t1 = GetTickCount();
if (t1 - t2 >= 990)
{
FLUSH_DRAW();
ShowTime(g_hwnd);
t1 = t2 = GetTickCount();
}
Sleep(30); FLUSH_DRAW();
}
system("pause");
}