还在每天玩单调的控制台窗口?赶紧进来!!!用EasyX画出自己的优美窗口(万字教程,一文入门)

news2025/8/7 23:21:43

EasyX图形库教程

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

img

文章目录

    • 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 SHOWCONSOLE		1		// 显示控制台
#define NOCLOSE			2		// 不可关闭,就是窗口的❎不见了
#define NOMINIMIZE		4		// 不可最小化,就是窗口的➖不见了  

 

代码演示1:

#include<graphics.h>//记得加上这个头文件

#include<stdio.h>

int 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 OPAQUE              2   //覆盖的
    
默认不设置的情况下是覆盖的的

 

4.2设置线条样式

void setlinestyle(int style, int thickness = 1, const DWORD *puserstyle = NULL, DWORD userstylecount = 0);

//第一个参数是设置线条的样式 -- 实线,虚线等
参数1#define PS_SOLID            0
#define PS_DASH             1       /* -------  */
#define PS_DOT              2       /* .......  */
#define PS_DASHDOT          3       /* _._._._  */
#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<stdio.h>

#include<graphics.h>

//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<conio.h>的函数,大家记得包含。

接口介绍

void outtextxy(int x, int y, LPCTSTR str);

大家可以将LPCTSTR类型理解成char*类型

 

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

 

代码示例3

#include<stdio.h>

#include<graphics.h>

#include<conio.h>

//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 string

int textheight(LPCTSTR str);							// Get the height of a string

想必大家都看的懂这几句英文,单位还是像素点

原理介绍:

在这里插入图片描述

#include<stdio.h>

#include<graphics.h>

#include<conio.h>

//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<stdio.h>

#include<graphics.h>

#include<conio.h>

//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_MOUSE	1  //鼠标
#define EX_KEY		2  //键盘
#define EX_CHAR		4
#define EX_WINDOW	8
    
mouse的成员变量:

1.
message//鼠标信息 -- 左键还是右键还是移动还是滚轮
    有如下信息:
#define WM_MOUSEMOVE                    0x0200//鼠标移动
#define WM_LBUTTONDOWN                  0x0201//左键点击
#define WM_LBUTTONUP                    0x0202//左键弹起    
#define WM_LBUTTONDBLCLK                0x0203//左键双击
#define WM_RBUTTONDOWN                  0x0204//右键点击
#define WM_RBUTTONUP                    0x0205//右键弹起
#define WM_RBUTTONDBLCLK                0x0206//右键双击
#define WM_MBUTTONDOWN                  0x0207//中键点击
#define WM_MBUTTONUP                    0x0208//中键弹起
#define WM_MBUTTONDBLCLK                0x0209//中间双击

2.
struct
{
    short x;				// 横坐标
    short y;				// 纵坐标
};

 

上代码:

#include<stdio.h>

#include<graphics.h>

#include<conio.h>

//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<stdio.h>

#include<graphics.h>

#include<conio.h>

//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<stdio.h>

#include<graphics.h>

#include<conio.h>

//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 mode

void 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_RIGHT          0x27//→键
#define VK_DOWN           0x28//↓键    
#define VK_SPACE          0x20//空格键
    
当然了还有以下这些,大家都可以试一试
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<stdio.h>

#include<graphics.h>

#include<conio.h>

//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<mmsystem.h>//包含的头文件,包含在graphics.h头文件下面

#pragma comment(lib,"winmm.lib")//导入静态库

 

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

在这里插入图片描述

涉及接口

mciSendString(open "文件路径",0,0,0);//打开音乐

mciSendString(open "文件路径",0,0,0);//打开音乐

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

 

代码实操

#include<stdio.h>

#include<graphics.h>
#include<mmsystem.h>//包含的头文件,包含在graphics.h头文件下面

#include<conio.h>
#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_YESNOCANCEL              0x00000003L
#define MB_YESNO                    0x00000004L
#define MB_RETRYCANCEL              0x00000005L                
 
下面窗口的参数4就是  MB_OKCANCEL      
               

