EasyX图形库教程

本文的封面第三章照片来自博客:爱心气球

文章目录

    • EasyX图形库教程
      • 前言
      • 1.EasyX是什么?
      • 2.EasyX的安装
    • 开始教程
      • 1.基本概念
        • 1.1颜色
        • 1.2坐标
      • 2.创建窗口 — 基本框架
      • 3.颜色设置
        • 3.1背景颜色
        • 3.2设置线条颜色
        • 3.3设置文本颜色
        • 3.4设置填充颜色
      • 4样式设置
        • 4.1设置背景样式
        • 4.2设置线条样式
        • 4.3设置文本样式
      • 5.绘制图形
        • 画圆示例
        • 5.2图形大全
      • 6.文本输出
        • 6.1文本居中显示
      • 7.图片输出
      • 8.鼠标操作
      • 9.键盘操作
        • 9.2防止屏幕屏闪
        • 9.2平动 + 斜动(丝滑版)
      • 10.音乐播放
        • 10.1准备工作
      • 11.弹出消息框

前言

  本文章所使用到的资源分享:(均是免费,白嫖万岁)

  1. 在线转换gif动图
  2. qq截图
  3. 在线画图网站:diagrams.net – 流程图
  4. 思维导图软件:Xmind

1.EasyX是什么?

EasyX 是针对 C++ 的图形库,可以帮助 C/C++ 初学者快速上手图形和游戏编程。虽然是C++图形库,但是C和C++不分家,只要你学了C语言,或者一门编程语言,那么学习成本都不会很高,学习门槛很低。它是可以帮助我们去实现图形化,优美化的小游戏的工具,例如:贪吃蛇,俄罗斯方块,扫雷等等。

大部分学校只交基础语法,一直都在黑窗口(也就是我们平时所说的控制台)上练习,同学们都学习很乏味。于是博主给大家出了一个easyx开发软件的教程哦~快乐学编程

2.EasyX的安装

操作系统:Windows XP(sp3) 及以上操作系统。
编译环境:Visual C++ 6.0,Visual Studio 2008 至 Visual Studio 2022 (x86 & x64)。

大家不要拿着devc++,gcc去下个EasyX图形库然后跟博主说我的用不了咧

安装网址(<—点这里)安装过程很简单,跟着指导来即可,而且不需要考虑会不会安装位置不对,在安装的时候它会找到你的vs的安装文件对应的位置进行安装,由于博主的vs版本是2013和2019,所以我安装的也是13和19的(两个都安装了),不出意义的话大家是可以去下载vs2022版本的EasyX的。

开始教程

特别注意:大家平时写程序怎么创建项目,就怎么创建项目即可,但是注意我们在使用EasyX的时候,源文件后缀要是.cpp

1.基本概念

1.1颜色

总所周知,所有的颜色都可以由三原色构成 :

  • R – red – 红色
  • G – green – 绿色
  • B – blue – 蓝色

简称RGB,也就是说只要有这三种颜色,那么我们可以通过改变这三种颜色的浓度值,即可构成不同的颜色

例如上述画板选中的颜色的值可以表示成RGB(128,128,192)

其中R G B的值的范围都是0~255

1.2坐标

没有小看大家,我们在数学中就已经学过平面直角坐标系了,如下

  而当我们使用EasyX创建的窗口的纵轴方向和上图中的是相反的。如下:

2.创建窗口 – 基本框架

  我们在使用EasyX的时候都是去调用图形库里面的接口,说白了就是学习它里面的函数怎么使用。

涉及接口

HWND initgraph(int width, int height, int flag = 0);//创建窗口void closegraph();//关闭窗口//参数1决定窗口的宽度,参数2决定窗口的高度,参数三决定窗口的模式参数3#define SHOWCONSOLE1// 显示控制台#define NOCLOSE2// 不可关闭,就是窗口的❎不见了#define NOMINIMIZE4// 不可最小化,就是窗口的➖不见了

代码演示1:

#include//记得加上这个头文件#includeint main(){initgraph(1024, 480,SHOWCONSOLE);getchar();//防止窗口一闪而过,我们让其等待输出停一会儿closegraph();//关闭窗口return 0;}

  在我们创建的窗口中,宽度和高度的单位是:像素点,当然了,我们要看完整的函数声明,是可以对函数名进行,右键 > 转到定义去查看的

大家可以将试一试这几个参数的效果,查看更多参数可以右键>转到定义,就可以看到更到的宏参数了

