【C语言项目】通讯录与可视化界面实现

目录

一、编译环境

1、VS2022

2、Easyx库

二、功能结构

 三、遇到的问题

1、增加模块输入InputBox函数如何录入数据

 2、

四、头文件(准备工作)

1、代码

 

2、头文件(库)

3、预处理

4、联系人信息结构体

5、函数声明

五、主界面绘制(main函数)

1、展示

2、主要模块

1.main函数

2.test函数

 3.init函数

 六、ADD

1、代码+展示

​编辑

2、功能实现 

1.绘图

2.实现窗口

3.输入联系人信息与信息录入数组实现

3、录入后信息去向

七、其他模块

1、查找(sea函数)

 1.代码

2.功能

 2、删除(del)

1.代码

2.功能

3、其他模块

1.输出函数(print)

 2.录入文件(Writetxt)


一、编译环境

1、VS2022

2、Easyx库

二、功能结构

实现基本的增删改查更改,通过文件的形式存储录入的数据,在启动程序时从文件里录入

学生信息采用结构体表示

数据结构:由于是简陋版2天搞完,所以我使用了数组,也可以使用动态数组或链表,后续加实现模块即可、主界面的实现(main.c)

 三、遇到的问题

1、增加模块输入InputBox函数如何录入到数组中

解决办法:1.查找资料,直接将字符串定义为wchar_t数组,然后使用memcpy函数拷贝。2.大lao指点博客名:JFL1224

 2、

四、头文件(准备工作)

1、代码

#pragma once
#include<stdio.h>
#include<easyx.h>
#include<graphics.h>
#include<string>
#include<string.h>

#pragma warning(disable:4996)

#define Namenum 10
#define Callnum 12
#define Sexnum 5
#define Addrnum 20
#define Agenum 5

struct S
{
	wchar_t name[Namenum];
	wchar_t num[Callnum];
	wchar_t sex[Sexnum];
	wchar_t addr[Addrnum];
	wchar_t age[Agenum];
	
};

struct M
{
	struct S stu[100];
	int count;
};


void Add(M* s);

void print(M* s);

void search(M* s);

void del(M* s);

void Writetxt(M* s);

2、头文件(库)

 主要包含以下头文件


#include<stdio.h>
#include<easyx.h>
#include<graphics.h>
#include<string>
#include<string.h>


3、预处理

定义各数组长度,姓名数组,年龄数组,地址数组等

由于使用编译环境是VS2022一些函数不能直接使用所以预编译时加入 

#pragma warning(disable:4996)

4、联系人信息结构体

联系人信息主要包含姓名、年龄、住址、电话、性别等信息

struct S
{
	wchar_t name[Namenum];
	wchar_t num[Callnum];
	wchar_t sex[Sexnum];
	wchar_t addr[Addrnum];
	wchar_t age[Agenum];
	
};

 再定义一个结构体方便存储联系人人数及联系人数组

struct M
{
	struct S stu[100];
	int count;
};

5、函数声明

接下来是一些基本模块函数的声明 

void Add(M* s);        增加联系人

void print(M* s);      输出联系人

void search(M* s);     查找联系人
 
void del(M* s);        删除联系人

void mod(M* s);        修改联系人

void Writetxt(M* s);   保存数据到文件
 

五、主界面绘制(main函数)

1、展示

2、主要模块

1.main函数

主函数主要实习了主界面绘图的调用

int main()
{
	test();

	return 0;
}

2.test函数

该函数先实现了,数据结构的定义,并调用函数对其进行初始化与加载

然后开始绘制主界面这里使用了easyx库里的库函数

easyx库:EasyX Graphics Library for C++https://easyx.cn/