返回值:鼠标点击的按钮值,帮助我们进行点击之后的操作,返回值有
#define IDOK                1
#define IDCANCEL            2
#define IDABORT             3
#define IDRETRY             4
#define IDIGNORE            5
#define IDYES               6
#define IDNO                7                           

在这里插入图片描述

 

代码演示

#include<stdio.h>

#include<graphics.h>
#include<mmsystem.h>//包含的头文件,包含在graphics.h头文件下面

#include<conio.h>
#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了,相信对你会有一定上的成长和帮助。

在这里插入图片描述

咱们下期见啦!!!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/34514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计之java+ssm家校通网站

项目介绍 随着网络技术的飞速发展&#xff0c;网络已渗透到全人类的各个方面&#xff0c;深刻影响着我们的生活和工作方式。家校通网站给教育带来了更广阔的发展空间。家校通网站有对部分类似网站进行分析&#xff0c;找到规律和方法&#xff0c;吸取其特点&#xff0c;构思自…

Win11关闭Superfetch服务的操作方法分享

Win11关闭Superfetch服务的操作方法分享。有用户发现自己电脑在开机的时候&#xff0c;都会出现Superfetch服务的相关程序进程。为了优化自己的运行内存&#xff0c;想要将这个功能给进行关闭。那么电脑的Superfetch服务怎么去关闭&#xff0c;一起来看看关闭的方法吧。 操作方…

天宇优配|北上广深角逐“国字号”数据交易所 行业爆点

今日&#xff0c;上海数据生意地点揭牌一周年之际&#xff0c;将发动数据生意节&#xff0c;并将探究树立数交所国际板。10天前&#xff0c;深圳数据生意所正式揭牌。至此&#xff0c;北上广深四个一线城市均已树立数据生意所。 数据作为新型生产要素&#xff0c;正成为各地争相…

想过为什么家里的IP是192.168开头的吗?

为什么我们家里的IP都是192.168开头的&#xff1f; 是的&#xff0c;就是我&#xff0c;先不做什么技术博主了&#xff0c;做个老情感博主&#xff08;手动狗头&#xff09;。 来讲个故事。 资深老舔狗小王今天很兴奋&#xff0c;说什么也要请大家喝奶茶。 因为他说他感觉要跟…

基于ModelCoder的汽车悬挂系统建模

悬挂系统是汽车的车架与车桥或车轮之间的一切传力连接装置的总称&#xff0c;其功能是传递作用在车轮和车架之间的力和力矩&#xff0c;并且缓冲由不平路面传给车架或车身的冲击力&#xff0c;衰减由此引起的振动&#xff0c;以保证汽车平顺行驶。 悬挂系统主要功能为支持车身…

事业编招聘:国家无线电监测中心2022年公开招聘

一、单位简介 国家无线电监测中心检测中心是国家无线电监测中心/国家无线电频谱管理中心下属的独立事业法人机构&#xff0c;主要从事无线电技术领域的检测认证、产品研发、科研标准、行业咨询和政府支撑等工作&#xff0c;在北京、河北永清、广东深圳、上海、湖南长沙、四川成…

如何在你的 wordpress 网站中添加搜索框

&#x1f482; 个人网站:【海拥】【摸鱼游戏】【神级源码资源网站】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】&#x1f4ac; 免费且…

计算机毕业设计之java+ssm理发店会员管理系统

项目介绍 本理发店会员管理系统主要包括系统用户管理模块、商品项目模块、会员消费管理、会员信息管理、会员充值管理、登录模块、和退出模块等多个模块。本系统基于SSM(SpringSpringMVCMyBatis)框架,适用于毕业设计&#xff0c;采用javaweb,基于B/S模式,Myeclipse或者eclipse…

HDI激光钻孔和常见问题

随着电子产品不断升级&#xff0c;对pcb工艺也会越来越高。且由于结构空间原因&#xff0c;对pcb的体积也会越来越小。因此pcb的工艺会越来越复杂。 一&#xff0c;什么样的孔才会用激光设备&#xff1f; 很多工程师看到工艺能力的时候&#xff0c;上面写的最小孔0.1mm&#x…