上面的三个参数是可以同时放进去的,就像这样initgraph(1024, 480,SHOWCONSOLE | NOCLOSE | NOMINIMIZE);

再次温馨提示,源文件必须是.cpp文件

  没错上面的窗口就是我们创建出来的窗口,我们发现它的窗口名不再是对应的项目路径,而且右侧已经不再是滚动条,说明此时它已经不是控制台窗口了,没错这个现在看起来还是很low,下面我们就自己设计一下自己的窗口

3.颜色设置

 咱们先将可以设置颜色的接口介绍一遍,后面都会使用到

3.1背景颜色

  使用到的接口

void setbkcolor(COLORREF color);//设置背景颜色,参数填入颜色RGB值void cleardevice();//清空设备

  当这两个接收一起使用时,才能达到效果

3.2设置线条颜色

void setlinecolor(COLORREF color);

3.3设置文本颜色

void settextcolor(COLORREF color);

3.4设置填充颜色

void setfillcolor(COLORREF color);

4样式设置

 咱们先将可以设置样式的接口介绍一遍,后面都会使用到

4.1设置背景样式

可以设置成是背景是填充还是覆盖

void setbkmode(int mode);//设置背景模式参数:#define TRANSPARENT 1 //透明的#define OPAQUE2 //覆盖的默认不设置的情况下是覆盖的的

4.2设置线条样式

void setlinestyle(int style, int thickness = 1, const DWORD *puserstyle = NULL, DWORD userstylecount = 0);//第一个参数是设置线条的样式 -- 实线,虚线等参数1#define PS_SOLID0#define PS_DASH 1 /* -------*/#define PS_DOT2 /* .......*/#define PS_DASHDOT3 /* _._._._*/#define PS_DASHDOTDOT 4 /* _.._.._*///参数2是设置线条的宽度,单位是像素点第三个参数,第四个参数大家可以不填

4.3设置文本样式

void settextstyle(int nHeight, int nWidth, LPCTSTR lpszFace);//参数1:文本高度//参数2:文本宽度//参数3:文本的字体 -- 大家可以理解成就是填一个const char*的参数参数三:1. "宋体"2. "楷体"很多很多,大家可以试一试word里面的那些字体哪些可以用

⚠:千万注意,千万注意,千万注意,很多同学在使用文本接口的时候经常报错,这是应为需要修改项目属性,我们要将使用 Unicode 字符集 — 改成 使用多字节字符集

5.绘制图形

  你在画板中可以画的图案,几乎都可以做到,下面我们已画圆举例

画圆示例

使用的接口

void circle(int x, int y, int radius);//画一个由线条边框组成,无填充的圆void fillcircle (int x, int y, int radius);// 画一个有线条边框,有填充的圆void solidcircle(int x, int y, int radius);//画一个无线条边框,有填充的圆

x y–即圆的坐标,radius – 即圆的半径

代码举例2:

#include#include//1.设置颜色void set_color(){//1.设置背景颜色,要和cleardevice一起使用setbkcolor(RGB(204, 232, 207));//将背景设置成浅绿色cleardevice();//2.设置线条颜色setlinecolor(RGB(128, 255, 255));//将线条颜色设置成天蓝色//3.设置填充颜色setfillcolor(RGB(255, 201, 14));//设置填充颜色为黄色//4.设置文本颜色settextcolor(RGB(245, 245, 245));//文本颜色设置成白色}//2.设置样式void set_mode(){//1.将背景设置成透明setbkmode(TRANSPARENT);//2.将线条设置成3个像素点宽度setlinestyle(PS_SOLID, 3);//3.将文本高度设置成20,宽度设置成10,字体设置成楷体settextstyle(20, 10, "楷体");}//3.绘制图案void draw_picture(){circle(50,50,50);//在(50,50)的位置画一个圆fillcircle(150, 50, 50);solidcircle(250, 50, 50);}int main(){initgraph(1024, 480,SHOWCONSOLE);//显示控制台set_color();//设置颜色draw_picture();//绘制图形getchar();closegraph();return 0;}

⚠再次提示,上述代码跑不过的同学,去检查一下项目属性,有没有将使用 Unicode 字符集 — 改成 使用多字节字符集

那么如何获取一个颜色的RGB值呢?温馨小科普:在我们登录qq之后

  1. 按下Alt + shift + A键,即可开启截图模式
  2. 然后将光标移到你喜欢的颜色上
  3. 按下C键,即可获取该颜色的RGB值

快去动手试试吧。

5.2图形大全

