目录
一、编译环境
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 5struct 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;
}
在退出文件时将数组中所有的联系人信息存入文件