概述
语言要求
C语言,并用EasyX
设计界面
程序功能
教务管理系统,管理员、教师、学生统一登录界面,登录后展现各自的功能块。
- 管理员
显示教师信息,添加教师信息,删除教师信息,修改教师信息,查询教师信息,重置密码 - 教师
显示学生信息,添加学生信息,删除学生信息,修改学生信息,查询学生信息,查看个人信息,重置密码 - 学生
查询个人信息,重置密码
程序最终效果展示
- 管理员操作
- 教师操作
- 学生操作
设计思想
说实话这个要求很奇葩,用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;
}
源码下载
链接:源码下载链接
提取码:1234
最后
以上就是追寻冥王星为你收集整理的C语言+EasyX实现信息管理系统源码下载的全部内容,希望文章能够帮你解决C语言+EasyX实现信息管理系统源码下载所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复