大一上课程设计—通讯录管理系统

 源文件 主.cpp 内容:

#include<graphics.h>
#include<iostream>  //要在 C++ 中进行文件处理,必须在 C++ 源代码文件中包含头文件 <iostream> 和 <fstream>
#include<fstream>
#include<string>
#include<cstring>
#include<algorithm>

#include"EasyX载入PNG图时透明背景.h"
#pragma comment(lib,"MSIMG32.LIB")//与 putimage_alpha 函数搭配使用

#include<mmsystem.h> //这两个与音乐播放有关
#pragma comment(lib,"winmm.lib")

using namespace std;

//
//全局变量声明区
IMAGE start1, start2, background_1, background_2;
IMAGE text1, text2, text3, text4, text5, text6, text7;
IMAGE text1_1, text2_2, text3_3, text4_4, text5_5, text6_6, text7_7;
IMAGE fanhui_bai, fanhui_hei;
IMAGE kai, guan;
int flag = 0;

struct PEOPLE_MSG
{
	char name[100];
	char address[100];
	char phone_number[100];
	char zip_code[100];
	char E_mail[100];

}people_msgs[1000],temp;  //结构体数组,与下面的两个是配套使用的
bool st[1000];  //表示结构体数组中每个结构体变量是否被删除
int idx = 0;  //结构体当前可以用的下标编号,将从文件中读取到的信息从结构体数组的下标0处开始存储

///

void read_ms_from_file()  //从文件中读取信息
{
	ifstream fin("txt/人员信息.txt");

	bool P3 = true;
	while (P3)  //程序次循环
	{
		for (int i = 0; i < 5; i++)
		{
			char temp[100] = { '\0' };
			fin >> temp;

			if (strlen(temp) == 0)P3 = false;

			if (i == 0) memcpy(people_msgs[idx].name, temp, sizeof(temp));
			if (i == 1) memcpy(people_msgs[idx].address, temp, sizeof(temp));
			if (i == 2) memcpy(people_msgs[idx].phone_number, temp, sizeof(temp));
			if (i == 3) memcpy(people_msgs[idx].zip_code, temp, sizeof(temp));
			if (i == 4) memcpy(people_msgs[idx].E_mail, temp, sizeof(temp));

		}
		idx++;
	}
	idx--;
	fin.close();  // 关闭打开的文件
}



void painting_1(int flag)  //界面1绘制
{
	drawAlpha(&background_1, 0, 0); drawAlpha(&guan, 15, 795);

	settextstyle(10, 5, "宋体");
	outtextxy(775, 815, "版本-2.0.1");

	if (flag != 1)drawAlpha(&start1, 100, 100); 
	if (flag == 1)drawAlpha(&start2, 100, 100);
	if (flag == 11)drawAlpha(&text1, 132, 100);
	else drawAlpha(&text1_1, 132, 100);

	if (flag != 2)drawAlpha(&start1, 100, 200); 
	if (flag == 2)drawAlpha(&start2, 100, 200);
	if (flag == 22)drawAlpha(&text2, 132, 200);
	else drawAlpha(&text2_2, 132, 200);

	if (flag != 3)drawAlpha(&start1, 100, 300); 
	if (flag == 3)drawAlpha(&start2, 100, 300);
	if (flag == 33)drawAlpha(&text3, 132, 300);
	else drawAlpha(&text3_3, 132, 300);

	if (flag != 4)drawAlpha(&start1, 100, 400); 
	if (flag == 4)drawAlpha(&start2, 100, 400);
	if (flag == 44)drawAlpha(&text4, 132, 400);
	else drawAlpha(&text4_4, 132, 400);

	if (flag != 5)drawAlpha(&start1, 100, 500); 
	if (flag == 5)drawAlpha(&start2, 100, 500);
	if (flag == 55)drawAlpha(&text5, 132, 500);
	else drawAlpha(&text5_5, 132, 500);

	if (flag != 6)drawAlpha(&start1, 100, 600); 
	if (flag == 6)drawAlpha(&start2, 100, 600);
	if (flag == 66)drawAlpha(&text6, 132, 600);
	else drawAlpha(&text6_6, 132, 600);

	if (flag != 7)drawAlpha(&start1, 100, 700); 
	if (flag == 7)drawAlpha(&start2, 100, 700);
	if (flag == 77)drawAlpha(&text7, 132, 700);
	else drawAlpha(&text7_7, 132, 700);
}



