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