void test()//主界面
{
	M stus;
	//初始化
	init(&stus);
a:;
	
	MOUSEMSG m;

	initgraph(1024, 640);
	setbkcolor(WHITE);             //设置背景颜色白色
	cleardevice();                 //清屏清楚黑色

	image();                      //插入图片

	setfillcolor(LIGHTBLUE);
	//设置填充颜色

	fillrectangle(350, 20, 600, 50);

	fillrectangle(350, 80, 600, 110);

	fillrectangle(350, 140, 600, 170);

	fillrectangle(350, 200, 600, 230);

	fillrectangle(350, 260, 600, 290);

	fillrectangle(350, 320, 600, 350);

	
	settextstyle(20, 0, L"宋体");   //设置文字形式

	setbkmode(TRANSPARENT);        //透明文字
	
	outtextxy(430, 25, L"退出通讯录");

	outtextxy(430, 85, L"增加联系人");

	outtextxy(430, 145, L"查找联系人");

	outtextxy(430, 205, L"删除联系人");

	outtextxy(430, 265, L"修改联系人");

	outtextxy(430, 325, L"查看联系人");

	settextcolor(WHITE);
	settextstyle(20, 0, L"宋体");   //设置文字形式
	setbkmode(TRANSPARENT);        //透明文字

	outtextxy(450, 400, L"通讯录2.1.0");

	while (1)
	{
	
		m = GetMouseMsg();
		if (m.x < 600 && m.x>350 && m.y > 20 && m.y < 50)
		{
			setlinecolor(RED);
			rectangle(345, 15, 605, 55);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				Writetxt(&stus);

				return;
			}
		}
		else if (m.x < 600 && m.x>350 && m.y > 80 && m.y < 110)
		{
			setlinecolor(RED);
			rectangle(345, 75, 605, 115);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				Add(&stus);
				goto a;
			}
		}
		else if (m.x < 600 && m.x>350 && m.y > 140 && m.y < 170)
		{
			setlinecolor(RED);

			rectangle(345, 135, 605, 175);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				search(&stus);
				goto a;
			}
		}
		else if (m.x < 600 && m.x>350 && m.y > 200 && m.y < 230)
		{
			setlinecolor(RED);

			rectangle(345, 195, 605, 235);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				del(&stus);
				goto a;
			}
		}
		else if (m.x < 600 && m.x>350 && m.y > 260 && m.y < 290)
		{
			setlinecolor(RED);

			rectangle(345, 255, 605, 295);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				mod(stus);
				goto a;
			}
		}
		else if (m.x < 600 && m.x>350 && m.y > 320 && m.y < 350)
		{
			setlinecolor(RED);

			rectangle(345, 315, 605, 355);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				print(&stus);
				goto a;
			}
		}
		else
		{
			setlinecolor(WHITE);
			rectangle(345, 15, 605, 55);
			rectangle(345, 75, 605, 115);
			rectangle(345, 135, 605, 175);
			rectangle(345, 195, 605, 235);
			rectangle(345, 255, 605, 295);
			rectangle(345, 315, 605, 355);

		}
	}


	getchar();
}

 3.init函数

该函数主要实习对数据结构进行初始化与加载,在文件中读取数据存入数组

void init(M* s)
{
	s->count = 0;
	memset(s->stu, 0, 100*sizeof(S));

	FILE* pf = fopen("contact.txt", "rb");
	if(pf == NULL)
	{
		perror("fopen");
		HWND hnd = GetHWnd();
		SetWindowText(hnd, L"Add");
		MessageBox(hnd, L"导入失败", L"警告", MB_OKCANCEL);
		return;
	}

	S ss = { 0 };
	while (fread(&ss, sizeof(S), 1, pf) == 1)
	{
		s->stu[s->count] = ss;
		s->count++;
	}

	fclose(pf);
	pf = NULL;
}

 六、ADD

1、代码+展示

#include"easyx.h"

