C++——EGE——通讯录

一、简介

1、基础功能:增、查、删、改

2、界面的交互功能:鼠标和按钮的交互,按钮的点击效果,界面切换动态效果

3、以文档格式储存

对EGE中,窗口delay_fps()帧率刷新理解有一定提升。控制了重画界面的时机和次数,减小损耗;通过对redraw的不同赋值,实现界面内不同子界面的变化。

二、界面相关代码

头文件interface.h

#pragma once
#include<iostream>
using namespace std;
//控制台开关
#define SHOW_CONSOLE
#include<graphics.h>
#include<ege/sys_edit.h>
#include"addresslist.h"

constexpr auto Windx = 600;
constexpr auto Windy = 400;
constexpr auto Windw = 800;
constexpr auto Windh = 600;
constexpr auto Caption = "通讯录";
constexpr auto MaxSizeNameofButton = 24;
//声明按钮类
class Button {
public:
	int b_x;
	int b_y;
	int b_w;
	int b_h;
	char b_name[MaxSizeNameofButton];
	int b_mouse_in_flag = 0;
	int b_down_flag = 0;
	Button() {}
	Button(int x, int y, int w, int h, const char* buttonname);
	void operator=(const Button& b);
	void draw_button();
	int mouse_in(mouse_msg& mouse);
	int mouse_down(mouse_msg& mouse);
	bool mouse_click(mouse_msg& mouse);
};
//初始化主按钮
void init_mainbutton(Button* main_button, int n);

//画界面,以函数指针为参数,返回值0-5分别代表主界面和4个分界面
int draw_interface(int(*Interface)());
//主界面
int main_interface();
//添加界面
int add_interface();
//搜索界面
int search_interface();
//修改界面
int rec_interface();
//删除界面
int del_interface();
//动态切换效果
int dyn_interface(Button main_button[], int n);
//初始化文本输入框
void init_edit(sys_edit& edit, int x, int y, int w, int h);
//检查按钮状态
int check_button(Button* pbutton, int size, mouse_msg& mouse);
//获取联系人信息
Person get_person(sys_edit* editname, sys_edit* editage = NULL, sys_edit* edittel = NULL);
//获取联系人ID
int get_id(sys_edit& edit);
//显示联系人
void person_show(int index, int x, int y, int w, int h);

interface.cpp各个界面的实现源码

