[C语言课程项目设计] EGE图形化界面设计的使用举例

在本专栏里已经有EGE的简易版使用教程,可以说是有手就行【狗头】

所以这篇我主要贴一些代码来举例

---------------------------------------------------------------------------------------------------------------

注意:1.不同的功能应该放在不同的源文件中,课设项目要求的是多文件结构

           2.一个源文件对应一个头文件(头文件一般是声明函数和定义结构体的)

           3.所有的源文件和头文件都要添加在项目里面

如图所示:

1.进入系统时,我们可以先设置一个登录功能:

新建一个源文件叫做login.cpp,新建一个头文件叫login.h

头文件里写的是对应cpp文件里会用到的函数的声明,比如这里我们只用写“void login();”

这里的函数也可以是其他源文件的函数哟

#include <graphics.h>
#include "enterSystem.h"
void login() {
	initgraph(1000, 625);		//创建窗口
	PIMAGE src1;
	src1 = newimage();
	getimage(src1, "4.jpg");
	putimage(0, 0, src1);
	setfont(26, 0, "宋体");
	setbkmode(TRANSPARENT);
	setcolor(BLACK);
	char input[10];
	for(; is_run(); delay_fps(60)) {	//is_run()判断窗口是否存在,delay_fps(60) 作用是稳定帧率并刷新窗口 ,一秒钟循环60次
		mouse_msg msg = {0};	//定义鼠标变量并且初始化
		while(mousemsg()) {  //利用mousemsg()判断有没有鼠标消息
			msg = getmouse();
		} //获得鼠标消息
		if((msg.x > 142 && msg.x < 391) && (msg.y > 414 && msg.y < 499) && msg.is_left() && msg.is_down()) {

			//登录系统
			int num = 0;
			inputbox_getline("输入", "请输入管理员账号", input, 20);
			while(strcmp("zhangsan", input) != 0) {
				if(num > 3) {
					xyprintf(100, 142, "警告!多次输入错误,即将退出系统...");
					delay_ms(3000);
					delimage(src1);
					src1 = NULL;
					closegraph();
					exit(1);
				}
				inputbox_getline("输入", "请重新输入管理员账号", input, 20);
				num++;
			}
			num = 0;
			inputbox_getline("输入", "请输入账号密码", input, 10);
			while(strcmp("123456", input) != 0) {
				if(num > 3) {
					xyprintf(100, 142, "警告!多次输入错误,即将退出系统...");
					delay_ms(3000);
					delimage(src1);
					src1 = NULL;
					closegraph();
					exit(1);
				}
				inputbox_getline("输入", "请重新输入账号密码", input, 10);
				num++;
			}
			enterSystem();
		} else if((msg.x > 587 && msg.x < 823) && (msg.y > 417 && msg.y < 499) && msg.is_left() && msg.is_down()) {

			//退出整个系统
			delimage(src1);//销毁图像,防止内存泄露
			src1 = NULL;
			closegraph();
			exit(1);
		}
	}
	delimage(src1);//销毁图像,防止内存泄露
	src1 = NULL;
}

2.进入系统

新建一个源文件叫做enterSystem.cpp,新建一个头文件叫enterSystem.h

#include <graphics.h>
#include "mainMenu.h"
void enterSystem() {
	cleardevice();
	PIMAGE src1;		
	src1 = newimage();
	getimage(src1, "1.jpg");
	putimage(0, 0, src1);
	for(; is_run(); delay_fps(60)) {	//is_run()判断窗口是否存在,delay_fps(60) 作用是稳定帧率并刷新窗口 ,一秒钟循环60次
		mouse_msg msg = {0};	//定义鼠标变量并且初始化
		while(mousemsg()) {  //利用mousemsg()判断有没有鼠标消息
			msg = getmouse();
		} //获得鼠标消息
		if((msg.x > 112 && msg.x < 366) && (msg.y > 442 && msg.y < 550) && msg.is_left()&&msg.is_down()) {
			//开始使用
			delimage(src1);//销毁图像,防止内存泄露
			src1 = NULL;
			mainMenu();
		} else if((msg.x > 636 && msg.x < 873) && (msg.y > 451 && msg.y < 555) && msg.is_left()&&msg.is_down()) {
			//退出整个系统
			delimage(src1);//销毁图像,防止内存泄露
			src1 = NULL;
			closegraph();
			exit(1);
		}
	}
}