绘制各种图形也是大同小异,大家可以查看这个图形的接口文档来绘制自己喜欢的图形:图形文档(点击这里哟)

6.文本输出

  这里我们使用的接口是非easyx库函数,而是头文件#include的函数,大家记得包含。

接口介绍

void outtextxy(int x, int y, LPCTSTR str);大家可以将LPCTSTR类型理解成char*类型

  为了节省空间,上述写过的set_color()set_mode(),我们就在不放在代码块里面,大家自行引用哈(在画圆示例里面已经写了)

代码示例3

#include#include#include//1.//2.//3.绘制图案void draw_picture(){circle(50,50,50);fillcircle(150, 50, 50);solidcircle(250, 50, 50);}//4.文本输出void textout(){outtextxy(50, 50, "大家好,我叫彭于晏");}int main(){initgraph(1024, 480,SHOWCONSOLE);//显示控制台set_color();set_mode();draw_picture();textout();getchar();closegraph();return 0;}

效果:

6.1文本居中显示

使用接口

int textwidth(LPCTSTR str);// Get the width of a stringint textheight(LPCTSTR str);// Get the height of a string想必大家都看的懂这几句英文,单位还是像素点

原理介绍:

#include#include#include//1.//2.//3.绘制图像void draw_picture(){circle(50,50,50);fillcircle(150, 50, 50);solidcircle(250, 50, 50);rectangle(50, 150, 350, 250);//300*100的矩形}//4.文本输出void textout(){int x = 0;int y = 0;char str[] = "大家好,我叫彭于晏";x = 50 + (300 - textwidth(str)) / 2;y = 150 + (100 - textheight(str)) / 2;outtextxy(x, y, str);}int main(){initgraph(1024, 480,SHOWCONSOLE);//显示控制台set_color();set_mode();draw_picture();textout();getchar();closegraph();return 0;}

效果:

  这样就可以自动居中了,非常方便

7.图片输出

  需求:我们要将下面的动图加载到内存中,并且输出在我们的窗口上面。

  首先我们要将这张照片放到,当前项目的路径底下,与.cpp文件是一个路径,然后我们给他进行一个重命名叫么么么.jpg

使用的接口和类

IMAGE //大家可以理解成,描述图片的结构体,我们可以用来定义对象来描述图片void loadimage(IMAGE *pDstImg, LPCTSTR pImgFile, int nWidth = 0, int nHeight = 0, bool bResize = false);//加载图片进内存中,建立图片对象和图片的练习//就像c语言的文件和文件指针一样,用来控制文件,操作文件//参数1:图片对象指针//参数2:图片路径//参数3:图片宽度(可不填)//参数4:图片高度(可不填)//参数5可不填void putimage(int dstX, int dstY, const IMAGE *pSrcImg, DWORD dwRop = SRCCOPY);//输出图片//参数1,2:输出图片的坐标//参数3:图片对象指针//参数4可不填

代码示例:

为了节省空间,上述的1.set_color()2.set_mode(),3.draw_picture(),4.textout()我们就不放在代码块里面了,大家如果跟着动手也应该把函数放好了

#include#include#include//1.//2.//3.//4.//5.图片输出void test_photo(){IMAGE img;loadimage(&img, "./么么么.gif");putimage(450, 200, &img);}int main(){initgraph(1024, 480,SHOWCONSOLE);//显示控制台set_color();set_mode();draw_picture();//绘制图形textout();//文本输出test_photo();//图片输出getchar();closegraph();return 0;}

效果:

  不过没有输出动图的效果,有点可惜

8.鼠标操作

  需求:当我们使用左键点击文本框区域时,控制台窗口会输出左键被激活,当我们使用右键点击文本区域时,控制台窗口会输出右键被激活。

涉及接口和类:

ExMessage//描述接收信息的结构体,可以用来创建鼠标,键盘等对象//以鼠标举例bool peekmessage(ExMessage *msg, BYTE filter = -1, bool removemsg = true);//接收鼠标消息 -- 看是否有鼠标消息//参数1 , 对象指针//参数2 , 对象类型参数2参数选择:#define EX_MOUSE1//鼠标#define EX_KEY2//键盘#define EX_CHAR4#define EX_WINDOW8mouse的成员变量:1.message//鼠标信息 -- 左键还是右键还是移动还是滚轮有如下信息:#define WM_MOUSEMOVE0x0200//鼠标移动#define WM_LBUTTONDOWN0x0201//左键点击#define WM_LBUTTONUP0x0202//左键弹起#define WM_LBUTTONDBLCLK0x0203//左键双击#define WM_RBUTTONDOWN0x0204//右键点击#define WM_RBUTTONUP0x0205//右键弹起#define WM_RBUTTONDBLCLK0x0206//右键双击#define WM_MBUTTONDOWN0x0207//中键点击#define WM_MBUTTONUP0x0208//中键弹起#define WM_MBUTTONDBLCLK0x0209//中间双击2.struct{short x;// 横坐标short y;// 纵坐标};

