C/C++ 学生信息管理系统 (图形界面版)

    • 程序主体设计

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

程序主体设计示意图

程序登录界面截图:

学生信息管理系统登录界面

程序主界面截图:

学生信息管理系统主界面

    • 各模块简介

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");
}

/--------------------------------------------------------------------------/

  • 13
    点赞
  • 147
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
学生管理系统c是一个拥有图形界面的学生管理系统,该系统旨在帮助学校或教育机构方便地管理学生信息和课程安排。 首先,学生管理系统c的图形界面使得用户操作更加直观和便捷。通过鼠标点击和界面按钮,用户可以快速地进入不同的功能模块,如学生信息管理、课程管理、成绩管理等。用户界面的设计考虑了人机交互的原则,使得使用该系统的过程更加流畅和易于理解。 其次,通过学生管理系统c的图形界面,用户可以方便地进行学生信息的录入和修改。系统提供了一个表格形式的数据录入界面,用户只需在相应的输入框中填写学生的姓名、年龄、性别、学号等信息,系统就会自动将这些信息保存在数据库中。对于已经存在的学生信息,用户也可以通过搜索功能进行查询和修改。 此外,学生管理系统c的图形界面还提供了学生课程管理的功能。用户可以在界面上选择相应的学生,然后录入或修改他们的课程安排。系统会自动记录学生所选的课程,并在课程表上进行显示。这样,学生和教职员工可以通过该系统方便地查看课程安排和调整。 最后,学生管理系统c的图形界面还提供了成绩管理的功能。用户可以在系统内录入学生的成绩,并可以根据学科、班级等条件进行统计和排名。系统会自动生成成绩单,并可以打印出来供学校和家长参考。 综上所述,学生管理系统c的图形界面使得学生信息管理和课程管理更加便捷和高效。用户通过图形化的界面进行操作,无需编写复杂的代码,减少了学校工作人员的负担,提高了工作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值