void Add(M* s)
{
//ab:;
	MOUSEMSG m;
	initgraph(1024, 640);
	setbkcolor(WHITE);             //设置背景颜色白色
	cleardevice();

	IMAGE mm;                     //加载背景
	loadimage(&mm, L"ooo.jpg", 1024, 640);
	putimage(0, 0, &mm);

	setfillcolor(LIGHTBLUE);      //设置填充颜色

	fillrectangle(100, 20, 250, 50);//姓名
	fillrectangle(100, 80, 250, 110);//年龄
	fillrectangle(100, 140, 250, 170);//性别
	fillrectangle(100, 200, 250, 230);//电话
	fillrectangle(100, 260, 250, 290);//住址
	fillrectangle(100, 320, 250, 350);//返回


	settextstyle(20, 0, L"宋体");   //设置文字形式

	setbkmode(TRANSPARENT);        //透明文字

	outtextxy(145, 25, L"姓   名");
	outtextxy(145, 85, L"年   龄");
	outtextxy(145, 145, L"性   别");
	outtextxy(145, 205, L"电   话");
	outtextxy(145, 265, L"住   址");
	outtextxy(145, 325, L"返   回");


	settextcolor(BLACK);

	settextstyle(20, 0, L"宋体");   //设置文字形式
	setbkmode(TRANSPARENT);        //透明文字

	outtextxy(450, 400, L"输入信息");

	setfillcolor(WHITE);
	fillrectangle(300, 20, 800, 50);//姓名
	fillrectangle(300, 80, 800, 110);//年龄
	fillrectangle(300, 140, 800,170);//性别
	fillrectangle(300, 200, 800,230);//电话
	fillrectangle(300, 260, 800,290);//住址
	int i = 0;
	while (1)
	{
		m = GetMouseMsg();
		if (m.x < 800 && m.x>300 && m.y > 20 && m.y < 50)
		{
			setlinecolor(RED);
			rectangle(295, 15, 805, 55);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				//输入姓名
				wchar_t ss[10];
				InputBox(ss, 10, L"请输入姓名");
				outtextxy(500, 25, ss);
				memcpy(s->stu[s->count].name, ss, 10);
				i++;
				//goto ab;
			}
		}
		else if (m.x < 800 && m.x>300 && m.y > 80 && m.y < 110)
		{
			setlinecolor(RED);
			rectangle(295, 75, 805, 115);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				//输入
				wchar_t ss[5];
				InputBox(ss, 5, L"请输入年龄");
				outtextxy(500, 85, ss);
				memcpy(s->stu[s->count].age, ss, 5);
				//s->stu[s->count].age = r;
				
				
				//goto ab;
				i++;
			}
		}
		else if (m.x < 800 && m.x>300 && m.y > 140 && m.y < 170)
		{
			setlinecolor(RED);
			rectangle(295, 135, 805, 175);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				wchar_t ss[5];
				InputBox(ss, 5, L"请输入性别");
				outtextxy(500, 145, ss);
				memcpy(s->stu[s->count].sex, ss, 5);

				i++;
				//goto ab;
			}
		}
		else if (m.x < 800 && m.x>300 && m.y > 200 && m.y < 230)
		{
			setlinecolor(RED);
			rectangle(295, 195, 805, 235);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				wchar_t ss[12];
				InputBox(ss, 12, L"请输入电话");
				outtextxy(500, 205, ss);
				memcpy(s->stu[s->count].num, ss, 12);

				i++;
				//goto ab;
			}
		}
		else if (m.x < 800 && m.x>300 && m.y > 260 && m.y < 290)
		{
			setlinecolor(RED);
			rectangle(295, 255, 805, 295);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				wchar_t ss[20];
				InputBox(ss, 20, L"请输入住址");
				outtextxy(500, 265, ss);
				memcpy(s->stu[s->count].addr, ss, 20);

				i++;
				//goto ab;
			}
		}
		else if (m.x < 250 && m.x > 100 && m.y < 350 && m.y>320)
		{
			setlinecolor(RED);
			rectangle(95, 315, 255, 355);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				i++;
				goto abcd;
			}
		}
		else
		{
			setlinecolor(WHITE);
			rectangle(295, 15, 805, 55);
			rectangle(295, 75, 805, 115);
			rectangle(295, 135, 805, 175);
			rectangle(295, 195, 805, 235);
			rectangle(295, 255, 805, 295);
			rectangle(95, 315, 255, 355);
		}
		
	}
	getchar();