上代码:

#include#include#include//1.//2.//3.//4.//5//6.鼠标操作void MouseButton(){ExMessage mouse;//创建鼠标对象while (true){if (peekmessage(&mouse, EX_MOUSE))//接收鼠标信息{if (mouse.x >= 50 && mouse.x <= 350 && mouse.y >= 150 && mouse.y <= 250)//点击矩形区域内{switch (mouse.message)//鼠标信息发布{case WM_LBUTTONDOWN:printf("我是左键,我被激活了\n");break;case WM_RBUTTONDOWN:printf("我是右键,我被激活了\n");break;case WM_MOUSEMOVE:// 鼠标移动的时候画红色的小点putpixel(mouse.x, mouse.y, RGB(237, 28, 36));break;case WM_MOUSEWHEEL:printf("滚轮滚动\n");break;}}}}}//用来测试//基本框架int main(){//initgraph(1024, 480);initgraph(1024, 480,SHOWCONSOLE);//显示控制台//initgraph(1024, 480, SHOWCONSOLE | NOCLOSE | NOMINIMIZE);//显示控制台//initgraph(1024, 480, EW_DBLCLKS);//显示控制台set_color();set_mode();draw_picture();//绘制图形textout();//文本输出test_photo();//图片输出MouseButton();//鼠标操作getchar();closegraph();return 0;}

效果演示:

  除了上述演示的左键,右键,大家也可以仿照着函数模式(接口使用方式上述已经介绍),加入不同的宏参数,达到不同的效果,例如:左键双击,左键弹起,学会举一反三哟!!!

9.键盘操作

需求:画出一个小球,现在使用键盘的上下左右键,或者wasd键去控制它的上下左右移动

####9.1平动

设计的接口和类

bool kbhit(void);//判断键盘是否输入char _getch();//接收键盘按下的按键的值,如果是字符就是ASCII码其中上下左右键对应的值分别是://⬆ 72--上键//⬇ 80--下键//⬅ 75 --左键//➡ 77 --右键//为了方便大家理解,我把这个接口的类型修改了一下,具体是什么大家可以转到定义去看

  注意进行鼠标操作,键盘操作时,我们都是要在循环中进行的,因为接口函数在等待着你的鼠标,键盘输入消息,如果不再循环中进行操作,那么在第一个0.0000001秒时,你没有输入消息,这些接收信息接口就过去了,我们需要重复调用这些接口。

#include#include#include//1.//2.//3.//4.//5.//6.//7.键盘操作void key_oper(){//1.画一个半径50的圆,起始位置是(0,0)int x = 0;int y = 0;int r = 50;setbkmode(TRANSPARENT);while (true){fillcircle(x, y, 50);if (kbhit())//判断有没有键盘按下{char key = _getch();//阻塞函数,等待键盘的输入//printf("%d -> %c\n", key, key);switch (key){case 72:case 'w':case 'W':printf("上键操作\n");y -= 3;break;case 80:case 's':case 'S':printf("下键操作\n");y += 3;break;case 75:case 'a':case 'A':printf("左键操作\n");x -= 3;break;case 77:case 'd':case 'D':printf("右键操作\n");x += 3;break;}}}}int main(){initgraph(1024, 480,SHOWCONSOLE);//显示控制台set_color();//设置颜色set_mode();//设置样式draw_picture();//绘制图形textout();//文本输出test_photo();//图片输出//MouseButton();//鼠标操作key_oper();//键盘操作getchar();closegraph();return 0;}

为了演示出键盘操作的效果,我们将鼠标操作的函数关闭掉,因为不关闭会一直卡在鼠标操作的那个死循环里面。

效果演示:

  效果虽然演示出来了,但是小球走过的区域都会被覆盖成蓝色,明明背景样式已经设置成透明了,为什么呢?其实是因为线条的颜色给走过的区域覆盖成了一层蓝色。为了让样条颜色不对走过区域进行覆盖,我们让循环每进行一次,我们都重新打印一遍我们的图形,照片。这样就能达到我们想要的效果!!!