#pragma once
#include"interface.h"
#include<time.h>
//按钮构造函数
Button::Button(int x, int y, int w, int h, const char * buttonname)
{
	b_x = x;
	b_y = y;
	b_w = w;
	b_h = h;
	strcpy_s(b_name, buttonname);
}
//按钮=号重载,方便主界面按钮数组的初始化
void Button::operator=(const Button & b)
{
	b_x = b.b_x;
	b_y = b.b_y;
	b_w = b.b_w;
	b_h = b.b_h;
	strcpy_s(b_name, b.b_name);
}
//画按钮
void Button::draw_button()
{
	//记录原填充色和字体
	color_t tempcolor = getfillcolor();
	LOGFONT tempfont;
	getfont(&tempfont);
	//画按钮(矩形)
	int x = b_x, y = b_y, w = b_w, h = b_h;
	if (b_mouse_in_flag) {
		x = b_x - 2;
		y = b_y - 2 * h / w;
		w = b_w + 4;
		h = b_h + 4 * h / w;
	}
	else {
		x = b_x;
		y = b_y;
		w = b_w;
		h = b_h;
	}
	setfillcolor(EGEACOLOR(0x80, RGB(200, 200, 200)));
	ege_fillrect((float)x, (float)y, (float)w, (float)h);
	//按钮名称
	setfont(h / 2 + 5, 0, "黑体");
	setbkmode(TRANSPARENT);
	int strwidth = textwidth(b_name);
	int strheight = textheight(b_name);

	if (b_down_flag) {
		xyprintf(b_x + (b_w - strwidth) / 2, b_y + (b_h - strheight) / 2 + 2, b_name);
	}
	else {
		xyprintf(b_x + (b_w - strwidth) / 2, b_y + (b_h - strheight) / 2, b_name);
	}
	//恢复原来的填充色和字体
	setfillcolor(tempcolor);
	setfont(&tempfont);
}
//判断鼠标是否指向按钮,实现交互
int Button::mouse_in(mouse_msg& mouse)
{
	return mouse.x >= b_x && mouse.x <= b_x + b_w && mouse.y >= b_y && mouse.y <= b_y + b_h;
}
//判断按钮是否被按下
int Button::mouse_down(mouse_msg& mouse)
{
	return mouse_in(mouse) && mouse.is_left() && mouse.is_down();
}
//判断按钮是否被点击(鼠标按下后松开)
bool Button::mouse_click(mouse_msg& mouse)
{
	return mouse.is_up() && mouse.is_left() && b_down_flag;
}
//初始化主界面的按钮数组
void init_mainbutton(Button* main_button, int n)
{
	const char* Main_buttonname[] = { "添加联系人","查找联系人","修改联系人","删除联系人","退出通讯录" };
	int button_w = 200;
	int button_h = Windh / 11;
	int button_x = (Windw - button_w) / 2;
	int button_y = button_h;
	for (int i = 0; i < n; i++) {
		main_button[i] = Button(button_x, button_y + i * button_y * 2, button_w, button_h, Main_buttonname[i]);
	}
}
//画界面,以界面函数的指针为参数
int draw_interface(int(*pInterface)())
{
	return pInterface();
}
//主界面
int main_interface() {
	int res = 0;
	//标记是否重画界面,不需要重画时可减小损耗
	int redraw = 1;
	static Button main_button[5];
	init_mainbutton(main_button, 5);
	mouse_msg mouse;
	while (mousemsg()) {
		mouse = getmouse();
		int checkflag = check_button(main_button, sizeof(main_button) / sizeof(main_button[0]), mouse);
		switch (checkflag) {
		case 0:
		case 1:
		case 2:
		case 3:
		case 4:
			res = checkflag + 1;
			main_button[checkflag].b_down_flag = 0;
			main_button[checkflag].b_mouse_in_flag = 0;
			redraw = 1;
			break;
		case 5:
			res = 0;
			redraw = 1;
			break;
		}
	}
	if (redraw) {
		
		cleardevice();
		setbkcolor(EGEACOLOR(0X80, RGB(255, 255, 255)));
		for (int i = 0; i < 5; i++) {
			main_button[i].draw_button();
		}
	}
	return res;
}
//添加界面
int add_interface() {
	int res = 1;
	//定义一个主界面按钮,用来实现动态切换效果
	static Button main_button[5];
	//定义添加界面初始化完成标记
	static int initflag = 0;
	//动态切换效果开关
	static int dynflag = 0;
	//重画开关
	int redraw = 0;
	static sys_edit editname;
	static sys_edit editage;
	static sys_edit edittel;
	//添加界面标题按钮
	int button_w = 200;
	int button_h = Windh / 11;
	int button_x = (Windw - button_w) / 2;
	int button_y = button_h;
	Button add(button_x, button_y, button_w, button_h, "添加联系人");
	enum { cel, yes };
	static Button sec_button[2];
	sec_button[cel] = Button((Windw - 300) / 2 - textwidth("姓名:"), add.b_y + 380, 80, 40, "取消");
	sec_button[yes] = Button((Windw - 300) / 2 + 300 - 60, sec_button[cel].b_y, 80, 40, "确定");

	//三个输入框和主界面按钮数组初始化,一个添加界面只初始化1次
	if (initflag == 0) {
		init_mainbutton(main_button, 5);
		init_edit(editname, (Windw - 300) / 2, main_button[0].b_y + 100, 320, 30);
		init_edit(editage, (Windw - 300) / 2, main_button[0].b_y + 200, 320, 30);
		init_edit(edittel, (Windw - 300) / 2, main_button[0].b_y + 300, 320, 30);
		editname.setfocus();
		initflag = 1;
	}
	//动态切换效果未完成时,重画界面动态界面
	if (dynflag < 5) {
		dynflag = dyn_interface(main_button, 5);
		redraw = 1;
	}//完成时,重画一次输入界面
	else if (dynflag == 5) {
		redraw = 2;
		dynflag = 6;
	}
	//定义一个计时器开始标记
	static clock_t start;
	static int tip = 0;
	mouse_msg mouse;
	while (mousemsg()) {
		//按钮和鼠标的交互
		mouse = getmouse();
		//取消按钮和确定按钮的鼠标指向效果,重画输入界面
		int size = sizeof(sec_button) / sizeof(sec_button[0]);
		int checkflag = check_button(sec_button, size, mouse);
		switch (checkflag) {
		case 0: {
			res = 0;
			sec_button[cel].b_mouse_in_flag = 0;
			editname.destroy();
			editage.destroy();
			edittel.destroy();
			dynflag = 0;
			initflag = 0;
		}break;
		case 1: {
			res = 1;
			tip = 1;
			Person p = get_person(&editname, &editage, &edittel);
			if (address.work_add(p) != -1) {
				start = clock();
			}
		}
		case 2: {
			redraw = 2;
		}break;
		}
	}
	clock_t end = clock();
	if (tip == 1 && end - start >= 1000) {
		cout << tip << endl;
		//满足计时条件,关闭提示信息,重画1次界面
		redraw = 2;
		tip = 0;
		editname.settext("");
		editage.settext("");
		edittel.settext("");
		editname.setfocus();
	}
	if (redraw) {
		cleardevice();
		setbkcolor(EGEACOLOR(0X80, RGB(255, 255, 255)));
		switch (redraw) {
		case 1:
			for (int i = 0; i < 5; i++) {
				main_button[i].draw_button();
			}
			if (dynflag != 5) redraw = 0;
			else redraw = 1;
			break;
		case 2:
			add.draw_button();
			xyprintf(editname.getx() - textwidth("姓名:"), editname.gety() + 5, "姓名:");
			xyprintf(editname.getx() - textwidth("年龄:"), editage.gety() + 5, "年龄:");
			xyprintf(editname.getx() - textwidth("电话:"), edittel.gety() + 5, "电话:");
			editname.visible(true);
			editage.visible(true);
			edittel.visible(true);
			sec_button[cel].draw_button();
			sec_button[yes].draw_button();
			if (tip) {
				xyprintf(sec_button[cel].b_x + sec_button[cel].b_w + ((sec_button[yes].b_x - sec_button[cel].b_x - sec_button[cel].b_w) - textwidth("添加成功")) / 2, sec_button[cel].b_y, "添加成功");
			}
			redraw = 0;
			break;
		}
	}
	return res;
}
//搜索界面
int search_interface() {
	int res = 2;
	//定义一个主界面按钮,用来实现动态切换效果
	static Button main_button[5];
	//定义添加界面初始化完成标记
	static int initflag = 0;
	//动态切换效果开关
	static int dynflag = 0;
	//重画开关
	int redraw = 0;
	static sys_edit edit;
	//添加界面标题按钮
	int button_w = 200;
	int button_h = Windh / 11;
	int button_x = (Windw - button_w) / 2;
	int button_y = button_h;
	Button search(button_x, button_y, button_w, button_h, "搜索联系人");
	enum { cel, yes };
	static Button sec_button[2];
	//输入框和主界面按钮数组初始化,一个添加界面只初始化1次
	int printx = 0;
	if (initflag == 0) {
		init_mainbutton(main_button, 5);
		init_edit(edit, (Windw - 360) / 2, main_button[0].b_y + 150, 360, 30);
		edit.setfocus();
		sec_button[cel] = Button(search.b_x - 80, search.b_y + 380, 80, 40, "取消");
		sec_button[yes] = Button(search.b_x + search.b_w, sec_button[cel].b_y, 80, 40, "确定");
		initflag = 1;
	}
	//动态切换效果未完成时,重画界面动态界面
	if (dynflag < 5) {
		dynflag = dyn_interface(main_button, 5);
		redraw = 1;
	}//完成时,重画一次输入界面
	else if (dynflag == 5) {
		redraw = 2;
		dynflag = 6;
	}

	static int index = -1;
	mouse_msg mouse;
	while (mousemsg()) {
		mouse = getmouse();
		int size = sizeof(sec_button) / sizeof(sec_button[0]);
		int checkflag = check_button(sec_button, size, mouse);
		switch (checkflag) {
		case 0: {
			res = 0;
			sec_button[cel].b_mouse_in_flag = 0;
			sec_button[yes].b_down_flag = 0;
			strcpy_s(sec_button[yes].b_name, "确定");
			intArray.init();
			edit.destroy();
			dynflag = 0;
			initflag = 0;
		}break;
		case 1: {
			if (strcmp(sec_button[yes].b_name, "确定") == 0) {
				res = 2;
				sec_button[yes].b_down_flag = 0;
				Person p = get_person(&edit);
				address.work_search(p.p_name);
				if (intArray.m_cnt) {
					index = 0;
					strcpy_s(sec_button[yes].b_name, "修改");
					redraw = 3;
				}
				else {
					redraw = 2;
				}
			}
			else {
				res = 3;
				sec_button[cel].b_mouse_in_flag = 0;
				sec_button[yes].b_down_flag = 0;
				intArray.init();
				edit.destroy();
				dynflag = 0;
				initflag = 0;
				redraw = 0;
			}
			
		}break;
		case 2: {
			if (intArray.m_cnt) {
				redraw = 3;
			}
			else {
				redraw = 2;
			}
		}break;
		}
		if (intArray.m_cnt&&mouse.is_wheel()) {
			index += -mouse.wheel / 120;
			if (index < 0) index = 0;
			if (index >= intArray.m_cnt) index = intArray.m_cnt - 1;
			redraw = 3;
		}
	}
	if (redraw) {
		cleardevice();
		setbkcolor(EGEACOLOR(0X80, RGB(255, 255, 255)));
		switch (redraw) {
		case 1:
			for (int i = 0; i < 5; i++) {
				main_button[i].draw_button();
			}
			break;
		case 2:
			search.draw_button();
			setfont(search.b_h / 2, 0, "楷体");
			printx = (Windw - textwidth("请输入查找内容")) / 2;
			xyprintf(printx, search.b_y + search.b_h + 50, "请输入查找内容");
			edit.visible(true);
			sec_button[cel].draw_button();
			sec_button[yes].draw_button();
			break;
		case 3:
			search.draw_button();
			edit.visible(false);
			sec_button[cel].draw_button();
			sec_button[yes].draw_button();
			int w = 400;
			int x = (Windw - w) / 2;
			int h = Windh / 5;
			int y = h;
			person_show(index, x, y, w, h);
			if (index < intArray.m_cnt - 1) {
				y = y + h + 2;
				person_show(index + 1, x, y, w, h);
			}
			break;
		}
	}
	return res;
}
//修改界面
int rec_interface() {
	int res = 3;
	//定义一个主界面按钮,用来实现动态切换效果
	static Button main_button[5];
	//定义添加界面初始化完成标记
	static int initflag = 0;
	//动态切换效果开关
	static int dynflag = 0;
	//重画开关
	int redraw = 0;
	//提示开关、显示开关、联系人id、修改开关
	static int tip = 0, show = 0, id = -1, recflag = 0;
	//id输入框
	static sys_edit edit;
	//修改输入框
	static sys_edit editname, editage, edittel;
	//添加界面标题按钮
	int button_w = 200;
	int button_h = Windh / 11;
	int button_x = (Windw - button_w) / 2;
	int button_y = button_h;
	Button search(button_x, button_y, button_w, button_h, "修改联系人");
	enum { cel, yes };
	static Button sec_button[2];
	//输入框和主界面按钮数组初始化,一个添加界面只初始化1次

	if (initflag == 0) {
		init_mainbutton(main_button, 5);
		init_edit(edit, (Windw - 360) / 2, main_button[0].b_y + 150, 360, 30);
		edit.setfocus();
		sec_button[cel] = Button(search.b_x - 80, search.b_y + 380, 80, 40, "取消");
		sec_button[yes] = Button(search.b_x + search.b_w, sec_button[cel].b_y, 80, 40, "确定");
		tip = 0; show = 0; id = -1;	dynflag = 0;
		initflag = 1;
	}
	//动态切换效果未完成时,重画界面动态界面
	if (dynflag < 5) {
		dynflag = dyn_interface(main_button, 5);
		redraw = 1;
	}//完成时,重画一次输入界面
	else if (dynflag == 5) {
		redraw = 2;
		dynflag = 6;
	}

	static clock_t start = 0;
	mouse_msg mouse;
	while (mousemsg()) {
		mouse = getmouse();
		int size = sizeof(sec_button) / sizeof(sec_button[0]);
		int checkflag = check_button(sec_button, size, mouse);
		switch (checkflag) {
		case 0: {
			res = 0;
			sec_button[cel].b_mouse_in_flag = 0;
			sec_button[cel].b_down_flag = 0;
			strcpy_s(sec_button[yes].b_name, "确定");
			intArray.init();
			edit.destroy();
			editname.destroy();
			editage.destroy();
			edittel.destroy();
			dynflag = 0;
			initflag = 0;
			id = -1;
			tip = 0;
			recflag = 0;
		}break;
		case 1: {
			sec_button[yes].b_down_flag = 0;
			if (strcmp(sec_button[yes].b_name, "确定") == 0) {
				id = get_id(edit);
				if (id > address.a_cnt || id < 1) {
					tip = 1;
					start = clock();
					redraw = 2;
				}
				else {
					show = 1;
					strcpy_s(sec_button[yes].b_name, "修改");
					intArray.m_array[0] = id - 1;
					redraw = 3;
				}
			}
			else if (strcmp(sec_button[yes].b_name, "修改") == 0) {
				redraw = 3;
				recflag = 1;
				int w = 400;
				int x = (Windw - w) / 2;
				int h = Windh / 5;
				int y = h;
				init_edit(editname, x + textwidth("姓名:"), y + h + 10, w - textwidth("姓名:"), 30);
				init_edit(editage, x + textwidth("姓名:"), y + h + 50, w - textwidth("姓名:"), 30);
				init_edit(edittel, x + textwidth("姓名:"), y + h + 90, w - textwidth("姓名:"), 30);
				editname.settext(address.a_array[id - 1].p_name);
				char buffer[MAXSIZENAME];
				sprintf_s(buffer, "%d", address.a_array[id - 1].p_age);
				editage.settext(buffer);
				sprintf_s(buffer, "%lld", address.a_array[id - 1].p_tel);
				edittel.settext(buffer);
				editname.setfocus();
				strcpy_s(sec_button[yes].b_name, "保存");
			}
			else if (strcmp(sec_button[yes].b_name, "保存") == 0) {
				redraw = 3;
				recflag = 0;
				Person p = get_person(&editname, &editage, &edittel);
				if (p.p_name[0] != '\0' || p.p_tel) {
					address.a_array[id - 1] = p;
				}
				strcpy_s(sec_button[yes].b_name, "修改");
			}
		}break;
		case 2: {
			if (show) {
				redraw = 3;
			}
			else {
				redraw = 2;
			}
		}break;
		}
	}
	clock_t end = clock();
	if (end - start >= 300 && tip == 1) {
		tip = 0;
		redraw = 2;
	}
	if (redraw) {
		cleardevice();
		setbkcolor(EGEACOLOR(0X80, RGB(255, 255, 255)));
		switch (redraw) {
		case 1:
			for (int i = 0; i < 5; i++) {
				main_button[i].draw_button();
			}
			break;
		case 2:
			search.draw_button();
			setfont(search.b_h / 2, 0, "楷体");
			xyprintf((Windw - textwidth("请输入要修改联系人的ID")) / 2, search.b_y + search.b_h + 50, "请输入要修改联系人的ID");
			edit.visible(true);
			sec_button[cel].draw_button();
			sec_button[yes].draw_button();
			if (tip) {
				xyprintf((Windw - textwidth("查无此人")) / 2, edit.gety() + edit.geth() + 10, "查无此人");
			}
			break;
		case 3:
			search.draw_button();
			edit.visible(false);
			sec_button[cel].draw_button();
			sec_button[yes].draw_button();
			int w = 400;
			int x = (Windw - w) / 2;
			int h = Windh / 5;
			int y = h;
			person_show(0, x, y, w, h);
			if (recflag) {
				xyprintf(x, editname.gety() + 4, "姓名:");
				xyprintf(x, editage.gety() + 4, "年龄:");
				xyprintf(x, edittel.gety() + 4, "电话:");
				editname.visible(true);
				editage.visible(true);	
				edittel.visible(true);
			}
			else {
				editname.visible(false);
				editage.visible(false);
				edittel.visible(false);
			}
			break;
		}
	}
	return res;
}
//删除界面
int del_interface() {
	int res = 4;
	//定义一个主界面按钮,用来实现动态切换效果
	static Button main_button[5];
	//定义添加界面初始化完成标记
	static int initflag = 0, id = -1;
	//动态切换效果开关
	static int dynflag = 0;
	//重画开关
	int redraw = 0;
	//id输入框
	static sys_edit edit;
	//添加界面标题按钮
	int button_w = 200;
	int button_h = Windh / 11;
	int button_x = (Windw - button_w) / 2;
	int button_y = button_h;
	Button del(button_x, button_y, button_w, button_h, "删除联系人");
	enum { cel, yes };
	static Button sec_button[2];
	//输入框和主界面按钮数组初始化,一个添加界面只初始化1次

	if (initflag == 0) {
		init_mainbutton(main_button, 5);
		init_edit(edit, (Windw - 360) / 2, main_button[0].b_y + 150, 360, 30);
		edit.setfocus();
		sec_button[cel] = Button(del.b_x - 80, del.b_y + 380, 80, 40, "取消");
		sec_button[yes] = Button(del.b_x + del.b_w, sec_button[cel].b_y, 80, 40, "确定");
		initflag = 1;
	}
	//动态切换效果未完成时,重画界面动态界面
	if (dynflag < 5) {
		dynflag = dyn_interface(main_button, 5);
		redraw = 1;
	}//完成时,重画一次输入界面
	else if (dynflag == 5) {
		redraw = 2;
		dynflag = 6;
	}
	static clock_t start = 0;
	static int tip = 0, show = 0;
	mouse_msg mouse;
	while (mousemsg()) {
		mouse = getmouse();
		int size = sizeof(sec_button) / sizeof(sec_button[0]);
		int checkflag = check_button(sec_button, size, mouse);
		switch (checkflag) {
		case 0: {
			res = 0;
			sec_button[cel].b_mouse_in_flag = 0;
			sec_button[cel].b_down_flag = 0;
			strcpy_s(sec_button[yes].b_name, "确定");
			intArray.init();
			edit.destroy();
			dynflag = 0;
			initflag = 0;
			id = -1;
			show = 0;
		}break;
		case 1: {
			sec_button[yes].b_down_flag = 0;
			if (strcmp(sec_button[yes].b_name, "确定") == 0) {
				id = get_id(edit);
				if (id > address.a_cnt || id < 1) {
					tip = 1;
					start = clock();
					redraw = 2;
				}
				else {
					show = 1;
					strcpy_s(sec_button[yes].b_name, "删除");
					intArray.m_array[0] = id - 1;
					redraw = 3;
				}
			}
			else {
				address.work_del(id - 1);
				redraw = 2;
				show = 0;
				strcpy_s(sec_button[yes].b_name, "确定");
				edit.settext("");
			}
		}break;
		case 2: {
			if (show) {
				redraw = 3;
			}
			else {
				redraw = 2;
			}
		}
		}
	}
	clock_t end = clock();
	if (end - start >= 300 && tip) {
		tip = 0;
		redraw = 2;
	}
	if (redraw) {
		cleardevice();
		setbkcolor(EGEACOLOR(0X80, RGB(255, 255, 255)));
		switch (redraw) {
		case 1:
			for (int i = 0; i < 5; i++) {
				main_button[i].draw_button();
			}
			break;
		case 2:
			del.draw_button();
			setfont(del.b_h / 2, 0, "楷体");
			xyprintf((Windw - textwidth("请输入要删除联系人的ID")) / 2, del.b_y + del.b_h + 50, "请输入要删除联系人的ID");
			edit.visible(true);
			sec_button[cel].draw_button();
			sec_button[yes].draw_button();
			if (tip) {
				xyprintf((Windw - textwidth("查无此人")) / 2, edit.gety() + edit.geth() + 10, "查无此人");
			}
			break;
		case 3:
			del.draw_button();
			edit.visible(false);
			sec_button[cel].draw_button();
			sec_button[yes].draw_button();
			int w = 400;
			int x = (Windw - w) / 2;
			int h = Windh / 5;
			int y = h;
			person_show(0, x, y, w, h);
			break;
		}
	}
	return res;
}
//动态切换效果,动态效果完成后返回消失的按钮数量
int dyn_interface(Button main_button[], int n) {
	int res = 0;
	static int v = 1;
	for (int i = 0; i < n; i++) {
		if (i % 2 == 0) {
			main_button[i].b_x -= v;
		}
		else {
			main_button[i].b_x += v;
		}
		if (main_button[i].b_x <= -Windw || main_button[i].b_x >= Windw) {
			res++;
		}
	}
	v += 2;
	if (res == 5) v = 1;
	return res;
}
//初始化文本输入框
void init_edit(sys_edit& edit, int x, int y, int w, int h) {
	edit.create(false);
	edit.move(x, y);
	edit.size(w, h);
	edit.setmaxlen(24);
	edit.setfont(h - h / 3, 0, "楷体");
	edit.setbgcolor(EGEACOLOR(0x80, RGB(255, 255, 200)));
	edit.visible(false);
	edit.setfocus();
}
//检查按钮状态,返回被点击按钮下标
int check_button(Button* pbutton, int size, mouse_msg& mouse) {
	int res = -1;
	for (int i = 0; i < size; i++) {
		if (pbutton[i].b_mouse_in_flag != pbutton[i].mouse_in(mouse)) {
			res = size;
			if (pbutton[i].mouse_in(mouse)) {
				pbutton[i].b_mouse_in_flag = 1;
			}
			else {
				pbutton[i].b_mouse_in_flag = 0;
			}
		}
		if (pbutton[i].b_down_flag != pbutton[i].mouse_down(mouse)) {
			res = size;
			if (pbutton[i].mouse_down(mouse)) {
				pbutton[i].b_down_flag = 1;
			}
			else if (!pbutton[i].mouse_in(mouse)) {
				pbutton[i].b_down_flag = 0;
			}
		}
		if (pbutton[i].mouse_click(mouse)) {
			res = i;
		}
	}
	return res;
}
//获取联系人信息
Person get_person(sys_edit* editname, sys_edit* editage, sys_edit* edittel) {
	Person p;
	char buffer[MAXSIZENAME] = { 0 };
	editname->gettext(MAXSIZENAME, buffer);
	strcpy_s(p.p_name, buffer);
	if (editage) {
		editage->gettext(MAXSIZENAME, buffer);
		sscanf_s(buffer, "%d", &p.p_age);
		edittel->gettext(MAXSIZENAME, buffer);
		sscanf_s(buffer, "%lld", &p.p_tel);
	}
	return p;
}
//获取联系人ID
int get_id(sys_edit& edit) {
	int res = -1;
	char buffer[10];
	edit.gettext(10, buffer);
	if (buffer[0] != '\0') {
		sscanf_s(buffer, "%d", &res);
	}
	return res;
}
//显示联系人
void person_show(int index, int x, int y, int w, int h) {
	LOGFONTA tempfont;
	getfont(&tempfont);
	color_t tempcolor = getfillcolor();
	setfillcolor(EGEACOLOR(0x80, RGB(255, 255, 120)));
	ege_fillrect((float)x, (float)y, (float)w, (float)h);
	setfont(h / 5, 0, "楷体");
	int temp = textheight("zhangsan");
	xyprintf(x + 2, y + (h - 4 * temp) / 5, "ID:%d", intArray.m_array[index] + 1);
	xyprintf(x + 2, y + 2 * (h - 4 * temp) / 5 + temp, "姓名:%s", address.a_array[intArray.m_array[index]].p_name);
	xyprintf(x + 2, y + 3 * (h - 4 * temp) / 5 + 2 * temp, "年龄:%d", address.a_array[intArray.m_array[index]].p_age);
	xyprintf(x + 2, y + 4 * (h - 4 * temp) / 5 + 3 * temp, "电话:%lld", address.a_array[intArray.m_array[index]].p_tel);
	setfillcolor(tempcolor);
	setfont(&tempfont);
}