3.主界面的设计

#include "informationManagement.h"
#include "titleManagement.h"
#include "research.h"
#include <graphics.h>
void mainMenu() { //主界面
	cleardevice();
	PIMAGE src2;
	src2 = newimage();
	getimage(src2,"2.jpg"); // getimage(pimg, "图片文件名(带扩展名)");
	putimage(0,0,src2);
	for(; is_run(); delay_fps(60)) {	//is_run()判断窗口是否存在,delay_fps(60) 作用是稳定帧率并刷新窗口 ,一秒钟循环60次
		mouse_msg msg;//定义鼠标变量并且初始化
		while(mousemsg()) {  //利用mousemsg()判断有没有鼠标消息
			msg = getmouse();
		} //获得鼠标消息
		if((msg.x>326&&msg.x<661)&&(msg.y>55&&msg.y<115)&&msg.is_left()&&msg.is_down()) {
			//课程信息管理
			informationManage();
		}
		else if((msg.x>327&&msg.x<661)&&(msg.y>181&&msg.y<243)&&msg.is_left()&&msg.is_down()) {
			//题目管理
			titleManage();
		} else if((msg.x>328&&msg.x<664)&&(msg.y>229&&msg.y<363)&&msg.is_left()&&msg.is_down()) {
			//查询
			research();
		} else if((msg.x>327&&msg.x<664)&&(msg.y>414&&msg.y<479)&&msg.is_left()&&msg.is_down()) {
			//退出整个系统
			delimage(src2);
			src2 = NULL;
			closegraph();
			exit(1);
		}
	}
	delimage(src2);
	src2 = NULL;
}

4.一些功能的举例

例如,题目修改功能:代码如下

#include <graphics.h>
#include <stdio.h>
#include "titleManagement.h"
#include "mainMenu.h"
#include <stdlib.h>
#include "structData.h"
void titleManage() {
	cleardevice();			//清屏
	PIMAGE src1 = newimage();
	PIMAGE src2 = newimage();
	getimage(src1,"9.jpg");
	getimage(src2,"10.jpg");
	putimage(0,0,src1);
	setfont(28, 0, "宋体");
	setbkmode(TRANSPARENT);
	setcolor(WHITE);
	FILE* fp = fopen("list2.txt", "rb");
	if(NULL == fp) {
		xyprintf(0, 0, "数据获取失败!即将退出系统...");
		delay(3000);
		exit(0);
	}
	fclose(fp);
	fp = NULL;
	for(; is_run(); delay_fps(60)) {	//is_run()判断窗口是否存在,delay_fps(60) 作用是稳定帧率并刷新窗口 ,一秒钟循环60次
		mouse_msg msg = {0};
		while(mousemsg()) {  //利用mousemsg()判断有没有鼠标消息
			msg = getmouse();
		} //获得鼠标消息
		if((msg.x > 365 && msg.x < 637) && (msg.y > 68 && msg.y < 140) && msg.is_left()&&msg.is_down()) {
			//添加题目
			cleardevice();
			putimage(0,0,src2);//设置背景
			setfont(30, 0, "宋体");
			setbkmode(TRANSPARENT);
			setcolor(WHITE);
			addCourse();
			mainMenu();
		} else if((msg.x > 365 && msg.x < 637) && (msg.y > 357 && msg.y < 438) && msg.is_left()&&msg.is_down()) {
			//删除题目
			cleardevice();
			putimage(0,0,src2);//设置背景
			setfont(30, 0, "宋体");
			setbkmode(TRANSPARENT);
			setcolor(BLACK);
			deleteCourse();
			mainMenu();
		} else if((msg.x > 365 && msg.x < 637) && (msg.y > 208 && msg.y < 281) && msg.is_left()&&msg.is_down()) {
			//修改题目
			cleardevice();
			putimage(0,0,src2);//设置背景
			setfont(30, 0, "宋体");
			setbkmode(TRANSPARENT);
			setcolor(WHITE);
			reviseInformation();
			mainMenu();
		} else if((msg.x > 422 && msg.x < 553) && (msg.y > 474 && msg.y < 530) && msg.is_left()&&msg.is_down()) {
			mainMenu();
		}
	}
	delimage(src1);
	delimage(src2);
	src1 = src2 = NULL;
}
void addendNode(struct Node** root, struct Course* pData) { //添加一个节点到指针末尾
	if(root == NULL)
		return;
	if(*root == NULL) { //传进来一个空列表
		*root = createNode(pData);
		return;
	}
	struct Node* pTemp = *root;
	//让pTemp指向链表的最后一个节点
	while(pTemp -> pNext) pTemp = pTemp -> pNext;
	pTemp -> pNext = createNode(pData);//把新节点添加到pTemp后面
}