void painting_2(int flag)  //界面2绘制
{
	drawAlpha(&background_2, 0, 0); drawAlpha(&kai, 15, 795);

	settextstyle(10, 5, "宋体");
	outtextxy(775, 815, "版本-2.0.1");

	if (flag != 1)drawAlpha(&start1, 100, 100);
	if (flag == 1)drawAlpha(&start2, 100, 100);
	if (flag == 11)drawAlpha(&text1, 132, 100);
	else drawAlpha(&text1_1, 132, 100);

	if (flag != 2)drawAlpha(&start1, 100, 200);
	if (flag == 2)drawAlpha(&start2, 100, 200);
	if (flag == 22)drawAlpha(&text2, 132, 200);
	else drawAlpha(&text2_2, 132, 200);

	if (flag != 3)drawAlpha(&start1, 100, 300);
	if (flag == 3)drawAlpha(&start2, 100, 300);
	if (flag == 33)drawAlpha(&text3, 132, 300);
	else drawAlpha(&text3_3, 132, 300);

	if (flag != 4)drawAlpha(&start1, 100, 400);
	if (flag == 4)drawAlpha(&start2, 100, 400);
	if (flag == 44)drawAlpha(&text4, 132, 400);
	else drawAlpha(&text4_4, 132, 400);

	if (flag != 5)drawAlpha(&start1, 100, 500);
	if (flag == 5)drawAlpha(&start2, 100, 500);
	if (flag == 55)drawAlpha(&text5, 132, 500);
	else drawAlpha(&text5_5, 132, 500);

	if (flag != 6)drawAlpha(&start1, 100, 600);
	if (flag == 6)drawAlpha(&start2, 100, 600);
	if (flag == 66)drawAlpha(&text6, 132, 600);
	else drawAlpha(&text6_6, 132, 600);

	if (flag != 7)drawAlpha(&start1, 100, 700);
	if (flag == 7)drawAlpha(&start2, 100, 700);
	if (flag == 77)drawAlpha(&text7, 132, 700);
	else drawAlpha(&text7_7, 132, 700);
}



void put_all_mes()  //输出全部信息
{
	cleardevice();//这里只是清空了“批量绘图”上的内容,还没有拷贝覆盖到“绘图窗口”上,因此“绘图窗口”上的内容并没有改变
	drawAlpha(&fanhui_bai, 775, 795);
	FlushBatchDraw();  //将“批量绘图”上的内容拷贝覆盖到“绘图窗口”上(即将绘图窗口也清空)

	bool P1 = true;
	ifstream fin("txt/人员信息.txt");
	settextstyle(20, 10, "宋体"); //高20(数字和字母和汉字都为20),宽10(数字或字母为10,汉字为20)

	int x = 0, y = 7; int num = 1;
	while (P1)  //程序次循环
	{
		char idx[10] = { '\0' };
		string num_str = to_string(num);
		for (unsigned int i = 0; i < num_str.size(); i++)
		{
			idx[i] = num_str[i];
		}

		outtextxy(x, y, "第"); x += 20;
		outtextxy(x, y, idx); x += strlen(idx)*10; num++;
		outtextxy(x, y, "个人:"); x += 50;
		
		for (int i = 0; i < 5; i++)
		{
			ExMessage msg;
			while (peekmessage(&msg))
			{
				if (msg.message == WM_LBUTTONDOWN)
				{
					if (msg.x >= 775 && msg.x <= 775 + 33 && msg.y >= 795 && msg.y <= 795 + 16) return;  //void put_all_mes()这个函数结束
				}
			}

			char temp[100] = {'\0'};
			fin >> temp;
			if (strlen(temp) == 0) 
			{ 
				outtextxy(x - 70 - strlen(idx)*10, y, "-----------------------------------------------------------------------------------");
				P1 = false;
			}
			else outtextxy(x,y,temp);

			x += strlen(temp) * 10 + 10;  //一个汉字占两个字符(2个char),所以每有一个汉字x就加2*10,而刚好一个汉字的长度就为2*10
			//一个数字或字母占1个字符(1个char),所以每有一个数字或字母x就加1*10,而刚好一个数字或字母的长度就为1*10
	
			FlushBatchDraw();

			Sleep(50);
		}
		x = 0;
		y += 30;
		if (y == 817)
		{
			y = 7;
			cleardevice();
			drawAlpha(&fanhui_bai, 775, 795);
			FlushBatchDraw();
		}
		Sleep(150);
	}

	fin.close(); // 关闭打开的文件

	bool P2 = true;
	while (P2)
	{
		ExMessage msg;
		while (peekmessage(&msg))
		{
			if (msg.message == WM_LBUTTONDOWN)
			{
				if (msg.x >= 775 && msg.x <= 775 + 33 && msg.y >= 795 && msg.y <= 795 + 16) return;  //void put_all_mes()这个函数结束
			}
		}
		Sleep(10);
	}
}
//