【计算机毕业设计】35.流浪动物救助及领养管理系统源码

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;流浪动物救助及领养管理也不例外&#xff0c;但目前国内的有些宠物店仍然都使用人工管理&#xff0c;宠物店的规模越来越大&…

数据结构-期末复习重要知识点总结

目录 第一章-绪论 第二章-线性表 3.顺序表表示 4.顺序表基本运算 5.链表 6.链表的基本运算 7.循环链表 8.双链表 9.静态链表 10.一元多项式表示及相加 第三章-限定性线性表&#xff08;栈与队列&#xff09; 1.顺序栈 2.链栈 3.链队列 4.循环队列 5.习题 第四章…

JavaScript中常用对象方法总结

Object.create()创建对象 该方法用于创建一个新对象&#xff0c;新建对象具有指定原型和若干个指定属性&#xff1b; Object.create(proto) Object.create(proto, propertiesObject) 该方法接收两个参数&#xff0c;第一个参数是新建对象的指定原型对象&#xff0c;第二个参数…

校企合作共建体系:亚马逊云科技的云计算人才培养之道

1984年的一天&#xff0c;有一位老人在参观两名青少年展示计算机操作时&#xff0c;说出了一句被人们传颂至今的名言&#xff1a;“计算机的普及要从娃娃抓起。”数十年后的今天&#xff0c;伴随着云计算在全球的风起云涌&#xff0c;中国对云计算人才的需求也在与日俱增。面对…

RabbitMQ系列【15】AmqpAdmin使用详解

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言1、查询队列信息2、声明、删除交换机3、声明、删除队列4、声明、删除交换机/队列绑定关系5、初始化前言 在之前&#xff0c;我们都是通过注入Bean的方式去声明交换机、队列&#xff0c;应用…

前后端分离架构好用吗?

在数据化发展趋势越来越分明的当下&#xff0c;前后端分离架构可以让前、后端的工程师们做好各自分内的事&#xff0c;专注于各自领域&#xff0c;从而提升整体办公效率和推进数字化进程。说到这&#xff0c;有不少朋友会问我们&#xff0c;前后端分离架构好用吗&#xff1f;要…

WPF的数据绑定

文章目录前言一、WPF数据绑定的概要1. 数据绑定涉及到两个方面&#xff1a;2.对于绑定源&#xff0c;在WPF可以是以下四种&#xff1a;二、 绑定的模式1.根据数据流的方向&#xff0c;WPF中的数据绑定分为以下四种&#xff1a;三.绑定目标值影响绑定源值条件1. UpdateSourceTri…

小程序开发---01小程序初识

本教程主要讲如何开发一个微信小程序&#xff0c;从小程序的注册&#xff0c;开发环境的搭建&#xff0c;基础语法&#xff0c;路由导航&#xff0c;数据请求&#xff0c;分包&#xff0c;组件化等方面详情的接受了小程序开发的一些必备基础知识。 本系列文章使用是的B站黑马教…

OpenGL原理与实践——核心模式(四):摄像机变换理论与应用

目录 变换是什么&#xff1f;对于OpenGL的摄像机又意味着什么&#xff1f; MVP变换 投影变换 正交投影变换 透视投影变换 摄像机/投影矩阵的应用 绘制单个立方体——源码及渲染结果 绘制多个立方体——源码及渲染结果 构建摄像机类——实现控制摄像机移动 摄像机坐标…

全屋智能--智慧家庭新风向

全屋智能是指综合物联网、云计算和人工智能等技术&#xff0c;对该空间场所内的家居设备进行系统化集中管理&#xff0c;并赋予其人与场景交互能力&#xff0c;成为用户看不见的生活管家。全屋智能的核心价值在于自主感知、自主决策、自主控制、自主反馈的生命力。 全屋智能目前…

图床云存储项目课程随堂笔记

这个项目属实重量级&#xff0c;第一遍学习的过程比较懵&#xff0c;只是记录一下随堂笔记。后面理解了项目后端代码流程&#xff0c;再细写几篇博客归纳。 基本单机环境配置 大的项目你可能连配置都配不清楚。 新手必须要心细&#xff0c;因为你错了一步&#xff0c;想要纠…