C语言+EasyX实现信息管理系统

语言要求

C语言,并用EasyX设计界面

程序功能

教务管理系统,管理员、教师、学生统一登录界面,登录后展现各自的功能块。

  • 管理员
    显示教师信息,添加教师信息,删除教师信息,修改教师信息,查询教师信息,重置密码
  • 教师
    显示学生信息,添加学生信息,删除学生信息,修改学生信息,查询学生信息,查看个人信息,重置密码
  • 学生
    查询个人信息,重置密码

程序最终效果展示

  • 管理员操作
    管理员操作.gif
  • 教师操作
    教师操作.gif
  • 学生操作
    学生操作操作.gif

设计思想

说实话这个要求很奇葩,用C语言实现,但却需要设计界面,而且界面要求是用EasyX,一个将Turbo C时代的图形库提供的函数重新用Windows API包装一遍的库,主要方便学生用C语言练习图形界面设计,但这完全不适合拿来做按钮、列表框这些东西啊。为此我只好将EasyX继续做一层简单的封装,实现一个叫Box的概念,Box就是一个矩形区域,它有底色,有边框,有文字,有文字的对齐、密码属性等等,再在Box的基础上实现按钮、封装一个鼠标事件去管理Box列表,获取被命中的Box,将Box用列表管理起来实现列表控件,折腾半天终于做了一个简陋的EasyX二次封装函数库。然后再用二次封装库实现程序要求的功能。

EasyX二次封装的部分代码

//屏幕宽度(像素)
#define SCREEN_WIDTH 1024
//屏幕高度(像素)
#define SCREEN_HEIGHT 768
//每个Box最多能容纳的文字数
#define CONTENT_MAX 1024
//背景色
#define BACKGROUND_COLOR RGB(255, 255, 255)
//字体宽度(像素)
#define FONT_WIDTH 16
//字体高度(像素)
#define FONT_HEIGHT 16

//Box的文字对齐方式
enum ALIGN_TEXT {
    ALIGN_LEFT,     //左对齐
    ALIGN_CENTER,   //居中对齐
};

//Box的定义(Box就是一个矩形框,有坐标,有宽高,有边框,背景色,文字内容等属性)
typedef struct _tBox {
    int flag;       //该Bbox的标识,当Box被鼠标点击后,可通过这个标识知晓将执行什么行为
    int x;          //Box的x坐标
    int y;          //Box的y坐标
    int width;      //Box的宽度
    int height;     //Box的高度
    int align;      //Box内文字的对齐方式
    COLORREF line;  //边框线的颜色
    COLORREF fill;  //填充的颜色
    COLORREF text;  //文字的颜色
    int password;   //是否将文字显示成"******",可用来将Box当成密码框
    wchar_t content[CONTENT_MAX]; //文字内容
} Box, * pBox;

//Box集合数组
typedef struct _tBoxList {
    pBox* box;      //Box集合数组内容
    int len;        //集合中Box的数量
    int capacity;   //集合数组的容量
} BoxList, * pBoxList;

//数据单元项
typedef struct _tDItem {
    wchar_t content[CONTENT_MAX];   //数据单元项的内容
    int align;                      //数据单元项的对齐方式
} DItem, * pDItem;

//数据行项(一行显示的若干个数据单元项是一个数据行项)
typedef struct _tDLine {
    pDItem data;    //行中的数据单元项
    int len;        //行的数据单元项数量
    int capacity;   //行数组容量
} Dline, * pDline;

//数据标题项
typedef struct _tDTitle {
    pDItem data;        //标题项中的数据单元项
    int* width;         //每个单元项中对应的单元项宽度
    int len;            //标题项中的数据单元项数量
    int capacity;       //数据标题项数组容量
} DTitle, * pDTitle;

//数据表
typedef struct _tDetailList {
    DTitle title;   //表头标题项
    pDline* data;   //数据行项
    int len;        //表行数
} DList, * pDList;

