//解决字符集的问题
#ifdef UNICODE
#undef UNICODE
#endif 

#include<stdio.h>
#include<stdlib.h>
#include<easyx.h>	//只有最新的API
//#include<graphics.h>//包含过时的API
//多媒体设备控制接口
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
//绘制图形
void drawShape()
{
	//设置线条颜色
	setlinecolor(GREEN);
	//设置线条样式(粗细)
	setlinestyle(PS_SOLID,3);
	//设置填充颜色
	setfillcolor(RGB(176, 170, 0));

	//空心圆
	circle(50, 50, 50);
	//填充圆
	fillcircle(50,150,50);
	//实心圆
	solidcircle(50, 250, 50);
	//绘制一条线
	line(0, 0, 640, 480);
	line(0, 0, getwidth(), getheight()); //获取窗口宽度,高度

	//画点
	for (int i = 0; i < 20; i++)
	{
		COLORREF c = RGB(rand() % 256, rand() % 256, rand() % 256);
		for (int k = 0; k < getwidth(); k++)
		{
			putpixel(i, k, YELLOW);
		}

	}
	//颜色渐变
	for (INT i = 0; i < 640 ; i++)
	{
		//setlinecolor(RGB(0,255 - ((i % 2 == 0) ? ++i : i),0));
		setlinecolor(RGB(0, 255 - i/2, 0));
		line(0, i, getwidth(), i);
	}
	
	//circle圆形 ellipse椭圆 pie扇形 polygon多边形
	//rectangle矩形 roundrect圆角矩形 line线 putpixel画点
}
//绘制文本
void drawText()
{
	printf("hello world"); //黑窗口显示
	//文本样式
	settextstyle(36, 0, "黑体");

	outtextxy(100,100,"A");
	//设置背景模式
	setbkmode(TRANSPARENT);//透明
	outtextxy(200, 100, "A");
	//设置文字颜色
	settextcolor(BROWN);//棕色
	setbkmode(TRANSPARENT);//透明
	outtextxy(300, 100, "A");
	
	//	错误	C2665	“settextstyle” : 4 个重载中没有一个可以转换所有参数类型	
	//原因:字符集不对,需要UNICODE字符
	//解决方案4中:
	//1,在字符串的前面加一个大写的L,对字符串进行转换 L"黑体"
	//2. 用_T或_TEXT带参宏函数,把字符串包起来  _T("hello") or _TEXT("hello")
	//3. 菜单-项目-属性-高级-字符集-unicode改为多字节字符集(推荐使用和第4条)
	//4.在第3条无效的情况下使用,条件编译,需要加载第一行
    //  #ifdef UNICODE
	//  #undef UNICODE
	//  #endif 

}
//给定一个矩形,让文字居中显示
void centerText()
{
	//绘制矩形
	setfillcolor(RED);
	setfillcolor(YELLOW);
	fillrectangle(250, 250, 250+250,250+50);
	char str[] = "shixiaobin";
	int hspace=(250 - textwidth(str))/2;
	int vspace = (50 - textheight(str)) / 2;
	//绘制文字
	outtextxy(250+hspace,250+vspace,str);
}
//绘制图片,不支持透明贴图
void drawImage()
{
	//定义一个图片变量
	IMAGE img;
	//加载图片到指定的变量  
	//相对路径:相对当前项目目录 ./assets/images/nn.gif
	loadimage(&img, "./目录/1.jpg", getwidth(), getheight());
	 loadimage(&img,"1.jpg",getwidth(),getheight());
	//绝对路径:带盘符的
	 //loadimage(&img, "c:\\user\\deskktop\\1.jpg", getwidth(), getheight());
	 //loadimage(&img, "c:/user/deskktop/1.jpg", getwidth(), getheight());
	//输出图片
	putimage(0, 0, &img);

	//透明贴图 不支持png透明贴图
	IMAGE img_png;
	loadimage(&img, "1.png",getwidth(), getheight());
	putimage(0, 0, &img_png);
	//硬要透明贴图 两张图 一张掩码图(白底,黑白图片),一张原图(黑底)
	IMAGE imgs[2];
	loadimage(&imgs[0], "1.jpg");
	loadimage(&imgs[1], "1.jpg");
	putimage(0,0,&imgs[0],SRCAND);//掩码图
	putimage(0,0,&imgs[1],SRCPAINT);//原图

	//drawImage(0, 0, &imgs);//自定义函数

}
//消息处理
void handingMsg()
{
	//定义一个消息变量
	ExMessage msg;
	//获取消息
	while (peekmessage(&msg, EM_MOUSE|EM_KEY))  //鼠标消息 键盘消息
	{
		switch (msg.message)
		{
		case WM_LBUTTONDOWN:
			printf("左键按下\n");
			break;
		case WM_LBUTTONUP:
			printf("右键弹起\n");
			break;
		case WM_MOUSEMOVE:
			printf("鼠标移动\n");
				break;
		case WM_KEYDOWN:
			switch (msg.vkcode)
			{
			case VK_UP://上
				break;
			case VK_DOWN:
				break;
			case VK_LEFT:
				break;
			case VK_RIGHT:
				break;
			/*case "A":
				break;*/

			default:
				printf("other %c %d", msg.vkcode, msg.vkcode);
				break;
			}

			break;
		default:
			break;
		}
		printf("%d\n", msg.message);//消息的类型
	}

}
//播放音乐
void playMusic()
{
	//播放音乐需要头文件mmsystem.h,库文件winmm.lib
	//mciSendString mci media contorl interface 多媒体控制接口
	mciSendString("open ./sound/1.mp3 alias bgm", NULL, 0, NULL); //alias 别名
	//mciSendString("play ./sound/1.mp3 alias bgm", NULL, 0, NULL);
	mciSendString("play bgm repeat", NULL, 0, NULL);//repeat 重复循环播放
	getchar();
	//关闭音乐
	mciSendString("close bgm", NULL, 0, NULL);
}