bool check_phone_number(char * x, int lenth)
{
	if (lenth != 11)return false;

	for (int i = 0; i < lenth; i++)
	{
		if (x[i] < 48 || x[i] > 57)return false;
	}

	return true;
}

bool check_zip_code(char * x, int lenth)
{
	if (lenth != 6)return false;

	for (int i = 0; i < lenth; i++)
	{
		if (x[i] < 48 || x[i] > 57)return false;
	}

	return true;
}

bool check_E_mail(char * x, int lenth)
{
	int pos = -1; int num = 0;

	for (int i = 0; i < lenth; i++)
	{
		if (x[i]=='@')
		{
			num++;  //num为@字符的数量
			pos = i;  //pos为最后一个@字符的下标
		}
	}

	if (num != 1)return false;
	else
	{
		if (pos != 0 && pos != lenth - 1)return true;
		else  return false;
	}
}

void add()  //读入信息且存储到结构体数组中
{
	for (int i = 0; i < 5; i++)
	{
		char s[100] = { '\0' };
		if (i == 0) { InputBox(s, 100, "请输入他/她的<姓名>:");     if (strlen(s) == 0)return; memcpy(temp.name, s, sizeof(s)); }  //这里的100表示最多输入100个字符(包括空字符'\0'),因此实际上用户最多输入99个字符(任意99个 中文/英文/其他任意 字符)
		if (i == 1) { InputBox(s, 100, "请输入他/她的<家庭住址>:"); if (strlen(s) == 0)return; memcpy(temp.address, s, sizeof(s));}
		if (i == 2) 
		{ 
			InputBox(s, 100, "请输入他/她的<手机号码>:"); 
			if (strlen(s) == 0)return;

			while(!check_phone_number(s, strlen(s)))
			{
				MessageBox(GetHWnd(), "该<手机号码>非法,请重新输入", "错误", MB_OK);
				InputBox(s, 100, "请重新输入他/她的<手机号码>:");
				if (strlen(s) == 0)return;
			}

			memcpy(temp.phone_number, s, sizeof(s));
		}
		if (i == 3) 
		{ 
			InputBox(s, 100, "请输入他/她的<邮编>:");
			if (strlen(s) == 0)return; 

			while (!check_zip_code(s, strlen(s)))
			{
				MessageBox(GetHWnd(), "该<邮编>非法,请重新输入", "错误", MB_OK);
				InputBox(s, 100, "请重新输入他/她的<邮编>:");
				if (strlen(s) == 0)return;
			}

			memcpy(temp.zip_code, s, sizeof(s));
		}
		if (i == 4) 
		{ 
			InputBox(s, 100, "请输入他/她的<E-mail>:");   
			if (strlen(s) == 0)return; 

			while (!check_E_mail(s, strlen(s)))
			{
				MessageBox(GetHWnd(), "该<E-mail>非法,请重新输入", "错误", MB_OK);
				InputBox(s, 100, "请重新输入他/她的<E-mail>:");
				if (strlen(s) == 0)return;
			}

			memcpy(temp.E_mail, s, sizeof(s));
		}
	}

	//能到这里来说明每种信息都输入了(即不为空)
	int num = 0;
	for (int i = 0; i < idx; i++)  //遍历结构体数组中现有的每组数据,分别去进行比较,找出要删除的那组数据
	{
		if (!strcmp(people_msgs[i].name, temp.name) && st[i] == false)
		{
			num++;
		}
	}
	if (num==0)
	{
		people_msgs[idx] = temp; idx++;
		MessageBox(GetHWnd(), "成功添加了这个人的信息", "成功", MB_OK);
	}
	else
	{
		MessageBox(GetHWnd(), "已经添加过这个人的信息了,不能添加重复信息", "失败", MB_OK);
	}
	
}