代码改装:

#include#include#include//1.//2.//3.//4.//5.//6.//7.键盘操作void key_oper(){//1.画一个半径50的圆,起始位置是(0,0)int x = 0;int y = 0;int r = 50;setbkmode(TRANSPARENT);while (true){BeginBatchDraw();//我们将这些操作放在了循环中set_color();//设置颜色set_mode();//设置样式draw_picture();//绘制图形textout();//文本输出test_photo();//图片输出fillcircle(x, y, 50);FlushBatchDraw();if (kbhit())//判断有没有键盘按下{char key = _getch();//阻塞函数,等待键盘的输入//printf("%d -> %c\n", key, key);switch (key){case 72:case 'w':case 'W':printf("上键操作\n");y -= 3;break;case 80:case 's':case 'S':printf("下键操作\n");y += 3;break;case 75:case 'a':case 'A':printf("左键操作\n");x -= 3;break;case 77:case 'd':case 'D':printf("右键操作\n");x += 3;break;}}}}int main(){initgraph(1024, 480,SHOWCONSOLE);//显示控制台//MouseButton();//鼠标操作key_oper();//键盘操作getchar();closegraph();return 0;}

   BeginBatchDraw()``FlushBatchDraw()是防止 屏幕频闪,下方就讲解了原理。

效果演示:(wasd + 上下左右键)均支持

9.2防止屏幕屏闪

涉及接口:

void BeginBatchDraw();// Begin batch drawing modevoid FlushBatchDraw();// Refreshes the undisplayed drawing

使用方法

  1. 在程序的绘制图案的操作之前加上BeginBatchDraw();

  2. 在程序的绘制图案的操作之前加上FlushBatchDraw();

原理

  造成频闪的原因是:因为绘制一次图案就进行一次清屏,在这两个操作之间进行频繁切换就会看到频闪,即使计算机运行速度很快,我们还是很容易看到其中的频闪。

  大家可以理解成一个小屁孩拿着一个手电筒在你面前来回的晃,你会觉得很闪,即使它晃得速度很快。

解决方法

  进行多次绘制图案操作,进行一次清屏,减少切换的频率。而BeginBatchDraw()就会在我们进行输入操作之后,将这些输入信息先放到缓冲区,遇到FlushBatchDraw()再刷新到窗口上。

   大家可以理解成一个小屁孩拿着一个手电筒在你面前找了很久,才进行一次晃动,这样闪的频率就会大大缩短。

9.2平动 + 斜动(丝滑版)

涉及接口:

bool GetAsyncKeyState(int vKey);//为了方便大家理解,类型修改了以下,完整版大家可以转到定义查看参数3选择:(参数太多,介绍几个常有的)#define VK_LEFT 0x25//←键#define VK_UP 0x26//↑键#define VK_RIGHT0x27//→键#define VK_DOWN 0x28//↓键#define VK_SPACE0x20//空格键当然了还有以下这些,大家都可以试一试VK_SHIFT Shift键VK_LSHIFT 左Shift键VK_RSHIFT 右Shift键VK_CONTROL Ctrl键VK_LCONTROL 左Ctrl键VK_RCONTROL 右Ctril键VK_MENU Alt键VK_LMENU 左Alt键VK_RMENU 右Alt键VK_LBUTTON 鼠标左键VK_RBUTTON 鼠标右键VK_ESCAPE ESC键VK_RETURN回车键
#include#include#include//1.//2.//3.//4.//5.//6.//7.键盘操作void key_oper(){//1.画一个半径50的圆,起始位置是(0,0)int x = 0;int y = 0;int r = 50;setbkmode(TRANSPARENT);while (true){BeginBatchDraw();set_color();//设置颜色set_mode();//设置样式draw_picture();//绘制图形textout();//文本输出test_photo();//图片输出fillcircle(x, y, 50);FlushBatchDraw();//平动+斜动(丝滑版本)if (GetAsyncKeyState(VK_UP))//上键{y -= 3;}if (GetAsyncKeyState(VK_DOWN))//下键{y += 3;}if (GetAsyncKeyState(VK_LEFT))//左键{x -= 3;}if (GetAsyncKeyState(VK_RIGHT))//右键{x += 3;}}}//用来测试//基本框架int main(){initgraph(1024, 480,SHOWCONSOLE);//显示控制台//MouseButton();//鼠标操作key_oper();//键盘操作getchar();closegraph();return 0;}

效果演示: – 非常地丝滑

10.音乐播放