int main()
{
	//创建窗口+
	//initgraph(640, 480);  
	initgraph(640, 480,EW_SHOWCONSOLE); //EW easyx windows 显示黑窗口
	//设置背景颜色
	setbkcolor(RED); //红色RED 绿色GREEN  f12 或 右键转定义 可以查看所有颜色
	//setbkcolor(RGB(240, 240, 240));//QQ截图ctrl+alt+a 选中颜色按C
	cleardevice();//清屏幕  用设置的颜色填充整个屏幕

	//3中图形:1无填充  2有填充  3无边框填充

	//修改窗口标题
	//HWND hWnd = GetHWnd();//获取窗口句柄
	//SetWindowText(hWnd, "love");		//设置窗口标题
	SetWindowText(GetHWnd(),"12345"); //获取句柄,设置窗口标题
	//消息框
	int ret=MessageBox(GetHWnd(), "你好吗", "标题", MB_OKCANCEL);
	 //弹出对话框
	 //在某些时候,可能需要弹出一个小窗口提示用户,windows给我们提供了一个** MessageBox** 函数。
		//int MessageBox(			//返回按下的键的值
		//	HWND hWnd,			//窗口句柄
		//	LPCSTR text,		//显示的文字
		//	LPCSTR caption,		//对话框标题
		//	UINT uType			//对话框按钮类型
		//);
	
	if (ret == IDOK)
	{
		printf("IDOK\n");
	}
	else if (ret == IDCANCEL)
	{
		printf("IDCANEL\n");
	}

	/*drawShape();
	
	drawText();

	centerText();

	drawImage();

	playMusic();*/

	while (true)
	{
		handingMsg();
	}
	

	getchar();  //等待输入一个字符,如果没有输入就一直等待

	closegraph();//关闭图形窗口
	return 0;
}