void del()  //将结构体数组中对应的信息删除(即在st数组中将其标记为true)
{
	char s[100] = { '\0' };
	InputBox(s, 100, "你要删除谁(姓名)的信息:");
	if (strlen(s) == 0)  //如果不输入 名字 的话就直接结束修改
	{
		return;
	}

	int num = 0;
	for (int i = 0; i < idx; i++)  //遍历结构体数组中现有的每组数据,分别去进行比较,找出要删除的那组数据
	{
		if (!strcmp(people_msgs[i].name, s) && st[i]==false) 
		{
			st[i] = true;  //表示删除这个人的信息
			num++;  //表示删除的信息的个数
		}
	}

	if (num == 0)MessageBox(GetHWnd(), "没有这个人的信息", "错误", MB_OK);
	else MessageBox(GetHWnd(),"成功删除了这个人的信息","正确",MB_OK);
}


void change()
{
	char who[100] = { '\0' }; InputBox(who, 100, "你要修改谁(姓名)的信息:");
	if (strlen(who)==0)  //如果不输入 名字 的话就直接结束修改
	{
		return;
	}

	char what[10] = { '\0' }; InputBox(what, 2, "你要修改他/她的什么信息(请输入数字):\n1-姓名 2-家庭地址 3-手机号码 4-邮编 5-E-mail");
	if (strlen(what) == 0)  //如果不输入 选项 的话就直接结束修改
	{
		return;
	}
	while (what[0] <= 48 || what[0] >= 54) 
	{
		MessageBox(GetHWnd(), "没有这个选项", "错误", MB_OK);
		InputBox(what, 2, "你要修改他/她的什么信息(请输入数字):\n1-姓名 2-家庭地址 3-手机号码 4-邮编 5-E-mail");
		if (strlen(what) == 0)  //如果不输入 选项 的话就直接结束修改(因为如果不输入直接点确定的话,InputBox也会往目标字符数组中读入空字符数组去覆盖目标数组原来有的信息,从而使得strlen(what) == 0)
		{
			return;
		}
	}

	char sm[100] = { '\0' }; InputBox(sm, 100, "你要将它修改成什么:");
	if (strlen(sm) == 0)  //如果不输入 要修改成的内容 的话就直接结束修改
	{
		return;
	}
	
	int num = 0;
	for (int i = 0; i < idx; i++)  //遍历结构体数组中现有的每组数据,分别去进行比较,找出要修改的那组数据
	{
		if (!strcmp(people_msgs[i].name, who) && st[i] == false)
		{
			if (what[0] == '1') memcpy(people_msgs[i].name, sm, sizeof(sm));
			if (what[0] == '2') memcpy(people_msgs[i].address, sm, sizeof(sm));
			if (what[0] == '3') memcpy(people_msgs[i].phone_number, sm, sizeof(sm));
			if (what[0] == '4') memcpy(people_msgs[i].zip_code, sm, sizeof(sm));
			if (what[0] == '5') memcpy(people_msgs[i].E_mail, sm, sizeof(sm));

			num++;  //表示修改的信息的个数
		}
	}

	if (num == 0)MessageBox(GetHWnd(), "没有这个人的信息", "错误", MB_OK);
	else MessageBox(GetHWnd(), "成功修改了这个人的信息", "正确", MB_OK);
}