main.cpp

#include"interface.h"
int main(int argc, char const *argv[]) {
	//设置窗口类型和窗口位置,此版本setinitmode()不生效
	setinitmode(INIT_RENDERMANUAL, Windx, Windy);
	//设置窗口名字
	setcaption(Caption);
	initgraph(Windw, Windh, INIT_RENDERMANUAL);
	//开启高级渲染模式
	ege_enable_aa(true);
	//定义函数指针,指向主界面
	int(*pInterface)() = main_interface;
	int flag = 0;
	for (; is_run(); delay_fps(60)) {
		flag = draw_interface(pInterface);
		switch (flag) {
		case 0:
			pInterface = main_interface; break;
		case 1:
			pInterface = add_interface; break;
		case 2:
			pInterface = search_interface; break;
		case 3:
			pInterface = rec_interface; break;
		case 4:
			pInterface = del_interface; break;
		case 5:
			goto  EXIT;
		}
	}
EXIT:
	closegraph();
	return 0;
}

三、通讯录内核代码

address.h

#pragma once
#include<iostream>
using namespace std;
#include<string>
#include<fstream>
constexpr auto MAXSIZENAME = 24;
constexpr auto MAXSIZEADDR = 10;
//定义联系人类
class Person {
public:
	char p_name[MAXSIZENAME];
	int p_age = 0;
	long long p_tel = 0;
	Person() {}
	Person(const char* name, int age, long long tel);
	void operator=(const Person& p);
};
//定义通讯录类
class Address {
public:
	Person a_array[MAXSIZEADDR];
	int a_cnt = 0;
	int work_add(const Person& p);
	void work_del(int id);
	int work_search(char *str);
	Address();
	~Address();
};
extern Address address;
//定义数组类
class Array {
public:
	int m_array[MAXSIZEADDR];
	int m_cnt = 0;
	void init();
};
extern Array intArray;

