东南大学吴健雄学院22级期中大作业,为了体现创新性自学EasyX去尝试写一个图形化界面;
代码分为三个模块,头文件,首页,其余部分;
其实可以一个文件写完,按照老师要求尝试使用多个文件协同;
代码实现了图书的借阅,查询,修改等基础功能,可以显示图书名字,作者,图书总量,在馆总量,借出数,后续可能增加关键词查找(模糊查找功能);
部分运行图片:
图形化代码参考了其他几位大佬,在他们的基础上进行了一定修改,没有讲到指针,故代码没有使用链表.
这里是头文件以及函数的声明
#pragma once
#include<cstdlib>//exit的使用
#include<graphics.h>
#include<conio.h>
#include <cstdio>
#include <stdlib.h>//动态分配内存
#include<cstring>
#include<ctype.h>//检测字符
#include<stdbool.h>//bool
#include<iostream>
#include<fstream>
#define RecordNums 15//结构体数组数量
using namespace std;
//函数声明
void Startup();
void FirstPage();
void AdminSignIn();//管理员登录界面
void AdminPage();//进入管理员界面
void CommonUserPage();//进入普通用户界面
void InputInfor();//录入图书信息到文件中
void SaveInfor();//保存录入的图书信息
void ReadInfor();//读取文件
void AdDeSeMoPage();//增删改查界面
bool BookFormat(char PerStr[]);//判断图书名格式
void SimplePrint();//单纯打印一遍
void ShowAllInfor();//显示全部数据
int ReturnPosition();//接收用户要查询的信息下标
int RePosition();//返回借阅图书的下标
void PrintFoudInfor(int Position);//打印找到的信息
void PrintFoudInfor();//查询的整体调用
void DesignateBook();//指定位置删除
void ModifyBookInfor();//修改信息
void DeleteBookInfor();//彻底清空
void BorrowReturnPage();//借阅归还界面
void BorrowBook();//借阅图书
void ReturnBook();//归还图书
//创建图书结构体
struct Book
{
char title[20];//书名
char author[20];//作者
char total[2];//总量
char borrow[2];//借出数
char exist[2];//现在在馆量
};
//创建管理员结构体
struct Admin
{
char UserName[64];
char PassWord[64];
};
这里是两个cpp文件
#include"File.h"
IMAGE img_bk;//背景图片
void FirstPage()//首页画面
{
//进入程序首先读取数据——获得当前NowBookNums
ReadInfor();
cleardevice();
BeginBatchDraw();//开始批量绘图
putimage(0, 0, &img_bk);//输出图片
setbkmode(TRANSPARENT);//设置背景模式透明
setfillcolor(GREEN);//填充颜色
//大标题
settextstyle(60, 0, "黑体");
outtextxy(150, 100, "图书信息管理系统");
//首页三个选项的背景
fillrectangle(230, 445, 560, 490);
fillrectangle(230, 505, 560, 550);
fillrectangle(230, 565, 560, 610);
setbkmode(TRANSPARENT);
//三个选项的文字
settextstyle(40, 0, "黑体");
//首页三个选项
outtextxy(240, 450, "管理员操作界面");
outtextxy(240, 510, "普通用户操作界面");
outtextxy(240, 570, "退出系统");
EndBatchDraw();//执行未完成的输入任务,并结束批量绘制
//鼠标操作1
MOUSEMSG m1;
//进入主界面选项操作界面
while (1)
{
m1 = GetMouseMsg();//获取鼠标操作
if (m1.x >= 230 && m1.x <= 560 && m1.y >= 445 && m1.y <= 490)//管理员界面
{
setlinecolor(RED);//选中后画红
rectangle(230, 445, 560, 490);//画红边框
if (m1.uMsg == WM_LBUTTONDOWN)//鼠标按下左键后
{
AdminSignIn();//进入管理员界面
}
}
else if (m1.x >= 230 && m1.x <= 560 && m1.y >= 505 && m1.y <= 550)//普通用户界面
{
setlinecolor(RED);
rectangle(230, 505, 560, 550);
if (m1.uMsg == WM_LBUTTONDOWN)
{
CommonUserPage();
}
}
else if (m1.x >= 230 && m1.x <= 560 && m1.y >= 565 && m1.y <= 610)//退出
{
setlinecolor(RED);
rectangle(230, 565, 560, 610);
if (m1.uMsg == WM_LBUTTONDOWN)
{
exit(0);
}
}
//鼠标不在上面悬停
//那么我们显然要画白框框
else
{
setlinecolor(WHITE);
rectangle(230, 445, 560, 490);
rectangle(230, 505, 560, 550);
rectangle(230, 565, 560, 610);
}
}
}
#include"File.h"
#include"FirstPage.cpp"
int NowBookNums = 0;//当前记录了多少条图书信息
int FlagAI = -1;//显示全部数据的页面跳转标识
//1为管理员,-1为普通用户
int FlagFPT = -1;//查询找到页面跳转标识
//1为管理员,-1为普通用户
Book LibraryArry[RecordNums];//创建图书结构体数组
Admin AdminUser;//创建一个管理员用户
int main()
{
Startup();//数据初始化
while (1)
{
FirstPage();//显示画面
}
return 0;
}
//先搭图形窗口
//逐步实现
void Startup()//初始化数据读入图
{
initgraph(760, 760);
loadimage(&img_bk, "background.jpeg", 760, 760);//读取图片
}
//right
//管理员界面
void AdminPage()
{
initgraph(760, 760);
cleardevice();//清屏函数
//定义第二个鼠标操作
MOUSEMSG m2;
cleardevice();
IMAGE img_bk;;
loadimage(&img_bk, "admin.jpg", 760, 760);//读图
putimage(0, 0, &img_bk);
setfillcolor(GREEN);
setbkmode(TRANSPARENT);
settextstyle(50, 0, "黑体");
outtextxy(50, 150, "管");
outtextxy(50, 210, "理");
outtextxy(50, 270, "员");
outtextxy(50, 330, "操");
outtextxy(50, 390, "作");
outtextxy(50, 450, "界");
outtextxy(50, 510, "面");
setbkmode(TRANSPARENT);//透明背景
//三个选项的背景
fillrectangle(230, 240, 560, 285);
fillrectangle(230, 370, 560, 415);
fillrectangle(230, 500, 560, 545);
setbkmode(TRANSPARENT);//透明背景
//三个选项的文字
settextstyle(40, 0, "黑体");
//三个选项
outtextxy(270, 240, "显示所有数据");
outtextxy(270, 370, "增删查改数据");
outtextxy(350, 500, "返回");
EndBatchDraw();//这个函数用于结束批量绘制,并执行未完成的绘制任务。
//进入主界面选项操作界面
while (1)
{
m2 = GetMouseMsg();//获取鼠标操作鼠标的坐标值,应该是一个结构体
if (m2.x >= 230 && m2.x <= 560 && m2.y >= 240 && m2.y <= 285)//显示所有数据
{
setlinecolor(RED);//同第一个画线
rectangle(230, 240, 560, 285);
if (m2.uMsg == WM_LBUTTONDOWN)//按下左键
{
FlagAI = -1;//这里赋值-1是为了后续跳转回原来的管理员界面
//不然管理员做一件事就回到主界面太弱智了
ReadInfor();//这个函数是读入
ShowAllInfor();//这个函数是为了展示界面
}
}
else if (m2.x >= 230 && m2.x <= 560 && m2.y >= 370 && m2.y <= 415)//增删数据
{
setlinecolor(RED);
rectangle(230, 370, 560, 415);
if (m2.uMsg == WM_LBUTTONDOWN)
{
AdDeSeMoPage();
}
}
else if (m2.x >= 230 && m2.x <= 560 && m2.y >= 500 && m2.y <= 545)//返回
{
setlinecolor(RED);
rectangle(230, 500, 560, 545);
if (m2.uMsg == WM_LBUTTONDOWN)
{
cleardevice();
FirstPage();
}
}
//没点到显示白色
else
{
setlinecolor(WHITE);
rectangle(230, 240, 560, 285);
rectangle(230, 370, 560, 415);
rectangle(230, 500, 560, 545);
}
}
}
//right
//普通用户界面
void CommonUserPage()
{
initgraph(760, 760);
cleardevice();
//定义第三个鼠标操作
MOUSEMSG m3;
cleardevice();//清屏
BeginBatchDraw();
//这个函数用于开始批量绘图。执行后,任何绘图操作都将暂时不输出到绘图窗口上
//直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出
IMAGE img_bk;//声明图片
loadimage(&img_bk, "CommonUserPage.jpg", 760, 760);
putimage(0, 0, &img_bk);//从左上角开始铺展图片
setbkmode(TRANSPARENT);//透明
setfillcolor(GREEN);//绿色背景
settextstyle(50, 0, "黑体");
outtextxy(50, 150, "普");
outtextxy(50, 210, "通");
outtextxy(50, 270, "用");
outtextxy(50, 330, "户");
outtextxy(50, 390, "操");
outtextxy(50, 450, "作");
outtextxy(50, 510, "界");
outtextxy(50, 570, "面");
setbkmode(TRANSPARENT);
//三个选项的背景
//4个数据,前两个坐上角坐标点,后两个右下角坐标点
fillrectangle(230, 150, 560, 200);//这个函数用于画有边框的填充矩形。
fillrectangle(230, 300, 560, 350);
fillrectangle(230, 450, 560, 500);
fillrectangle(230, 600, 560, 650);
setbkmode(TRANSPARENT);//透明
//三个选项的文字
settextstyle(30, 0, "黑体");
outtextxy(310, 160, "显示所有数据");//高,宽,字符;
outtextxy(320, 310, "查询数据");
outtextxy(320, 460, "借阅/归还");
outtextxy(350, 610, "返回");
EndBatchDraw();//这个函数用于结束批量绘制,并执行未完成的绘制任务。
//进入主界面选项操作界面
while (1)
{
m3 = GetMouseMsg();//获取鼠标操作
//这个函数用于获取一个鼠标消息。如果当前鼠标消息队列中没有,就一直等待。
//简单来说就是获取鼠标的位置的
if (m3.x >= 230 && m3.x <= 560 && m3.y >= 150 && m3.y <= 200)//选项1 显示所有数据
{
setlinecolor(RED);
rectangle(230, 150, 560, 200);
if (m3.uMsg == WM_LBUTTONDOWN)//左键点击
{
FlagAI = 1;
ReadInfor();
ShowAllInfor();
CommonUserPage();
}
}
else if (m3.x >= 230 && m3.x <= 560 && m3.y >= 300 && m3.y <= 350)//选项2 查询数据
{
setlinecolor(RED);
rectangle(230, 300, 560, 350);
if (m3.uMsg == WM_LBUTTONDOWN)
{
FlagFPT = -1;
PrintFoudInfor();
CommonUserPage();
}
}
else if (m3.x >= 230 && m3.x <= 560 && m3.y >= 450 && m3.y <= 500)//选项3——借阅、归还
{
setlinecolor(RED);
rectangle(230, 450, 560, 500);
if (m3.uMsg == WM_LBUTTONDOWN)
{
BorrowReturnPage();
}
}
else if (m3.x >= 230 && m3.x <= 560 && m3.y >= 600 && m3.y <= 650)//选项4——返回
{
setlinecolor(RED);
rectangle(230, 600, 560, 650);
if (m3.uMsg == WM_LBUTTONDOWN)
{
cleardevice();
FirstPage();
}
}
//没点到显示白色
else
{
setlinecolor(WHITE);
rectangle(230, 150, 560, 200);
rectangle(230, 300, 560, 350);
rectangle(230, 450, 560, 500);
rectangle(230, 600, 560, 650);
}
}
}
//rihgt
//三个页面的设计结束
void InputInfor()//图书信息录入
{
while (1)
{
InputBox(LibraryArry[NowBookNums].title, 20, "请输入需要录入的图书名称:");//显示一个输入框,
if (BookFormat(LibraryArry[NowBookNums].title))//为真跳出循环
{
break;
}
}
while (1)
{
InputBox(LibraryArry[NowBookNums].author, 20, "请输入需要录入的图书作者名称:");//显示一个输入框,
if (BookFormat(LibraryArry[NowBookNums].author))//为真跳出循环
{
break;
}
}
while (1)
{
InputBox(LibraryArry[NowBookNums].total, 20, "请输入需要录入的图书总数为:");//显示一个输入框,
if (BookFormat(LibraryArry[NowBookNums].total))//为真跳出循环
{
break;
}
}
while (1)
{
InputBox(LibraryArry[NowBookNums].borrow, 20, "请输入需要录入的图书借出数为:");//显示一个输入框,
if (BookFormat(LibraryArry[NowBookNums].borrow))//为真跳出循环
{
break;
}
}
while (1)
{
InputBox(LibraryArry[NowBookNums].exist, 20, "请输入需要录入的图书馆藏数为:");//显示一个输入框,
if (BookFormat(LibraryArry[NowBookNums].exist))//为真跳出循环
{
break;
}
}
SaveInfor();
}
//判断输入的图书名字格式是否正确
bool BookFormat(char PerStr[])
{
return true;
}
//文件读入后bool值返回真让循环跳出
//保存数据到文件中
void SaveInfor()
{
if (strlen(LibraryArry[NowBookNums].title) != 0 && strlen(LibraryArry[NowBookNums].author) != 0 )
{
fstream myFile;
myFile.open("BookList.txt", ios::app); // append,追加
myFile << LibraryArry[NowBookNums].title<<" "
<< LibraryArry[NowBookNums].author << " "
<<LibraryArry[NowBookNums].total<<" "
<<LibraryArry[NowBookNums].borrow << " "
<<LibraryArry[NowBookNums].exist << endl;
myFile.close();
NowBookNums++;//录入完毕,记录数加一
}
}
//抹除全部数据再保存——主要用于修改功能
void SaveInforModi()
{
//先删掉,但是不将人数置空所以不能调用之前的删除函数
fstream myFile;
myFile.open("BookList.txt", ios::trunc ); //- 删除现有文件中的数据
myFile.open("BookList.txt", ios::out);//写入
for (int i = 0; i < NowBookNums; i++)
{
if (strlen(LibraryArry[i].title) != 0 && strlen(LibraryArry[i].author) != 0 )
{
myFile << LibraryArry[i].title<<" "
<< LibraryArry[i].author<<" "
<< LibraryArry[i].total<<" "
<<LibraryArry[i].borrow<<" "
<< LibraryArry[i].exist<<endl;
}
}
myFile.close();
}
//读取文件中的信息,同步到结构体数组中
void ReadInfor()
{
fstream myFile;
myFile.open("BookList.txt", ios::in); // 只读
//将文件中的数据读取到当前的结构体数组中
for (int i = 0; i < RecordNums; i++)
{
myFile >> LibraryArry[i].title
>> LibraryArry[i].author
>> LibraryArry[i].total
>> LibraryArry[i].borrow
>> LibraryArry[i].exist;
}
int FileBookNums = 0;//文件中的记录数
for (int i = 0; i < RecordNums; i++)//最多读15本书,读入前先判断标题是否为空
{
if (strlen(LibraryArry[i].title) != 0)
{
NowBookNums = ++FileBookNums;//双自增
}
}
myFile.close();
}
//增删改查界面
void AdDeSeMoPage()
{
BeginBatchDraw();
initgraph(760, 760);
cleardevice();
//定义鼠标操作
MOUSEMSG SL;
cleardevice();
IMAGE img_bk;
loadimage(&img_bk, "BookListGround.jpg", 760, 760);
putimage(0, 0, &img_bk);
setbkmode(TRANSPARENT);
setfillcolor(GREEN);
setfillcolor(GREEN);
fillrectangle(640, 90, 720, 140);//增加
fillrectangle(640, 190, 720, 240);//删除
fillrectangle(640, 290, 720, 340);//查找
fillrectangle(640, 390, 720, 440);//修改
fillrectangle(640, 490, 720, 540);//清空
fillrectangle(640, 590, 720, 640);//返回
//表头文字部分
setbkmode(TRANSPARENT);
settextstyle(30, 0, "黑体");
outtextxy(0, 0, "图书名称");
outtextxy(150, 0, "作者");
outtextxy(300, 0, "图书总数");
outtextxy(450, 0, "借出数");
outtextxy(600, 0, "馆藏数");
outtextxy(650, 30, "选项");
outtextxy(650, 100, "添加");
outtextxy(650, 200, "删除");
outtextxy(650, 300, "查找");
outtextxy(650, 400, "修改");
outtextxy(650, 500, "清空");
outtextxy(650, 600, "返回");
EndBatchDraw();//执行未完成任务,并退出画图
while (1)
{
SL = GetMouseMsg();
if (SL.x >= 640 && SL.x <= 720 && SL.y >= 90 && SL.y <= 140)//增加
{
setlinecolor(RED);
rectangle(640, 90, 720, 140);
if (SL.uMsg == WM_LBUTTONDOWN)
{
//添加
InputInfor();
cleardevice();
//完成操作重新载入——刷新
AdDeSeMoPage();
}
}
else if (SL.x >= 640 && SL.x <= 720 && SL.y >= 190 && SL.y <= 240)//删除
{
setlinecolor(RED);
rectangle(640, 190, 720, 240);
if (SL.uMsg == WM_LBUTTONDOWN)
{
DesignateBook();
AdDeSeMoPage();
}
}
else if (SL.x >= 640 && SL.x <= 720 && SL.y >= 290 && SL.y <= 340)//查找
{
setlinecolor(RED);
rectangle(640, 290, 720, 340);
if (SL.uMsg == WM_LBUTTONDOWN)//按下左键
{
FlagFPT = 1;
PrintFoudInfor();
AdDeSeMoPage();
}
}
else if (SL.x >= 640 && SL.x <= 720 && SL.y >= 390 && SL.y <= 440)//修改
{
setlinecolor(RED);
rectangle(640, 390, 720, 440);
if (SL.uMsg == WM_LBUTTONDOWN)
{
ModifyBookInfor();
AdDeSeMoPage();
}
}
else if (SL.x >= 640 && SL.x <= 720 && SL.y >= 490 && SL.y <= 540)//清空
{
setlinecolor(RED);
rectangle(640, 490, 720, 540);
if (SL.uMsg == WM_LBUTTONDOWN)
{
//确保误删——弹窗加以提示
HWND hwndDel = GetHWnd();
int isok = MessageBox(hwndDel, "确认清空?", "提示", MB_OKCANCEL);
if (isok == IDOK)
{
DeleteBookInfor();
AdDeSeMoPage();
}
else if (isok == IDCANCEL)
{
//点击取消不做反应
}
}
}
else if (SL.x >= 640 && SL.x <= 720 && SL.y >= 590 && SL.y <= 640)//返回
{
//返回
setlinecolor(RED);
rectangle(640, 590, 720, 640);
if (SL.uMsg == WM_LBUTTONDOWN)
{
cleardevice();
//完成操作重新载入——刷新
AdminPage();
}
}
//鼠标不悬停
else
{
setlinecolor(WHITE);
rectangle(640, 90, 720, 140);//增
rectangle(640, 190, 720, 240);//删
rectangle(640, 290, 720, 340);//查
rectangle(640, 390, 720, 440);//改
rectangle(640, 490, 720, 540);//清
rectangle(640, 590, 720, 640);//返
}
}
}
void SimplePrint()
{
//Null的话结束
if (NowBookNums == 0)
{
settextstyle(50, 0, "黑体");
outtextxy(200, 200, "当前记录为空!");
return;
}
for (int i = 1; i <= NowBookNums; i++)
{
//顺序
settextstyle(30, 0, "黑体");
char Nums[5];
sprintf(Nums, "%d", i);
//缩放字体
settextstyle(25, 0, "黑体");
outtextxy(0, 40 + 40 * i, LibraryArry[i - 1].title);//输出书名
outtextxy(150, 40 + 40 * i, LibraryArry[i - 1].author);//作者
outtextxy(300, 40 + 40 * i, LibraryArry[i - 1].total);//总数
outtextxy(450, 40 + 40 * i, LibraryArry[i - 1].borrow);//借出
outtextxy(600, 40 + 40 * i, LibraryArry[i - 1].exist);//现存
}
}
//显示所有数据
void ShowAllInfor()
{
BeginBatchDraw();
//这个函数用于开始批量绘图。执行后,任何绘图操作都将暂时不输出到绘图窗口上
//直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出。
initgraph(760, 760);
cleardevice();
//定义第三个鼠标操作
MOUSEMSG SA;
cleardevice();
IMAGE img_bk;
loadimage(&img_bk, "BookListGround.jpg", 760, 760);//书本数据的界面
putimage(0, 0, &img_bk);
setbkmode(TRANSPARENT);
setfillcolor(GREEN);
fillrectangle(640, 590, 720, 640);
settextstyle(30, 0, "黑体");
outtextxy(0, 0, "图书名称");
outtextxy(150, 0, "作者");
outtextxy(300, 0, "图书总数");
outtextxy(450, 0, "借出数");
outtextxy(600, 0, "馆藏数");
outtextxy(650, 600, "返回");
SimplePrint();//打印
EndBatchDraw();
while (1)
{
SA = GetMouseMsg();
if (SA.x >= 640 && SA.x <= 720 && SA.y >= 590 && SA.y <= 640)
{
//返回
setlinecolor(RED);
rectangle(640, 590, 720, 640);
if (SA.uMsg == WM_LBUTTONDOWN)
{
cleardevice();
if (FlagAI == -1)
{
AdminPage();//-1就是管理员界面
}
if (FlagAI == 1)
{
CommonUserPage();//1就是普通用户界面
}
}
}
}
}
//返回要查找、修改、删除人所在的结构体的下标
int ReturnPosition()
{
//接受用户输入
char ReceInput[64];
InputBox(ReceInput, 10, "请输入书名或者作者名进行操作");//显示一个输入框
//进行循环查找,一旦相同就跳出循环
for (int i = 0; i < NowBookNums; i++)
{
if (strcmp(LibraryArry[i].title, ReceInput) == 0 || strcmp(LibraryArry[i].author, ReceInput) == 0)//返回0表示两个字符串相等
{
return i;
}
}
//如果没找到就返回-1
return -1;
}
int RePosition()//借阅结构体下标,返回一个int整形数;
{
//接受用户输入
char ReceInput[64];
InputBox(ReceInput, 10, "请输入书名或者作者名进行操作");//显示一个输入框
for (int w = 0; w < RecordNums; w++)//进行循环查找,一旦相同就跳出循环
{
if (strcmp(LibraryArry[w].title, ReceInput) == 0 || strcmp(LibraryArry[w].author, ReceInput) == 0)//返回0表示两个字符串相等
{
return w;
}
//strcmp用法:
/*该函数返回值如下:
如果返回值小于 0,则表示 str1 小于 str2。
如果返回值大于 0,则表示 str1 大于 str2。
如果返回值等于 0,则表示 str1 等于 str2。*/
}
//如果没找到就返回-1
return -1;
}
//打印找到的信息
void PrintFoudInfor(int Position)
{
BeginBatchDraw();//批量绘图
initgraph(760, 760);
cleardevice();//使用当前背景色清空
//定义第三个鼠标操作
MOUSEMSG PFI;
cleardevice();
IMAGE img_bk;
loadimage(&img_bk, "BookListGround.jpg", 760, 760);
putimage(0, 0, &img_bk);
setbkmode(TRANSPARENT);
setfillcolor(GREEN);
fillrectangle(640, 590, 720, 640);//
settextstyle(30, 0, "黑体");
outtextxy(0, 0, "图书名称");
outtextxy(150, 0, "作者");
outtextxy(300, 0, "总数");
outtextxy(450, 0, "借出");
outtextxy(600, 0, "馆藏");
outtextxy(650, 600, "返回");
//打印找到的信息
outtextxy(0, 80, LibraryArry[Position].title);//输出书名
outtextxy(150, 80, LibraryArry[Position].author);
outtextxy(300, 80, LibraryArry[Position].total);
outtextxy(450, 80, LibraryArry[Position].borrow);
outtextxy(600, 80, LibraryArry[Position].exist);
FlushBatchDraw();
EndBatchDraw();
while (1)
{
PFI = GetMouseMsg();
if (PFI.x >= 640 && PFI.x <= 720 && PFI.y >= 590 && PFI.y <= 640)
{
//返回
setlinecolor(RED);
rectangle(640, 590, 720, 640);
if (PFI.uMsg == WM_LBUTTONDOWN)
{
cleardevice();
if (FlagFPT == 1)
{
AdDeSeMoPage();
}
else if (FlagFPT == -1)
{
CommonUserPage();
}
}
}
else
{
setlinecolor(WHITE);
rectangle(640, 590, 720, 640);
}
}
}
//最终负责查询调用的函数
void PrintFoudInfor()
{
//定义一个变量用来接收下标
int TempPosi = ReturnPosition();//-1是没找到的返回值
if (TempPosi == -1)//没找到
{
//获取窗口句柄
HWND hndtipsF = GetHWnd();
//用一个字符数组来总结句子
int isok = MessageBox(hndtipsF, "系统未录入此图书!", "提示", MB_OK);
}
else//找到了——打印输出
{
cleardevice();
PrintFoudInfor(TempPosi);
}
}
//修改信息,找到返回下标,重新给他赋值,保存,否则直接弹窗警告
void ModifyBookInfor()
{
//直接套用上面查找的操作,在此基础上加一行修改前
//因为需要得到要修改人在结构体数组中的位置-下标,所以不能将函数直接拿过来用,得粘贴过来
//定义一个变量用来接收下标
int TempModi = ReturnPosition();
if (TempModi == -1)//没找到
{
//获取窗口句柄
HWND hndtipsM = GetHWnd();
//用一个字符数组来总结句子
int isok = MessageBox(hndtipsM, "抱歉,没有这本书!", "提示", MB_OK);
}
else//找到了这本书进行下面的操作
{
BeginBatchDraw();
initgraph(760, 760);
cleardevice();
//定义第三个鼠标操作
MOUSEMSG Modi;
cleardevice();
IMAGE img_bk;
loadimage(&img_bk, "BookListGround.jpg", 760, 760);
putimage(0, 0, &img_bk);
setbkmode(TRANSPARENT);
setfillcolor(GREEN);
fillrectangle(640, 590, 720, 640);
settextstyle(50, 0, "黑体");
outtextxy(0, 0, "修改前");
outtextxy(0, 350, "修改后");
settextstyle(30, 0, "黑体");
outtextxy(0, 70, "图书名称");
outtextxy(150, 70, "作者");
outtextxy(300, 70, "总数");
outtextxy(450, 70, "借出");
outtextxy(600, 70, "馆藏");
outtextxy(650, 600, "返回");
//修改后
outtextxy(0, 70, "图书名称");
outtextxy(150, 70, "作者");
outtextxy(300, 70, "总数");
outtextxy(450, 70, "借出");
outtextxy(600, 70, "馆藏");
outtextxy(650, 600, "返回");
//打印找到的信息
outtextxy(0, 110, LibraryArry[TempModi].title);//输出书名
outtextxy(150, 110, LibraryArry[TempModi].author);
outtextxy(300, 110, LibraryArry[TempModi].total);//输出总数
outtextxy(450, 110, LibraryArry[TempModi].borrow);//输出借出数
outtextxy(600, 110, LibraryArry[TempModi].exist);//输出存量
EndBatchDraw();
while (1)
{
//接收输入的修改后的值覆盖进去
char TempModiNums[64];
InputBox(LibraryArry[TempModi].title, 20, "请输入修改后的书名");
if (BookFormat(LibraryArry[TempModi].title))
{
break;
}
}
while (1)
{
//接收输入的修改后的值覆盖进去
char TempModiNums[64];
InputBox(LibraryArry[TempModi].author, 20, "请输入修改后的作者名");
if (BookFormat(LibraryArry[TempModi].author))
{
break;
}
}
while (1)
{
//接收输入的修改后的值覆盖进去
char TempModiNums[64];
InputBox(LibraryArry[TempModi].total, 20, "请输入修改后的图书总数");
if (BookFormat(LibraryArry[TempModi].total))
{
break;
}
}
while (1)
{
//接收输入的修改后的值覆盖进去
char TempModiNums[64];
InputBox(LibraryArry[TempModi].borrow, 20, "请输入修改后的借出数");
if (BookFormat(LibraryArry[TempModi].borrow))
{
break;
}
}
while (1)
{
//接收输入的修改后的值覆盖进去
char TempModiNums[64];
InputBox(LibraryArry[TempModi].exist, 20, "请输入修改后的馆藏数");
if (BookFormat(LibraryArry[TempModi].exist))
{
break;
}
}
outtextxy(0, 410, LibraryArry[TempModi].title);//输出书名
outtextxy(150, 410, LibraryArry[TempModi].author);
outtextxy(300, 410, LibraryArry[TempModi].total);
outtextxy(450, 410, LibraryArry[TempModi].borrow);
outtextxy(600, 410, LibraryArry[TempModi].exist);
SaveInforModi();
}
}
//删除指定图书信息
void DesignateBook()
{
//先查找,找到返回下标,删除后下标后的数据前移,NowBookNums--
//查不到就查无此人
//定义一个变量来接收下标
int TempDelt = ReturnPosition();
if (TempDelt == -1)//没找到
{
HWND hndtipsD = GetHWnd();//获取窗口句柄
int isok = MessageBox(hndtipsD, "没有这本书的图书信息!", "提示", MB_OK);
}
else
{
//找到了就提示是否确定删除
//获取窗口句柄
HWND hndtipsDS = GetHWnd();
//用一个字符数组来总结句子
int isok = MessageBox(hndtipsDS, "确定删除?", "提示", MB_OKCANCEL);
if (isok == IDOK)
{
//确定删除操作
//将这个元素的后一个依次迁移
for (int d = TempDelt; d < NowBookNums; d++)
{
LibraryArry[d] = LibraryArry[d + 1];
}
//现在的人数-1
NowBookNums--;
//删除完成只是将当前结构体里面的数据清除了,但是文件中并没有作出更改
//更新到文件中
SaveInforModi();//用这个全部清空的函数,再对文件进行重写
}
else if (isok == IDCANCEL)
{
//取消删除不执行任何操作
}
}
}
//图书信息借阅,归还界面
void BorrowReturnPage()
{
initgraph(760, 760);
cleardevice();
//定义第三个鼠标操作
MOUSEMSG m3;
cleardevice();
BeginBatchDraw();
IMAGE img_bk;
loadimage(&img_bk, "admin.jpg", 760, 760);
putimage(0, 0, &img_bk);
setbkmode(TRANSPARENT);
setfillcolor(GREEN);
setbkmode(TRANSPARENT);
//两个选项的背景
fillrectangle(230, 300, 560, 350);
fillrectangle(230, 450, 560, 500);
fillrectangle(230, 600, 560, 650);
setbkmode(TRANSPARENT);
//三个选项的文字
settextstyle(30, 0, "黑体");
//三个选项
outtextxy(320, 310, "借阅图书");
outtextxy(320, 460, "归还图书");
outtextxy(350, 610, "返回");
EndBatchDraw();
//进入主界面选项操作界面
while (1)
{
m3 = GetMouseMsg();//获取鼠标操作
if (m3.x >= 230 && m3.x <= 560 && m3.y >= 300 && m3.y <= 350)//借阅
{
setlinecolor(RED);
rectangle(230, 300, 560, 350);
if (m3.uMsg == WM_LBUTTONDOWN)
{
BorrowBook();
}
}
else if (m3.x >= 230 && m3.x <= 560 && m3.y >= 450 && m3.y <= 500)//归还
{
setlinecolor(RED);
rectangle(230, 450, 560, 500);
if (m3.uMsg == WM_LBUTTONDOWN)
{
ReturnBook();
}
}
else if (m3.x >= 230 && m3.x <= 560 && m3.y >= 600 && m3.y <= 650)//选项4——返回
{
setlinecolor(RED);
rectangle(230, 600, 560, 650);
if (m3.uMsg == WM_LBUTTONDOWN)
{
cleardevice();
CommonUserPage();
}
}
//鼠标不在上面悬停
else
{
setlinecolor(WHITE);
rectangle(230, 300, 560, 350);
rectangle(230, 450, 560, 500);
rectangle(230, 600, 560, 650);
}
}
}
//图书借阅
void BorrowBook()
{
//定义一个变量用来接收下标
int TempBorr = ReturnPosition();
if (TempBorr == -1|| LibraryArry[TempBorr].exist[0] == '0')//没找到
{
//获取窗口句柄
HWND hndtipsF = GetHWnd();
//用一个字符数组来总结句子
int isok = MessageBox(hndtipsF, "无法借阅!", "提示", MB_OK);
}
else//找到了——将借阅出去的图书信息存储到另一个文件中,归还时重新读入
{
if (strlen(LibraryArry[TempBorr].title) != 0 && strlen(LibraryArry[TempBorr].author) != 0)
{
fstream myFile;
myFile.open("Borrow.txt", ios::app); // append,追加
LibraryArry[TempBorr].borrow[0] += 1;
LibraryArry[TempBorr].exist[0] -= 1;
myFile << LibraryArry[TempBorr].title <<" "
<< LibraryArry[TempBorr].author<<" "
<< LibraryArry[TempBorr].total <<" "
<< LibraryArry[TempBorr].borrow << " "
<< LibraryArry[TempBorr].exist <<endl;
myFile.close();//关闭文件
}
SaveInforModi();
HWND hndtipsF = GetHWnd();
int isok = MessageBox(hndtipsF, "借阅成功", "提示", MB_OK);
}
}
//归还图书
void ReturnBook()
{
int TempBorr = RePosition();
if (TempBorr == -1|| LibraryArry[TempBorr].borrow[0]=='0')//没找到
{
//获取窗口句柄
HWND hndtipsF = GetHWnd();//获得窗口句柄
//在 Windows 下,句柄是一个窗口的标识
//得到句柄后,可以使用 Windows API 中的函数实现对窗口的控制。
//用一个字符数组来总结句子
int isok = MessageBox(hndtipsF, "归还失败!", "提示", MB_OK);
}
else//找到了——将借阅出去的图书信息存储到另一个文件中,归还时重新读入
{
LibraryArry[TempBorr].borrow[0] -=1;
LibraryArry[TempBorr].exist[0] += 1;
fstream myFile;
//myFile.open("BookList.txt", ios::trunc); //- 删除现有文件中的数据
myFile.open("BookList.txt", ios::out);//写入
for (int i = 0; i < RecordNums; i++)
{
if (strlen(LibraryArry[i].title) != 0 && strlen(LibraryArry[i].author) != 0 )
{
myFile << LibraryArry[i].title << " "
<< LibraryArry[i].author << " "
<< LibraryArry[i].total << " "
<< LibraryArry[i].borrow << " "
<< LibraryArry[i].exist << endl;
}
}
myFile.close();
HWND hndtipsF = GetHWnd();
int isok = MessageBox(hndtipsF, "归还成功", "提示", MB_OK);
}
}
//彻底清空,删除文件
void DeleteBookInfor()
{
remove("BookList.txt");
//置空当前纪录信息数
NowBookNums = 0;
}
//管理员登录
void AdminSignIn()
{
ifstream AdminSignIn;
AdminSignIn.open("AdminSignIn.txt", ios::in);
AdminSignIn >> AdminUser.UserName >> AdminUser.PassWord;
AdminSignIn.close();// 关闭文件
char ReceAcctNumber[64];
InputBox(ReceAcctNumber, 10, "请输入用户名");
char ReceAcctPassWord[64];
InputBox(ReceAcctPassWord, 10, "请输入密码");
//如果用户名和密码都正确才进度到管理员界面
//否则弹窗提示错误
if (strcmp(AdminUser.UserName, ReceAcctNumber) == 0 && strcmp(AdminUser.PassWord, ReceAcctPassWord) == 0)
{
cleardevice();//清屏
AdminPage();
}
else
{
HWND SignError = GetHWnd();//这个函数用于获取绘图窗口句柄。
int isok = MessageBox(SignError, "用户名或密码错误!", "提示", MB_OK);
}
}
//由于比较懒,所有书籍只能存放个位数的书,不然会出错,一个简单的系统不整太多花的
//没有实现拼音排序的功能,不是很清楚这个要怎么做;
//目前仍在迭代,到周四晚上答辩可能会有所更新
//感谢王同学,朱同学,赵同学的合作与交流