void  find()
{
	char who[100] = { '\0' }; 
	InputBox(who, 100, "你要查询谁(姓名)的信息:");

	int num = 0;
	if (strlen(who) == 0)  //如果不输入 名字 的话就直接结束修改
	{
		return;
	}
	else
	{
		for (int i = 0; i < idx; i++)  //遍历结构体数组中现有的每组数据,分别去进行比较,找出要 查询 的那组数据
		{
			if (!strcmp(people_msgs[i].name, who) && st[i] == false)
			{
				char temp[1000] = { '\0' };

				strcat_s(temp, "姓名:  "); strcat_s(temp, "\t"); strcat_s(temp, people_msgs[i].name); strcat_s(temp, "\n");
				strcat_s(temp, "家庭住址:  "); strcat_s(temp, "\t"); strcat_s(temp, people_msgs[i].address); strcat_s(temp, "\n");
				strcat_s(temp, "手机号码:  "); strcat_s(temp, "\t"); strcat_s(temp, people_msgs[i].phone_number); strcat_s(temp, "\n");
				strcat_s(temp, "邮编:  "); strcat_s(temp, "\t"); strcat_s(temp, people_msgs[i].zip_code); strcat_s(temp, "\n");
				strcat_s(temp, "E-mail:  "); strcat_s(temp, "\t"); strcat_s(temp, people_msgs[i].E_mail); strcat_s(temp, "\n");
				
				MessageBox(GetHWnd(), temp, "查询成功", MB_OK);
				
				num++;
			}
		}
	}

	if(num==0)MessageBox(GetHWnd(), "没有找到这个人的信息", "查询失败", MB_OK);
	
}



bool cmp1(PEOPLE_MSG a, PEOPLE_MSG b)
{
	int sign = strcmp(a.name, b.name);
	if (sign <= 0)return true;
	else return false;
}

bool cmp2(PEOPLE_MSG a, PEOPLE_MSG b)
{
	int sign = strcmp(a.address, b.address);
	if (sign <= 0)return true;
	else return false;
}

bool cmp3(PEOPLE_MSG a,PEOPLE_MSG b)
{
	int sign = strcmp(a.phone_number , b.phone_number);
	if (sign <= 0)return true;
	else return false;
}

bool cmp4(PEOPLE_MSG a, PEOPLE_MSG b)
{
	int sign = strcmp(a.zip_code, b.zip_code);
	if (sign <= 0)return true;
	else return false;
}

bool cmp5(PEOPLE_MSG a, PEOPLE_MSG b)
{
	int sign = strcmp(a.E_mail, b.E_mail);
	if (sign <= 0)return true;
	else return false;
}