10.1准备工作

包含头文件 + 导入静态库

#include//包含的头文件,包含在graphics.h头文件下面#pragma comment(lib,"winmm.lib")//导入静态库

放一些音乐文件在当前项目路径底下(不一定所有的文件类型都可以),在图片输出的时候已经讲过怎么找当前项目路径,博主放了一首IU的歌。

涉及接口

mciSendString(open "文件路径",0,0,0);//打开音乐mciSendString(open "文件路径",0,0,0);//打开音乐mciSendString(open "文件路径",0,0,0);//打开音乐//可以修改路径名,下面有介绍

代码实操

#include#include#include//包含的头文件,包含在graphics.h头文件下面#include#pragma comment(lib,"winmm.lib")//导入静态库//1.//2.//3.//4.//5.//6.//7.//8.音乐播放void BGM(){mciSendString("open ./Blueming-IU.mp3 alias IU", 0, 0, 0);//打开音乐,并对文件路径进行了重命名mciSendString("play IU", 0, 0, 0);//播放音乐//现学现用的键盘操作while (true){if (GetAsyncKeyState(VK_SPACE))//空格关闭音乐{mciSendString("close IU", 0, 0, 0);break;}}}int main(){initgraph(1024, 480,SHOWCONSOLE);//显示控制台//MouseButton();//鼠标操作//key_oper();//键盘操作BGM();getchar();closegraph();return 0;}

记得把鼠标操作,键盘操作都给关闭

在音乐放起的那一刻,整个DNA都动起来了,赶紧去动手试试吧,给自己的程序加上音乐

11.弹出消息框

涉及的接口和类

句柄大家可以理解成是描述窗口的对象。用来建立与窗口之间的联系

HWND // 描述句柄的结构体HWND GetHWnd();//获取窗口句柄,并返回SetWindowText(HWND& hd,const char* name);//设置窗口的标题参数1:句柄对象参数2:标题名字这里只是为了方便大家理解,做了一定修改,大家可以转到定义去看完整版,是一个宏int MessageBox((HWND& hd,const char* name1,const char* name2,int val);参数1NULL or 句柄对象参数2和参数3都是是文本名,如下面窗口: 参数4决定窗口的效果,选择有: #define MB_OK 0x00000000L#define MB_OKCANCEL 0x00000001L#define MB_ABORTRETRYIGNORE 0x00000002L#define MB_YESNOCANCEL0x00000003L#define MB_YESNO0x00000004L#define MB_RETRYCANCEL0x00000005L 下面窗口的参数4就是MB_OKCANCEL 返回值:鼠标点击的按钮值,帮助我们进行点击之后的操作,返回值有#define IDOK1#define IDCANCEL2#define IDABORT 3#define IDRETRY 4#define IDIGNORE5#define IDYES 6#define IDNO7 

代码演示

#include#include#include//包含的头文件,包含在graphics.h头文件下面#include#pragma comment(lib,"winmm.lib")//导入静态库//1.//2.//3.//4.//5.//6.//7.//8.//9.弹出消息框void Hatch()//Hatch是窗口的意思{HWND hd = GetHWnd();//获取窗口的句柄SetWindowText(NULL, "贪吃蛇小游戏");//修改窗口的文本(名字)//int mbok = MessageBox(hd, "是否要再玩一局", "提示", MB_OKCANCEL);//弹出消息窗口int mbok = MessageBox(NULL, "是否要再玩一局", "提示", MB_OKCANCEL);//第一个参数决定,点击窗口是否有顺序if (mbok == IDOK){printf("再玩一局\n");}else if (mbok == IDCANCEL){printf("退出游戏\n");}}int main(){initgraph(1024, 480,SHOWCONSOLE);//显示控制台//MouseButton();//鼠标操作//key_oper();//键盘操作//BGM();Hatch();getchar();closegraph();return 0;}

  大家仔细看看,窗口名字也变成了贪吃蛇小游戏

int mbok = MessageBox(NULL, "是否要再玩一局", "提示", MB_OKCANCEL);该接口的第一个参数决定了点击窗口的顺序,如果是NULL,那么窗口是可以任意点击的,如果是hd,那么只能优先点击消息弹出窗口。

如果你坚持看到这里来了,并且按照上面进行动手操作了

  • 首先是感谢你对博主文章滴认可,这么长的文章没有随身在收藏夹吃灰。
  • 其次就是恭喜你已经成功入门easyx了,相信对你会有一定上的成长和帮助。

咱们下期见啦!!!