address.cpp

#include"addresslist.h"
Address address;
Array intArray;
Person::Person(const char* name, int age, long long tel)
{
	strcpy_s(p_name, name);
	p_age = age;
	p_tel = tel;
}
void Person::operator=(const Person & p)
{
	strncpy_s(p_name, p.p_name, sizeof(p.p_name));
	p_age = p.p_age;
	p_tel = p.p_tel;
}
int Address::work_add(const Person & p)
{
	int res = -1;
	if (address.a_cnt < MAXSIZEADDR) {
		if (p.p_name[0] != '\n' || p.p_tel != 0) {
			address.a_array[address.a_cnt].p_age = p.p_age;
			address.a_array[address.a_cnt].p_tel = p.p_tel;
			strcpy_s(address.a_array[address.a_cnt].p_name, p.p_name);
			res = address.a_cnt++;
		}
	}
	return res;
}
void Address::work_del(int id)
{
	for (int i = id; i < a_cnt - 1; i++) {
		a_array[i] = a_array[i + 1];
	}
	a_cnt--;
}
int Address::work_search(char *str)
{
	intArray.init();
	if (str[0] != '\0') {
		cout << str << endl;
		for (int i = 0; i < a_cnt; i++) {
			if (strcmp(a_array[i].p_name, str) == 0) {
				intArray.m_array[intArray.m_cnt++] = i;
			}
		}
	}
	
	long long temptel = 0;
	sscanf_s(str, "%lld", &temptel);
	if (temptel != 0 && intArray.m_cnt == 0) {
		cout << intArray.m_cnt << endl;
		for (int i = 0; i < a_cnt; i++) {
			if (a_array[i].p_tel == temptel) {
				intArray.m_array[intArray.m_cnt++] = i;
			}
		}
	}
	return intArray.m_cnt;
}
Address::Address()
{
	ifstream ifs("address.txt", ios::binary | ios::in);
	if (ifs) {
		ifs.read((char*)this, sizeof(*this));
		ifs.close();
		cout << "通讯录打开成功" << endl;
		cout << "通讯录中共有 " << a_cnt << " 个联系人" << endl;
	}
	else {
		cout << "创建通讯录" << endl;
	}
}
Address::~Address()
{
	ofstream ofs("address.txt", ios::binary | ios::out);
	if (ofs.is_open()) {
		ofs.write((char*)this, sizeof(*this));
		ofs.close();
		cout << "通讯录保存成功" << endl;
		cout << "通讯录中共有 " << a_cnt << " 个联系人" << endl;
	}
	else {
		cout << "通讯录保存失败" << endl;
	}
}
void Array::init()
{
	m_cnt = 0;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值