栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

目录

一、编译环境

1、VS2022

2、Easyx库

二、功能结构

 三、遇到的问题

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

 2、

四、头文件(准备工作)

1、代码

 

2、头文件(库)

3、预处理

4、联系人信息结构体

5、函数声明

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

1、展示

2、主要模块

1.mian函数

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
#include
#include
#include
#include

#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
#include
#include
#include
#include


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.mian函数

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

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;
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/874921.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号