void sort_all_msg()  //用于对结构体数组中的数据进行排序
{
	char s[100] = { '\0' };
	InputBox(s, 100, "你想要哪种排序方式(请输入对应的数字):\n1.以名字排序\n2.以家庭住址排序\n3.以手机号码排序\n4.以邮编排序\n5.以E-mail排序");

	if (strlen(s) == 0)  //如果不输入 选项 的话就直接结束排序
	{
		return;
	}
	while (s[0] <= 48 || s[0] >= 54)
	{
		MessageBox(GetHWnd(), "没有这个选项", "错误", MB_OK);
		InputBox(s, 100, "你想要哪种排序方式(请输入对应的数字):\n1.以名字排序\n2.以家庭住址排序\n3.以手机号码排序\n4.以邮编排序\n5.以E-mail排序");
		if (strlen(s) == 0)  //如果不输入 选项 的话就直接结束排序
		{
			return;
		}
	}

	PEOPLE_MSG temps[1000];
	int temps_idx = 0;
	for (int i = 0; i < idx; i++)
	{
		if (st[i] == false)
		{
			temps[temps_idx++] = people_msgs[i];
		}
	}

	if (s[0] == '1')
	{
		sort(temps, temps + temps_idx, cmp1);

		memset(people_msgs, 0, sizeof(people_msgs)); idx = 0;  //对原结构体数组进行初始化

		for (int i = 0; i < temps_idx; i++)  //将!真正去掉了被删除的信息并且排序了的临时结构体数组!读回原结构体数组
		{
			people_msgs[idx++] = temps[i];
		}

		MessageBox(GetHWnd(), "成功根据<姓名>进行排序", "成功", MB_OK);
	}
	if (s[0] == '2')
	{
		sort(temps, temps + temps_idx, cmp2);

		memset(people_msgs, 0, sizeof(people_msgs)); idx = 0;  //对原结构体数组进行初始化

		for (int i = 0; i < temps_idx; i++)  //将!真正去掉了被删除的信息并且排序了的临时结构体数组!读回原结构体数组
		{
			people_msgs[idx++] = temps[i];
		}

		MessageBox(GetHWnd(), "成功根据<家庭住址>进行排序", "成功", MB_OK);
	}
	if (s[0] == '3')
	{
		sort(temps, temps + temps_idx, cmp3);

		memset(people_msgs, 0, sizeof(people_msgs)); idx = 0;  //对原结构体数组进行初始化

		for (int i = 0; i < temps_idx; i++)  //将!真正去掉了被删除的信息并且排序了的临时结构体数组!读回原结构体数组
		{
			people_msgs[idx++] = temps[i];
		}

		MessageBox(GetHWnd(), "成功根据<手机号码>进行排序", "成功", MB_OK);
	}
	if (s[0] == '4')
	{
		sort(temps, temps + temps_idx, cmp4);

		memset(people_msgs, 0, sizeof(people_msgs)); idx = 0;  //对原结构体数组进行初始化

		for (int i = 0; i < temps_idx; i++)  //将!真正去掉了被删除的信息并且排序了的临时结构体数组!读回原结构体数组
		{
			people_msgs[idx++] = temps[i];
		}

		MessageBox(GetHWnd(), "成功根据<邮编>进行排序", "成功", MB_OK);
	}
	if (s[0] == '5')
	{
		sort(temps, temps + temps_idx, cmp5);

		memset(people_msgs, 0, sizeof(people_msgs)); idx = 0;  //对原结构体数组进行初始化

		for (int i = 0; i < temps_idx; i++)  //将!真正去掉了被删除的信息并且排序了的临时结构体数组!读回原结构体数组
		{
			people_msgs[idx++] = temps[i];
		}

		MessageBox(GetHWnd(), "成功根据<E-mail>进行排序", "成功", MB_OK);
	}
}


void sava_people_msgs_from_struct_arr_to_file()  //要以覆盖的形式读入文件中
{
	ofstream fout("txt/人员信息.txt");  //默认就是覆盖形式
	for (int i = 0; i < idx; i++)  //遍历每个人的信息
	{
		if (!st[i])  //如果那个人的信息没有被删除的话(即st[i]==false),就将其输入文件中去
		{
			fout << people_msgs[i].name << " ";
			fout << people_msgs[i].address << " ";
			fout << people_msgs[i].phone_number << " ";
			fout << people_msgs[i].zip_code << " ";
			fout << people_msgs[i].E_mail << " ";
			fout << endl;
		}
	}
	fout.close();  //关闭文件
}