abcd:;
		if (i == 6)
		{
			s->count++;
			HWND hnd=GetHWnd();
			SetWindowText(hnd, L"Add");
			MessageBox(hnd, L"添加成功",L"提示", MB_OKCANCEL);
		}
		else
		{
			HWND hnd = GetHWnd();
			SetWindowText(hnd, L"Add");
			MessageBox(hnd, L"添加失败", L"提示", MB_OKCANCEL);
		}
	

}

2、功能实现 

1.绘图

先绘制处窗口与增加联系人信息的对应窗口

2.实现窗口

使用鼠标函数操作,进行条件判断,如果在指定区域有点击就执行相应的功能

如点击姓名后空区域,就执行输入姓名操作,如点击返回后,进行判断是否输

出成功并返回到主界面

3.输入联系人信息与信息录入数组实现

在界面输入信息使用Easyx库里InputBox函数

录入到数组:使用memcpy函数实现拷贝录入

3、录入后信息去向

录入后信息存入数组,在程序结束时会存储到对应文件中

七、其他模块

1、查找(sea函数)

 1.代码

#include"easyx.h"

void search(M* s)
{
	MOUSEMSG m;
	initgraph(1024, 640);
	setbkcolor(WHITE);             //设置背景颜色白色
	cleardevice();

	IMAGE mm;                     //加载背景
	loadimage(&mm, L"ooo.jpg", 1024, 640);
	putimage(0, 0, &mm);

	setfillcolor(LIGHTBLUE);      //设置填充颜色
	fillrectangle(100, 30, 300, 60);//姓名
	fillrectangle(100, 500, 200, 530);//返回
	fillrectangle(100, 90, 300, 120);//年龄
	fillrectangle(100, 150, 300, 180);//电话查找
	fillrectangle(100, 210, 300, 240);//地址
	fillrectangle(330, 30, 430, 60);//姓名
	fillrectangle(450, 30, 550, 60);//年龄
	fillrectangle(600, 30, 700, 60);//性别
	fillrectangle(750, 30, 850, 60);//电话
	fillrectangle(900, 30, 1000, 60);//住址
	

	settextstyle(20, 0, L"宋体");   //设置文字形式
	setbkmode(TRANSPARENT);        //透明文字

	outtextxy(150, 35, L"按姓名查找");
	outtextxy(150, 95, L"按年龄查找");
	outtextxy(150, 155, L"按电话查找");
	outtextxy(150, 215, L"按地址查找");
	outtextxy(120, 510, L"返   回");
	outtextxy(340, 34, L"姓   名");
	outtextxy(470, 34, L"年   龄");
	outtextxy(620, 34, L"性   别");
	outtextxy(770, 34, L"电   话");
	outtextxy(920, 34, L"住   址");


	

	while (1)
	{
		m = GetMouseMsg();
		if (m.x < 300 && m.x>100 && m.y > 500 && m.y < 530)
		{
			setlinecolor(RED);
			rectangle(95, 495, 205, 535);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				goto ff;
			}
		}
		else if (m.x>100&&m.x<300&&m.y>30&&m.y<60)
		{
			setlinecolor(RED);
			rectangle(95, 25, 305, 65);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				//按姓名查找
				wchar_t ss[Namenum];
				InputBox(ss, Namenum, L"请输入姓名");
				int x = 65;
				int f = 0;
				for (int i = 0; i < s->count; i++)
				{
					if (memcmp(ss, s->stu[i].name, Namenum)==0)
					{
						settextcolor(RED);
						settextstyle(20, 0, L"宋体");   //设置文字形式
						setbkmode(TRANSPARENT);
						outtextxy(335, x, s->stu[i].name);
						outtextxy(455, x, s->stu[i].age);
						outtextxy(605, x, s->stu[i].sex);
						outtextxy(755, x, s->stu[i].num);
						outtextxy(905, x, s->stu[i].addr);
						f = 1;
						x += 10;
					}
				}
				if (f == 0)
				{
					HWND hnd = GetHWnd();
					SetWindowText(hnd, L"Add");
					MessageBox(hnd, L"查无此人", L"警告", MB_OKCANCEL);
				}
			}
		}
		else if (m.x>100&&m.x<300&&m.y>90&&m.y<2*60)
		{
			setlinecolor(RED);
			rectangle(95, 85, 305, 125);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				//按年龄查找
				wchar_t ss[Agenum];
				InputBox(ss, Agenum, L"请输入年龄");
				int x = 65;
				int f = 0;
				for (int i = 0; i < s->count; i++)
				{
					if (memcmp(ss, s->stu[i].age, Agenum) == 0)
					{
						settextcolor(RED);
						settextstyle(20, 0, L"宋体");   //设置文字形式
						setbkmode(TRANSPARENT);
						outtextxy(335, x, s->stu[i].name);
						outtextxy(455, x, s->stu[i].age);
						outtextxy(605, x, s->stu[i].sex);
						outtextxy(755, x, s->stu[i].num);
						outtextxy(905, x, s->stu[i].addr);
						f = 1;
						x += 10;
					}
				}
				if (f == 0)
				{
					HWND hnd = GetHWnd();
					SetWindowText(hnd, L"Add");
					MessageBox(hnd, L"查无此人", L"警告", MB_OKCANCEL);
				}
			}
		}
		else if (m.x > 100 && m.x < 300 && m.y>150 && m.y < 180)
		{
			setlinecolor(RED);
			rectangle(95, 145, 305, 185);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				//按电话查找
				wchar_t ss[Callnum];
				InputBox(ss, Callnum, L"请输入电话");
				int x = 65;
				int f = 0;
				for (int i = 0; i < s->count; i++)
				{
					if (memcmp(ss, s->stu[i].num, Callnum) == 0)
					{
						settextcolor(RED);
						settextstyle(20, 0, L"宋体");   //设置文字形式
						setbkmode(TRANSPARENT);
						outtextxy(335, x, s->stu[i].name);
						outtextxy(455, x, s->stu[i].age);
						outtextxy(605, x, s->stu[i].sex);
						outtextxy(755, x, s->stu[i].num);
						outtextxy(905, x, s->stu[i].addr);
						f = 2;
						x += 10;
					}
				}
				if (f == 0)
				{
					HWND hnd = GetHWnd();
					SetWindowText(hnd, L"Add");
					MessageBox(hnd, L"查无此人", L"警告", MB_OKCANCEL);
				}
			}
		}
		else if (m.x > 100 && m.x < 300 && m.y>210 && m.y < 240)
		{
			setlinecolor(RED);
			rectangle(95, 205, 305, 245);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				//按地址查找
				wchar_t ss[Addrnum];
				InputBox(ss, Addrnum, L"请输入地址");
				int x = 65;
				int f = 0;
				for (int i = 0; i < s->count; i++)
				{
					if (memcmp(ss, s->stu[i].addr, Addrnum) == 0)
					{
						settextcolor(RED);
						settextstyle(20, 0, L"宋体");   //设置文字形式
						setbkmode(TRANSPARENT);
						outtextxy(335, x, s->stu[i].name);
						outtextxy(455, x, s->stu[i].age);
						outtextxy(605, x, s->stu[i].sex);
						outtextxy(755, x, s->stu[i].num);
						outtextxy(905, x, s->stu[i].addr);

						x += 10;
					}
				}
				if (f == 0)
				{
					HWND hnd = GetHWnd();
					SetWindowText(hnd, L"Add");
					MessageBox(hnd, L"查无此人", L"警告", MB_OKCANCEL);
				}
			}
		}
		else
		{
			setlinecolor(WHITE);
			rectangle(95, 495, 205, 535);
			rectangle(95, 25, 305, 65);
			rectangle(95, 85, 305, 125);
			rectangle(95, 145, 305, 185);
			rectangle(95, 205, 305, 245);
		}
	
	}
	getchar();