struct Node* createNode(struct Course* pData) {
	struct Node* pNew = (struct Node*) malloc(sizeof(struct Node)); //申请内存 
	if(NULL == pNew) {
		return NULL;
	}
	pNew -> pNext = NULL;
	strcpy(pNew -> data.title, pData -> title);
	strcpy(pNew -> data.tName, pData -> tName);
	strcpy(pNew -> data.sName, pData -> sName);
	strcpy(pNew -> data.need, pData -> need);
	return pNew;
}
void addCourse() {
	char input1[30], input2[10], input3[400];
	//1 打开文件
	FILE* fp = fopen("list2.txt", "rb");
	//2 读取问文件内容并存到容器中
	struct Node* pList = NULL;
	int r;
	struct Course temp;
	while(1) {
		r = fread(&temp, 1, sizeof(struct Course), fp); //temp表示存放输入数据的首地址
		if(r <= 0) { //没读到
			break;
		} else {
			//读到学生信息
			//创建一个链表节点并添加到链表中
			addendNode(&pList, &temp);
		}
	}
	//3 关闭文件
	fclose(fp);
	fp = NULL;
	inputbox_getline("输入", "请输入要添加的题目",input1, 30);
	inputbox_getline("输入", "请输入要添加的老师名字",input2, 10);
	inputbox_getline("输入", "请输入要添加的要求",input3, 400);
	strcpy(temp.need, input3);
	strcpy(temp.title, input1);
	strcpy(temp.tName, input2);
	strcpy(temp.sName, "暂无");
	addendNode(&pList, &temp);
	fp = fopen("list2.txt", "wb");
	struct Node* pTemp = pList;
	//写入数据
	while(pTemp) {
		fwrite(&(pTemp -> data), 1,  sizeof(struct Course), fp);
		pTemp = pTemp -> pNext;
	}
	fclose(fp);
	pTemp = NULL;
	struct Node* pDel = pList;
	while(pList -> pNext) {
		pList = pDel -> pNext;
		free(pDel);//释放内存
		pDel = NULL;
		pDel = pList;
	}
	free(pList);
	pList = pDel = NULL;
	xyprintf(0, 0, "添加成功, 正在返回...");
	delay_ms(3000);
	return;
}
void deleteCourse() {
	FILE* fp = fopen("list2.txt", "rb");
	struct Node* pList = NULL;
	int r;
	struct Course temp;
	while(1) {
		r = fread(&temp, 1, sizeof(struct Course), fp); //temp表示存放输入数据的首地址
		if(r <= 0) { //没读到
			break;
		} else {
			//读到学生信息
			//创建链一个表节点并添加到链表中
			addendNode(&pList, &temp);
		}
	}
	fclose(fp);
	fp = NULL;
	char input[40];
	struct Node* pDel, *pDelPret;
	int flag = 0;
	pDel = pDelPret = pList;
	inputbox_getline("输入", "请输入要删除的题目",input, 40);
	while(pDel) {
		if(strcmp(pList -> data.title, input) == 0) {
			pList = pList -> pNext;
			flag = 1;
			break;
		}
		if(strcmp(pDel -> data.title, input) == 0) {
			if(pDel -> pNext != NULL) {
				pDelPret -> pNext = pDel -> pNext;
			} else {
				pDelPret -> pNext = NULL;
			}
			flag = 1;
			break;
		}
		pDelPret = pDel;
		pDel = pDel -> pNext;
	}
	pDel = NULL;
	if(flag != 1) {
		pDel = pList;
		while(pList -> pNext) {
			pList = pDel -> pNext;
			free(pDel);//释放内存
			pDel = NULL;
			pDel = pList;
		}
		free(pList);
		pList = pDel = NULL;
		xyprintf(0, 0, "该题目不存在!即将返回...");
		delay_ms(3000);
		return;
	}
	//1 打开文件
	fp = fopen("list2.txt", "wb");
	struct Node* pTemp = pList;
	//写入数据
	while(pTemp) {
		fwrite(&(pTemp -> data), 1,  sizeof(struct Course), fp);
		pTemp = pTemp -> pNext;
	}
	fclose(fp);
	pTemp = NULL;
	pDel = pList;
	while(pList -> pNext) {
		pList = pDel -> pNext;
		free(pDel);//释放内存
		pDel = NULL;
		pDel = pList;
	}
	free(pList);
	pList = pDel = NULL;
	outtextxy(229, 513, "删除成功, 正在返回...");
	delay_ms(3000);
	return;
}
void reviseInformation() {
	char input[30];
	FILE* fp = fopen("list2.txt", "rb");
	struct Node* pList = NULL;
	int r;
	struct Course temp;
	while(1) {
		r = fread(&temp, 1, sizeof(struct Course), fp); //temp表示存放输入数据的首地址
		if(r <= 0) { //没读到
			break;
		} else {
			//读到学生信息
			//创建链一个表节点并添加到链表中
			addendNode(&pList, &temp);
		}
	}
	fclose(fp);
	fp = NULL;
	struct Node* pRevise = pList;
	int flag = 0;
	inputbox_getline("输入", "请输入要修改的题目",input, 30);
	while(pRevise) {
		if(strcmp(pRevise -> data.title, input) == 0) {
			flag = 1;
			break;
		}
		pRevise = pRevise -> pNext;
	}
	if(flag != 1) {
		struct Node* pDel = pList;
		while(pList -> pNext) {
			pList = pDel -> pNext;
			free(pDel);//释放内存
			pDel = NULL;
			pDel = pList;
		}
		free(pList);
		pList = pDel = pRevise = NULL;
		xyprintf(0, 0, "未找到相关题目!即将返回...");
		delay_ms(3000);
		return;
	}
	inputbox_getline("输入", "请输入修改后题目",input, 30);
	strcpy(pRevise -> data.title, input);
	pRevise = NULL;
	//1 打开文件
	fp = fopen("list2.txt", "wb");
	struct Node* pTemp = pList;
	//写入数据
	while(pTemp) {
		fwrite(&(pTemp -> data), 1,  sizeof(struct Course), fp);
		pTemp = pTemp -> pNext;
	}
	fclose(fp);
	//删除链表
	struct Node* pDel = pList;
	while(pList -> pNext) {
		pList = pDel -> pNext;
		free(pDel);//释放内存
		pDel = NULL;
		pDel = pList;
	}
	free(pList);
	pList = pDel = NULL;
	outtextxy(0, 0, "修改成功, 正在返回...");
	delay_ms(3000);
	return;
}

----------------------------------------------------------------------------------------------------------

本篇博客介绍到这里,886

ps:想要源码的小伙伴们还请一键三连哟~

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值