/* 数据表结构定义(作者小企鹅:1561968262)
*               DetailList
* -----------------------------------------
* | DItem | DItem | DItem | DItem | DItem |   <-- DTitle
* -----------------------------------------
* | DItem | DItem | DItem | DItem | DItem |   <-- DLine
* -----------------------------------------
* | DItem | DItem | DItem | DItem | DItem |   <-- DLine
* -----------------------------------------
* | DItem | DItem | DItem | DItem | DItem |   <-- DLine
* -----------------------------------------
* | DItem | DItem | DItem | DItem | DItem |   <-- DLine
* -----------------------------------------
*/

//清屏
void clearScreen() {
    setfillcolor(BACKGROUND_COLOR);
    fillrectangle(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
}

//创建Box集合数组
pBoxList createBoxList(int capacity) {
    pBoxList list = (pBoxList)malloc(sizeof(BoxList));
    memset(list, 0, sizeof(BoxList));
    list->capacity = capacity;
    list->box = (pBox*)malloc(sizeof(list->box[0]) * capacity);
    return list;
}

//销毁Box集合数组
void destroyBoxList(pBoxList list) {
    int index;
    for (index = 0; index < list->len; ++index) {
        free(list->box[index]);
    }
    free(list);
}

//将Box添加到Box集合数组
void addBox(pBoxList list, pBox box) {
    if (list->len < list->capacity) {
        list->box[list->len++] = box;
    }
}

//创建Box
pBox createBox(int flag, int x, int y, int width, int height, int align, COLORREF line, COLORREF fill, COLORREF text, int password, const wchar_t content[]) {
    pBox box = (pBox)malloc(sizeof(Box));
    box->flag = flag;
    box->x = x;
    box->y = y;
    box->width = width;
    box->height = height;
    box->align = align;
    box->line = line;
    box->fill = fill;
    box->text = text;
    box->password = password;
    lstrcpy(box->content, content);
    return box;
}

//绘制Box
void drawBox(pBox box) {
    int right = box->x + box->width;
    int bottom = box->y + box->height;
    int tw = lstrlen(box->content) * FONT_WIDTH;
    const wchar_t* pstr = box->content;
    wchar_t password[CONTENT_MAX] = { 0 };
    setbkmode(TRANSPARENT);
    setlinecolor(box->line);
    setfillcolor(box->fill);
    settextcolor(box->text);
    fillrectangle(box->x, box->y, right, bottom);
    rectangle(box->x, box->y, right, bottom);
    if (box->password) {
        int len = lstrlen(box->content);
        int index;;
        for (index = 0; index < len; ++index) {
            lstrcat(password, L"*");
        }
        pstr = password;
    }
    switch (box->align) {
    case ALIGN_LEFT:
        outtextxy(box->x + 10, box->y + (box->height - FONT_HEIGHT) / 2, pstr);
        break;
    case ALIGN_CENTER:
        outtextxy(box->x + (box->width - tw) / 2, box->y + (box->height - FONT_HEIGHT) / 2, pstr);
        break;
    }
}

//绘制Box集合数组
void drawBoxList(pBoxList list) {
    int index;
    for (index = 0; index < list->len; ++index) {
        drawBox(list->box[index]);
    }
}

//通过flag查找Box
pBox findBox(pBoxList list, int flag) {
    int index;
    pBox box = NULL;
    for (index = 0; index < list->len; ++index) {
        box = list->box[index];
        if (box->flag == flag) {
            return box;
        }
    }
    return box;
}

//从Box集合数组中获取鼠标命中的Box
pBox hitBox(pBoxList list, MOUSEMSG* msg) {
    int index;
    pBox box = NULL;
    for (index = list->len - 1; index >= 0; --index) {
        box = list->box[index];
        if (msg->x >= box->x && msg->x <= box->x + box->width) {
            if (msg->y >= box->y && msg->y <= box->y + box->height) {
                return box;
            }
        }
    }
    return box;
}

//绘制数据表
void drawDetail(int x, int y, int w, int h, pDList list) {
    pBoxList boxlist = createBoxList(list->len * list->title.len + 10);
    pBox box = NULL;
    int index;
    int offsetx = x;
    int offsety = y;
    int interval = 6;
    int height = 30;
    box = createBox(0, x, y, w, h, ALIGN_CENTER, 0xFFFFFF, 0xFFFFFF, RGB(255, 0, 255), 0, L"");
    addBox(boxlist, box);
    for (index = 0; index < list->title.len; ++index) {
        pDItem item = &list->title.data[index];
        int width = list->title.width[index];
        box = createBox(0, offsetx, offsety, width, height, item->align, 0x808080, RGB(0, 255, 0), 0x000000, 0, item->content);
        addBox(boxlist, box);
        offsetx += width + interval;
    }
    offsetx = x;
    offsety += height + interval;
    for (index = 0; index < list->len; ++index) {
        int position;
        pDline line = list->data[index];
        for (position = 0; position < line->len; ++position) {
            pDItem item = &line->data[position];
            int width = list->title.width[position];
            box = createBox(0, offsetx, offsety, width, height, item->align, 0x808080, 0xFFFFFF, 0x000000, 0, item->content);
            addBox(boxlist, box);
            offsetx += width + interval;
        }
        offsetx = x;
        offsety += height + interval;
    }
    drawBoxList(boxlist);
}

//创建数据表
pDList createDList(int row, int col) {
    pDList list = (pDList)malloc(sizeof(DList));
    memset(list, 0, sizeof(DList));
    list->title.capacity = col;
    list->title.data = (pDItem)malloc(sizeof(list->title.data[0]) * col);
    list->title.width = (int*)malloc(sizeof(list->title.width[0]) * col);
    list->data = (pDline*)malloc(sizeof(list->data[0]) * row);
    return list;
}

//销毁数据表
void destroyDList(pDList list) {
    int index;
    for (index = 0; index < list->len; ++index) {
        pDline line = list->data[index];
        free(line->data);
        free(line);
    }
    free(list->data);
    free(list->title.data);
    free(list->title.width);
    free(list);
}

//在数据表中添加标题栏项
void addDTitle(pDList list, const wchar_t text[], int width, int align) {
    pDTitle title = &list->title;
    title->width[title->len] = width;
    title->data[title->len].align = align;
    lstrcpy(title->data[title->len].content, text);
    title->len++;
}

//数据表中添加数据元素
void addDItem(pDline line, const wchar_t text[], int align) {
    pDItem item = &line->data[line->len++];
    lstrcpy(item->content, text);
    item->align = align;
}

//创建数据行项
pDline createDline(int capacity) {
    pDline line = (pDline)malloc(sizeof(Dline));
    memset(line, 0, sizeof(Dline));
    line->capacity = capacity;
    line->data = (pDItem)malloc(sizeof(line->data[0]) * capacity);
    return line;
}

//在数据行项中添加数据单元项
void addDLine(pDList list, pDline line) {
    list->data[list->len++] = line;
}

源码联系UP主 -> https://space.bilibili.com/329101171

  • 12
    点赞
  • 115
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
餐饮管理系统是用C语言EasyX和MFC开发的一款软件。它主要用于餐饮企业进行订单管理、库存管理、财务管理和人事管理等各项业务的管理工作。 首先,餐饮管理系统可以实现订单管理功能。通过系统,餐饮企业可以方便地记录客户的订单信息,包括订单编号、下单时间、商品种类和数量等。同时,系统还可以自动计算订单的总金额,并生成相应的发票,方便企业进行财务结算。 其次,餐饮管理系统还可以进行库存管理。系统可以记录每一种商品的库存数量,并根据销售情况进行动态调整。一旦库存不足,系统会自动生成补货提醒,以便及时补充商品,保证供应链的畅通。 此外,餐饮管理系统还拥有财务管理功能。它可以自动生成各类财务报表,如销售额报表、成本报表和利润报表等,为企业提供全面的财务数据分析。同时,系统还可以进行财务流水账的记账工作,方便企业进行日常的财务管理。 最后,餐饮管理系统还可以进行人事管理。系统可以记录员工的基本信息、考勤情况和薪资结算等。通过系统,企业可以方便地进行员工的薪资发放和考勤统计管理,提高人力资源的利用效率。 总之,餐饮管理系统利用C语言EasyX和MFC开发,具备订单管理、库存管理、财务管理和人事管理等多项功能。它可以帮助餐饮企业提高运营效率,降低成本,实现科学管理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值