文章目录:
一:前言
二:窗口(宽高 背景颜色 窗口标题 弹出对话框)
三:图形绘制(点 线 矩形 圆 椭圆)
四:文字(颜色 大小 背景 位置 打印 文字居中)
五:事件消息
1.键盘事件消息(按键交互 按键异步交互 双缓冲贴图)
demo1
demo2
2.鼠标事件消息
2.1 利用MOUSEMSG的方法
2.2 利用ExMessage的方法
3.定时器事件消息
六:图片/贴图(原样贴图 透明贴图 精灵图 双缓冲贴图)
七:背景音乐
一:前言
官网:EasyX Graphics Library for C++
参考
官方:EasyX 文档 - 基本说明
51:easyx保姆级教程
第三方:EasyX基础入门、番外篇:入门EasyX图形库
下载
安装easyx环境:EasyX Graphics Library for C++——>右上侧点击下载安装在
安装程序会自动检测您已经安装的 VC 版本,并根据您的选择将对应的 .h 和 .lib 文件安装至 VC 的 include 和 lib 文件夹内
编译器 VS或者VC:编译环境:Visual C++ 6.0,Visual Studio 2008 至 Visual Studio 2022 (x86 & x64)
使用
启动 Visual C++,创建一个空的控制台项目(Win32 Console Application),然后添加一个新的代码文件(.cpp),并引用 graphics.h 头文件
// 引用图形库头文件 #include<easyx.h> //这个是只包含最新的API(函数接口) #include<graphics.h> //这个头文件包含了上面的,还包含了已经不推荐使用的函数 #include <conio.h> int main() //画圆的例子 { initgraph(640, 480); // 创建绘图窗口,大小为 640x480 像素 circle(200, 200, 100); // 画圆,圆心(200, 200),半径 100 _getch(); // 按任意键继续 closegraph(); // 关闭绘图窗口 return 0; }
二:窗口(宽高 背景颜色 窗口标题 弹出对话框)
#define _CRT_SECURE_NO_WARNINGS 1 //用来消除由于函数的安全性导致的的报错 // 引用图形库头文件 #include<easyx.h> //这个是只包含最新的API(函数接口) #include<graphics.h> //这个头文件包含了上面的,还包含了已经不推荐使用的函数 #include<stdio.h> //getchar的头文件 void change() { //设置图形窗口 //窗口定义HWND hand 函数GetHWnd()获取窗口信息 HWND hnd = GetHWnd(); //设置窗口标题内容SetWindowTex(类型变量名,修改内容) SetWindowText(hnd,"很高兴认识你"); //设置提示窗口:MessageBox(类型变量名,提示内容) int is_ok = MessageBox(hnd,"我是消息框","要不要关闭我",MB_OKCANCEL); if(is_ok == IDOK) { printf("你点击了OK\n"); } else if(is_ok == IDCANCEL) { printf("你点击了cancel\n"); } } int main() { /*创建窗口函数:initgraph(宽度,高度)*/ /*窗口的左上角是坐标原点,x轴向右增大,y轴向下增大,不包括标题栏*/ initgraph(520, 520);//宽520,高520 //initgraph(520, 520,SHOWCONSOLE);//宽520,高520 /*设置背景颜色:默认为黑色*/ setbkcolor(WHITE); /*清除系统之前默认的黑色背景*/ cleardevice(); change();//调用 /*缓冲函数getchar()让窗口得以持续显示*/ getchar(); /*关闭窗口函数:closegraph()*/ closegraph(); return 0; }
三:图形绘制(点 线 矩形 圆 椭圆)
#define _CRT_SECURE_NO_WARNINGS 1 //用来消除由于函数的安全性导致的的报错 // 引用图形库头文件 #include<easyx.h> //这个是只包含最新的API(函数接口) #include<graphics.h> //这个头文件包含了上面的,还包含了已经不推荐使用的函数 #include<stdio.h> //getchar的头文件 int main() { /*创建窗口函数:initgraph(宽度,高度)*/ /*窗口的左上角是坐标原点,x轴向右增大,y轴向下增大,不包括标题栏*/ initgraph(520, 520);//宽520,高520 /*设置背景颜色:默认为黑色*/ setbkcolor(WHITE); /*清除系统之前默认的黑色背景*/ cleardevice(); //设置线条的函数setlinecolor(颜色):线条颜色默认为白色 setlinecolor(BLACK); //画圆形 //画一个圆(圆心的横坐标,圆心的纵坐标,圆的半径) circle(50, 50, 50); //填充背景颜色setfillcolor(颜色):默认为白色 setfillcolor(BLUE); //有边框实心圆fillcircle(圆心的横坐标,圆心的纵坐标,圆的半径) fillcircle(50, 150, 50);//有边框 //无边框的实心圆solidcircle(圆心的横坐标,圆心的纵坐标,圆的半径) solidcircle(50, 250, 50);//无边框 //点:putpixel(x,y,color); putpixel(100,100,BLUE); //线 //line(x1,y1,x2,y2); //起始坐标,终止坐标 //可以使用getwidth() gethight()获取窗口的宽度和高度 line(10,10,80,80); //设置线条颜色setlinecolor() setlinecolor(BLUE); //样式setlinestyle(样式,宽度); /*样式 #define PS SOLID 0 #define PS DASH 1 #define PS DOT 2 #define PS DASHDOT 3 #define PS DASHDOTDOT 4 #define PS NULL 5 #define PS INSIDEFRAME 6 #define PS USERSTYLE 7 #define PS ALTERNATE 8 #define PS STYLE MASK 0x0000000F*/ setlinestyle(8,8); //正矩形 //左上角坐标,右下角坐标---->无填充矩形rectangle(x1,y1,x2,y2); rectangle(150,150,250,250); //颜色填充setfillcolor(); setfillcolor(BROWN); //填充矩形 //fillrectangle(); //无边框填充矩形solidrectangle(); //solidrectangle(); //圆角矩形 //roundrect(x1,y1,x2,y2,宽度,高度); roundrect(200,200,300,300,10,10); //fillroundrect()和solidroundrect() //椭圆ellipse(x1,y1,x2,y2);矩形左上角和右下角坐标,椭圆就是该矩形的内切 ellipse(150,150,250,450); //fillellipse()和solidellipse() /*缓冲函数getchar()让窗口得以持续显示*/ getchar(); /*关闭窗口函数:closegraph()*/ closegraph(); return 0; }
四:文字(颜色 大小 背景 位置 打印 文字居中)
#define _CRT_SECURE_NO_WARNINGS 1 //用来消除由于函数的安全性导致的的报错 // 引用图形库头文件 #include<easyx.h> //这个是只包含最新的API(函数接口) #include<graphics.h> //这个头文件包含了上面的,还包含了已经不推荐使用的函数 #include<stdio.h> //getchar的头文件 int main() { /*创建窗口函数:initgraph(宽度,高度)*/ /*窗口的左上角是坐标原点,x轴向右增大,y轴向下增大,不包括标题栏*/ initgraph(520, 520);//宽520,高520 /*设置背景颜色:默认为黑色*/ setbkcolor(WHITE); /*清除系统之前默认的黑色背景*/ cleardevice(); //设置文字颜色settextcolor(颜色):文字的颜色默认为白色 settextcolor(RED);//文字格式为红色 //设置文字大小settextstyle(高度,宽度 如果为0则自动匹配,字符的形式比如楷体宋体) settextstyle(20, 0, "楷体");//文字的大小,紧凑程度,字体的样式 //设置当前字体的颜色setcolor(颜色) setcolor(GREEN); //设置字体的背景setbkmode(颜色):背景默认为白色会掩盖其他物体 setbkmode(TRANSPARENT); //透明 //显示位置:fillrectangle(矩形左部 x 坐标,矩形顶部 y 坐标,矩形右部 x 坐标,矩形底部 y 坐标) ; //打印文字outtextxy(文字的横坐标,文字的纵坐标,文字的内容) outtextxy(100, 100, "文字在图形的居中显示1"); //文字在图形的居中显示 //initgraph(520, 520) fillrectangle(100, 100, 500, 500) //求字体的宽度与高度 char arr[] = "文字在图形的居中显示1"; int width = textwidth(arr); int height = textheight(arr); //求所加坐标的值 //所加x坐标的值 int x = (520 - width) / 2; //所加y坐标的值 int y = (520 - height) / 2; outtextxy(x, y, "文字在图形的居中显示2"); /*缓冲函数getchar()让窗口得以持续显示*/ getchar(); /*关闭窗口函数:closegraph()*/ closegraph(); return 0; }
五:事件消息
1.键盘事件消息(按键交互 按键异步交互 双缓冲贴图)
demo1
#define _CRT_SECURE_NO_WARNINGS 1 //用来消除由于函数的安全性导致的的报错 // 引用图形库头文件 #include<easyx.h> //这个是只包含最新的API(函数接口) #include<graphics.h> //这个头文件包含了上面的,还包含了已经不推荐使用的函数 #include<stdio.h> //getchar的头文件 #include<conio.h> //键盘 int main() { /*创建窗口函数:initgraph(宽度,高度)*/ /*窗口的左上角是坐标原点,x轴向右增大,y轴向下增大,不包括标题栏*/ initgraph(520, 520,SHOWCONSOLE);//宽520,高520,这里的第三个参数为显示控制台窗口 /*设置背景颜色:默认为黑色*/ setbkcolor(WHITE); int x = 200, y = 300; //这个函数用于开始批量绘图:执行后,任何绘图操作都将暂时不输出 void BeginBatchDraw(); while (1) { /*清除系统之前默认的黑色背景*/ cleardevice(); //填充红色背景 setfillcolor(RED); //无边框实心圆 solidcircle(x, y, 50); //停止闪烁:这个函数用于执行未完成的绘制任务。比EndBatchDraw更稳定 FlushBatchDraw(); //第一种 按键交互:键盘响应ascll码值 //获取键盘信息_kbhit() 头文件:conio.h /*if (_kbhit()) { //输出键盘信息:_getch() 头文件:conio.h char key = _getch(); printf("%d %c\n", key, key);//可以获取键的ASCII值 switch (key) { case 72://上键的ASCII值 y -= 5; break; case 80://下键的ASCII值 y += 5; break; case 75://左键的ASCII值 x -= 5; break; case 77://右键的ASCII值 x += 5; break; } }*/ //第二种 键盘异步交互:方法调用(更加丝滑) if (GetAsyncKeyState(VK_UP)) { y--; } if (GetAsyncKeyState(VK_DOWN)) { y++; } if (GetAsyncKeyState(VK_LEFT)) { x--; } if (GetAsyncKeyState(VK_RIGHT)) { x++; } } /*缓冲函数getchar()让窗口得以持续显示*/ getchar(); /*关闭窗口函数:closegraph()*/ closegraph(); return 0; }
demo2
#define _CRT_SECURE_NO_WARNINGS 1 //用来消除由于函数的安全性导致的的报错 // 引用图形库头文件 #include<easyx.h> //这个是只包含最新的API(函数接口) #include<graphics.h> //这个头文件包含了上面的,还包含了已经不推荐使用的函数 #include<stdio.h> //getchar的头文件 #include<time.h> #include<conio.h> //阻塞函数getch()不需要回车确认输入 //球定义 struct Ball { int x; int y; int r; //增量 int dx; int dy; }; struct Ball ball={400,400,15,5,-4}; struct Ball myball={500,500,15,5,5}; //画球 void DrawBall(struct Ball ball){ setfillcolor(RED); solidcircle(ball.x,ball.y,ball.r); } //定时器:去控制自动移动东西 #include<time.h> // 时间间隔 id int Timer(int duration,int id){ //开始时间 static int startTime[10]; //结束时间 int endTime=clock(); //clock()统计程序运行到当前代码的时间 if (endTime-startTime[id]>duration) { startTime[id]=endTime; return 1; } return 0; } //移动球(自己动) void MoveBall(){ //相撞 左壁 右壁 if(ball.x-ball.r<=0||ball.x+ball.r>=800){ ball.dx=-ball.dx; //反射:增量发生变化 } //相撞 上壁 下壁 if(ball.y-ball.r<=0||ball.y+ball.r>=800){ ball.dy=-ball.dy; } ball.x +=ball.dx; ball.y -=ball.dy; } //按键交互:移动球(按键控制)会发生阻塞 void KeyDown(){ //获取用户按键 int userKey=_getch(); switch (userKey) { case 'w': case 'W': case 72: myball.y -=5; break; case 's': case 'S': case 80: myball.y +=5; break; case 'a': case 'A': case 75: myball.x -=5; break; case 'd': case 'D': case 77: myball.x +=5; break; } } //键盘异步交互:不会发生阻塞 void KeyDown2(){ if (GetAsyncKeyState(VK_UP)) { myball.y -=5; } if (GetAsyncKeyState(VK_DOWN)) { myball.y +=5; } if (GetAsyncKeyState(VK_LEFT)) { myball.x -=5; } if (GetAsyncKeyState(VK_RIGHT)) { myball.x +=5; } } int main() { /*创建窗口函数:initgraph(宽度,高度)*/ /*窗口的左上角是坐标原点,x轴向右增大,y轴向下增大,不包括标题栏*/ initgraph(800, 800); /*设置背景颜色:默认为黑色*/ setbkcolor(WHITE); /*清除系统之前默认的黑色背景*/ cleardevice(); //开始双缓冲贴图:解决一闪一闪的问题 BeginBatchDraw(); //控制移动 while (1) { //刷新 cleardevice(); //先画球 DrawBall(ball); DrawBall(myball); if(Timer(20,0)) //球自己移动球 MoveBall(); //鼠标控制球移动 //if (_kbhit()) //判断阻塞:判断存在按键再去处理 //{ // KeyDown(); //} //if(Timer(20,1)) //键盘异步交互 KeyDown2(); //Sleep(20); //休眠一下 也是阻塞函数 //显示每一帧 FlushBatchDraw(); } //结束双缓冲贴图 EndBatchDraw(); /*缓冲函数getchar()让窗口得以持续显示*/ getchar(); /*关闭窗口函数:closegraph()*/ closegraph(); return 0; }
2.鼠标事件消息
2.1 利用MOUSEMSG的方法
#define _CRT_SECURE_NO_WARNINGS 1 #include<graphics.h> #include<stdio.h> #include<conio.h> int main() { initgraph(520, 520,SHOWCONSOLE); setbkcolor(BLACK); cleardevice(); while (1) { //判断有无鼠标信息 if (MouseHit()) { //读取鼠标信息 //鼠标信息的类型:MOUSEMSG //定义变量(举例):MOUSEMSG msg; //读取鼠标信息的函数:GetMouseMsg() MOUSEMSG msg = GetMouseMsg(); //消息处理 switch (msg.uMsg) //获取当前鼠标消息 { case WM_LBUTTONDOWN: //鼠标左键 outtextxy(200, 200, "鼠标左键"); printf("左键坐标(%d,%d)", msg.x, msg.y); //msg.x获取鼠标的横坐标 msg.y获取鼠标的纵坐标 break; case WM_RBUTTONDOWN: //鼠标右键 outtextxy(100, 100, "鼠标右键"); printf("右键坐标(%d,%d)", msg.x, msg.y); break; case WM_MBUTTONDOWN: //中键按下 printf("中键按下\n"); break; case WM_MOUSEWHEEL: //滚轮滑动 printf("%d滚轮滑动\n",msg.wheel); //获取滚轮滑动方向,正朝屏幕,负朝自己 break; case WM_MOUSEMOVE: //鼠标移动 printf("鼠标移动\n"); break; } } } getchar(); closegraph(); return 0; } /*MOUSEMSG结构体 struct MOUSEMSG { UINT uMsg; 获取当前鼠标消息 bool mkCtrl :l; Ctrl 键是否按下 bool mkShift :l; Shift 键是否按下 bool mkLButton :l; 鼠标左键是否按下 bool mkMButton :l; 鼠标中键是否按下 bool mkRButton :l; 鼠标右键是否按下 short x; 当前鼠标 x 坐标 short y; 当前鼠标 坐标 short wheel; 鼠标滚轮滚动值 (120 的倍数) }*/
2.2 利用ExMessage的方法
#define _CRT_SECURE_NO_WARNINGS 1 //用来消除由于函数的安全性导致的的报错 // 引用图形库头文件 #include<easyx.h> //这个是只包含最新的API(函数接口) #include<graphics.h> //这个头文件包含了上面的,还包含了已经不推荐使用的函数 #include<stdio.h> //getchar的头文件 int main() { initgraph(800, 600,SHOWCONSOLE); //setbkcolor(WHITE); cleardevice(); //定义ExMessage类型的变量去存储鼠标消息 ExMessage msg; while (true) { //获取鼠标消息peekmessage(&变量) while (peekmessage(&msg)) { //讨论鼠标消息 switch (msg.message) //区分鼠标消息的类型:msg.message { //鼠标的当前坐标:msg.x msg.y case WM_LBUTTONDOWN: circle(msg.x,msg.y,10); break; case WM_RBUTTONDOWN: rectangle(msg.x-5,msg.y-5,msg.x+5,msg.y+5); break; } } } getchar(); closegraph(); return 0; }
3.定时器事件消息
#include<time.h> //定时器:去控制自动移动东西 #include<time.h> // 时间间隔 id int Timer(int duration,int id){ //开始时间 static int startTime[10]; //结束时间 int endTime=clock(); //clock()统计程序运行到当前代码的时间 if (endTime-startTime[id]>duration) { startTime[id]=endTime; return 1; } return 0; } int main() { /*创建窗口函数:initgraph(宽度,高度)*/ /*窗口的左上角是坐标原点,x轴向右增大,y轴向下增大,不包括标题栏*/ initgraph(800, 800); /*设置背景颜色:默认为黑色*/ setbkcolor(WHITE); /*清除系统之前默认的黑色背景*/ cleardevice(); //调用 if(Timer(20,0)) //球自己移动球 MoveBall();//这是一个你自己写的方法 /*缓冲函数getchar()让窗口得以持续显示*/ getchar(); /*关闭窗口函数:closegraph()*/ closegraph(); return 0; }
六:图片/贴图(原样贴图 透明贴图 精灵图 双缓冲贴图)
图片需要和程序放在一个路径之下
#define _CRT_SECURE_NO_WARNINGS 1 //用来消除由于函数的安全性导致的的报错 // 引用图形库头文件 #include<easyx.h> //这个是只包含最新的API(函数接口) #include<graphics.h> //这个头文件包含了上面的,还包含了已经不推荐使用的函数 #include<stdio.h> //getchar的头文件 int main() { initgraph(800, 600,SHOWCONSOLE); setbkcolor(WHITE); cleardevice(); //原样贴图 //定义图片变量去表示图片 IMAGE mage; //读取加载图片:loadimage(图片地址,"图片路径 相对 绝对",int nwidth缩放的宽度,int nheight缩放的高度) loadimage(&mage, "./images/bk.png",800,600); //显示图片:putimage(图片的横坐标,图片的纵坐标,图片地址) putimage(0, 0, &mage); //透明贴图(去掉一张图片原本的背景):通过图像的颜色二进制运算达到去背景效果 //要处理扣图片:黑白背景 IMAGE test[2]; //掩码图加载 loadimage(test+0,"./images/1.png",800,600); //背景图加载 loadimage(test+0,"./images/2.png",800,600); //贴图 putimage(100,100,test+0,SRCAND); //贴掩码图 putimage(100,100,test+1,SRCPAINT); //贴背景图 //双缓冲贴图:解决一闪一闪的问题 //在BeginBatchDraw(); 和 EndBatchDraw();写代码 //键盘事件消息demo2中有举例 getchar(); closegraph(); return 0; }
精灵图(drawImg报错)后面修改
#define _CRT_SECURE_NO_WARNINGS 1 #include<graphics.h> #include<stdio.h> #include<conio.h> #include<mmsystem.h> //包含多媒体接口,一定放在graphics.h下面 #pragma comment(lib,"winmm.lib") //预处理指令接口连接库 #include<easyx.h> //这个是只包含最新的API(函数接口) #include<graphics.h> //这个头文件包含了上面的,还包含了已经不推荐使用的函数 #include<stdio.h> //getchar的头文件 #include<time.h> int main() { initgraph(500, 500,SHOWCONSOLE); setbkcolor(WHITE); cleardevice(); //精灵动画:一排有很多照片实现动画 IMAGE img_sheet; loadimage(&img_sheet,"./images/wugui.jpg"); const int frameDelay=1000/60; int frameStart=0; int frameTime=0; int imgsize=32; //每帧的尺寸 int frames=7; //精灵的个数 int speed=200; //速度毫秒 int index=0; //下标:贴那一张图片 while (true) { frameStart=clock(); BeginBatchDraw(); cleardevice(); drawImg(250,250,imgsize,imgsize,&img_sheet,index * imgsize,0); EndBatchDraw(); index=(clock()/speed)%frames; frameTime = clock() - frameStart; if (frameDelay-frameTime>0) //16 -10 = 6 >0 { Sleep(frameDelay-frameTime); } getchar(); closegraph(); return 0; }
七:背景音乐
#define _CRT_SECURE_NO_WARNINGS 1 #include<graphics.h> #include<stdio.h> #include<conio.h> #include<mmsystem.h> //包含多媒体接口,一定放在graphics.h下面 #pragma comment(lib,"winmm.lib") //预处理指令接口连接库 void BGM() { //读取音乐:文件为.mp3为后缀才可播放,要把音乐拷贝到项目所在文件夹里 //打开音乐 //0,0,0为默认输出控制台 mciSendString("open ./images/ha.wav alias bgm", 0, 0, 0); //mciSendString("open ./images/ha.wav", 0, 0, 0); //播放音乐 重复播放repeat mciSendString("play bgm repeat", 0, 0, 0); //mciSendString("play ./images/ha.wav", 0, 0, 0); //设置音量大小 0~1000 mciSendString("setaudio bgm volume to 10",NULL,0,NULL); //专门用来播放音效 表示路径是文件名 异步 PlaySound("./images/ha.wav",NULL,SND_FILENAME|SND_ASYNC); if (0) { mciSendString("test./images/ha.wav",0, 0, 0); } } int main() { initgraph(500, 500,SHOWCONSOLE); setbkcolor(WHITE); cleardevice(); BGM();//调用 getchar(); closegraph(); return 0; }