int main()
{
	read_ms_from_file();//信息读入
	
	initgraph(827, 827);
	
	//mciSendString("open music/sb.mp3", 0, 0, 0);
	//mciSendString("play music/sb.mp3", 0, 0, 0);

	loadimage(&start1, "img/弥散进入-弥散进入_1.png"); loadimage(&start2, "img/弥散进入-弥散进入_2.png");
	loadimage(&background_1, "img/preview_1.jpg"); loadimage(&background_2, "img/preview_2.jpg");
	loadimage(&kai, "img/开关_开.png"); loadimage(&guan, "img/开关_关.png");
	loadimage(&text1, "img/添加个人信息_白.png"); loadimage(&text1_1, "img/添加个人信息_黑.png");
	loadimage(&text2, "img/删除个人信息.png"); loadimage(&text2_2, "img/删除个人信息_黑.png");
	loadimage(&text3, "img/修改个人信息.png"); loadimage(&text3_3, "img/修改个人信息_黑.png");
	loadimage(&text4, "img/查询个人信息.png"); loadimage(&text4_4, "img/查询个人信息_黑.png");
	loadimage(&text5, "img/排序全部信息.png"); loadimage(&text5_5, "img/排序全部信息_黑.png");
	loadimage(&text6, "img/输出全部信息.png"); loadimage(&text6_6, "img/输出全部信息_黑.png");
	loadimage(&text7, "img/保存并退出.png"); loadimage(&text7_7, "img/保存并退出_黑.png");
	loadimage(&fanhui_bai, "img/返回_白.png"); loadimage(&fanhui_hei, "img/返回_黑.png");

	BeginBatchDraw();
	bool PD = true;   int bg = 1;
	while (PD)  //程序主循环
	{
		if(bg==1)painting_1(flag);
		else painting_2(flag);

		ExMessage msg;
		while (peekmessage(&msg))
		{
			if (msg.message == WM_MOUSEMOVE)
			{
				if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 189 && msg.y >= 100 && msg.y <= 100 + 32)flag = 11;
				else if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 192 && msg.y >= 200 && msg.y <= 200 + 32)flag = 22;
				else if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 191 && msg.y >= 300 && msg.y <= 300 + 32)flag = 33;
				else if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 189 && msg.y >= 400 && msg.y <= 400 + 32)flag = 44;
				else if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 183 && msg.y >= 500 && msg.y <= 500 + 32)flag = 55;
				else if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 196 && msg.y >= 600 && msg.y <= 600 + 32)flag = 66;
				else if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 155 && msg.y >= 700 && msg.y <= 700 + 32)flag = 77;
				else flag = 0;
			}
			else if (msg.message==WM_LBUTTONDOWN)
			{
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 100 && msg.y <= 100 + 32)flag = 1;
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 200 && msg.y <= 200 + 32)flag = 2;
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 300 && msg.y <= 300 + 32)flag = 3;
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 400 && msg.y <= 400 + 32)flag = 4;
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 500 && msg.y <= 500 + 32)flag = 5;
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 600 && msg.y <= 600 + 32)flag = 6;
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 700 && msg.y <= 700 + 32)flag = 7;

				if (msg.x >= 15 && msg.x <= 15+32 && msg.y >= 795 && msg.y <= 827)bg = 3-bg;

				//下面的这7句代码与它们下面的7句代码的作用一模一样
				if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 189 && msg.y >= 100 && msg.y <= 100 + 32) { flag = 0; add(); }
				if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 192 && msg.y >= 200 && msg.y <= 200 + 32) { flag = 0; del(); }
				if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 191 && msg.y >= 300 && msg.y <= 300 + 32) { flag = 0; change(); }
				if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 189 && msg.y >= 400 && msg.y <= 400 + 32) { flag = 0; find(); }
				if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 183 && msg.y >= 500 && msg.y <= 500 + 32) { flag = 0; sort_all_msg(); }
				if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 196 && msg.y >= 600 && msg.y <= 600 + 32) { flag = 0; sava_people_msgs_from_struct_arr_to_file(); put_all_mes(); }
				if (msg.x >= 100 + 32 && msg.x <= 100 + 32 + 155 && msg.y >= 700 && msg.y <= 700 + 32) { flag = 0; sava_people_msgs_from_struct_arr_to_file(); PD = false; }
			}
			else if (msg.message==WM_LBUTTONUP)
			{
				//下面的这7句代码与它们上面的7句代码的作用一模一样
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 100 && msg.y <= 100 + 32) { flag = 0; add(); }//flag = 0;让所有图标都变暗
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 200 && msg.y <= 200 + 32) { flag = 0; del(); }
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 300 && msg.y <= 300 + 32) { flag = 0; change(); }
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 400 && msg.y <= 400 + 32) { flag = 0; find(); }
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 500 && msg.y <= 500 + 32) { flag = 0; sort_all_msg(); }
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 600 && msg.y <= 600 + 32) { flag = 0; sava_people_msgs_from_struct_arr_to_file(); put_all_mes(); }
				if (msg.x >= 100 && msg.x <= 100 + 32 && msg.y >= 700 && msg.y <= 700 + 32) { flag = 0; sava_people_msgs_from_struct_arr_to_file(); PD = false; }
			}
		}

		FlushBatchDraw();
		Sleep(8);
	}
	EndBatchDraw();

	return 0;
}