ff:;
}

2.功能

该模块实现了按姓名查找,按年龄查找等如果没有查找到就会弹出查无此人如果有就输出

 2、删除(del)

1.代码

#include"easyx.h"

void del(M* s)
{
	MOUSEMSG m;
	initgraph(1024, 640);
	setbkcolor(WHITE);             //设置背景颜色白色
	cleardevice();

	IMAGE mm;                     //加载背景
	loadimage(&mm, L"ooo.jpg", 1024, 640);
	putimage(0, 0, &mm);

	setfillcolor(LIGHTBLUE);      //设置填充颜色
	fillrectangle(100, 30, 300, 60);//姓名
	fillrectangle(100, 500, 200, 530);//返回

	settextstyle(20, 0, L"宋体");   //设置文字形式
	setbkmode(TRANSPARENT);        //透明文字
	
	outtextxy(120, 510, L"返   回");
	outtextxy(150, 35, L"删除人姓名");

	while (1)
	{
		m = GetMouseMsg();
		if (m.x < 300 && m.x>100 && m.y > 500 && m.y < 530)
		{
			setlinecolor(RED);
			rectangle(95, 495, 205, 535);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				goto ff1;
			}
		}
		else if (m.x > 100 && m.x < 300 && m.y>30 && m.y < 60)
		{
			setlinecolor(RED);
			rectangle(95, 25, 305, 65);
			if (m.uMsg == WM_LBUTTONDOWN)
			{
				wchar_t ss[Namenum];
				InputBox(ss, Namenum, L"请输入姓名");
				int f = 0,k=0;
				for (int i = 0; i < s->count; i++)
				{
					if (memcmp(ss, s->stu[i].name, Namenum) == 0)
					{
						k = i;
						f = 1;
					}
				}
				if (f == 0)
				{
					HWND hnd = GetHWnd();
					SetWindowText(hnd, L"Add");
					MessageBox(hnd, L"查无此人", L"警告", MB_OKCANCEL);
				}
				else
				{
					for (int i = k; i < s->count-1; i++)
					{
						s->stu[i] = s->stu[i + 1];
		
					}
					s->count--;
					HWND hnd = GetHWnd();
					SetWindowText(hnd, L"Add");
					MessageBox(hnd, L"删除成功", L"提示", MB_OKCANCEL);
				}
				
			}
		}
		else
		{
			setlinecolor(WHITE);
			rectangle(95, 495, 205, 535);
			rectangle(95, 25, 305, 65);
		}
	}
	getchar();
ff1:;
}

2.功能

由于灭有优化,比较简陋,所以此模块仅有输入姓名删除,如果删除成功则弹窗删除成功,如果没有就弹出查无此人

3、其他模块

1.输出函数(print)

该模块后期可加入按不同的信息排序打印的按钮,目前界面只黑色,可换成表格

 2.录入文件(Writetxt)

void Writetxt(M* s)
{
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("fopen");
		HWND hnd = GetHWnd();
		SetWindowText(hnd, L"Add");
		MessageBox(hnd, L"导入失败", L"警告", MB_OKCANCEL);
		return;
	}

	for (int i = 0; i < s->count; i++)
	{
		fwrite(s->stu+i, sizeof(S), 1, pf);
	}

	fclose(pf);
	pf = NULL;
}

在退出文件时将数组中所有的联系人信息存入文件 

  • 35
    点赞
  • 225
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 41
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1886i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值