自定义的一个头文件 "EasyX载入PNG图时透明背景.h" 的内容:

#pragma once
#include<graphics.h>

//方法1
void drawAlpha(IMAGE* picture, int  picture_x, int picture_y) //x为载入图片的X坐标,y为Y坐标
{
	// 变量初始化
	DWORD *dst = GetImageBuffer();    // GetImageBuffer()函数,用于获取绘图设备的显存指针,EASYX自带
	DWORD *draw = GetImageBuffer();
	DWORD *src = GetImageBuffer(picture); //获取picture的显存指针
	int picture_width = picture->getwidth(); //获取picture的宽度,EASYX自带
	int picture_height = picture->getheight(); //获取picture的高度,EASYX自带
	int graphWidth = getwidth();       //获取绘图区的宽度,EASYX自带
	int graphHeight = getheight();     //获取绘图区的高度,EASYX自带
	int dstX = 0;    //在显存里像素的角标

	// 实现透明贴图 公式: Cp=αp*FP+(1-αp)*BP , 贝叶斯定理来进行点颜色的概率计算
	for (int iy = 0; iy < picture_height; iy++)
	{
		for (int ix = 0; ix < picture_width; ix++)
		{
			int srcX = ix + iy * picture_width; //在显存里像素的角标
			int sa = ((src[srcX] & 0xff000000) >> 24); //0xAArrggbb;AA是透明度
			int sr = ((src[srcX] & 0xff0000) >> 16); //获取RGB里的R
			int sg = ((src[srcX] & 0xff00) >> 8);   //G
			int sb = src[srcX] & 0xff;              //B
			if (ix >= 0 && ix <= graphWidth && iy >= 0 && iy <= graphHeight && dstX <= graphWidth * graphHeight)
			{
				dstX = (ix + picture_x) + (iy + picture_y) * graphWidth; //在显存里像素的角标
				int dr = ((dst[dstX] & 0xff0000) >> 16);
				int dg = ((dst[dstX] & 0xff00) >> 8);
				int db = dst[dstX] & 0xff;
				draw[dstX] = ((sr * sa / 255 + dr * (255 - sa) / 255) << 16)  //公式: Cp=αp*FP+(1-αp)*BP  ; αp=sa/255 , FP=sr , BP=dr
					| ((sg * sa / 255 + dg * (255 - sa) / 255) << 8)         //αp=sa/255 , FP=sg , BP=dg
					| (sb * sa / 255 + db * (255 - sa) / 255);              //αp=sa/255 , FP=sb , BP=db
			}
		}
	}
}

//方法2
inline void putimage_alpha(int x, int y, IMAGE* img)
{
	int w = img->getwidth();
	int h = img->getheight();
	AlphaBlend(GetImageHDC(NULL), x, y, w, h,
		GetImageHDC(img), 0, 0, w, h, { AC_SRC_OVER,0,255,AC_SRC_ALPHA });
}

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

古葬

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

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

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

打赏作者

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

抵扣说明:

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

余额充值