关于easyx头文件

news2025/6/5 20:13:15

一、窗口创建

(1)几种创建方式

#include<easyx.h>//easyx的头文件
#include<iostream>
using namespace std;

int main()
{
	//创建一个500*500的窗口
	//参数为:长度,宽度,是否显示黑框(无参为不显示黑框,有这个参数则显示)
	initgraph(500, 500);//不显示dox黑屏
	initgraph(500, 500, EX_SHOWCONSOLE);//显示dox黑屏
	
	//生成框没有关闭按钮
	initgraph(500, 500, EX_NOCLOSE);

	//生成框没有最小化按钮
	initgraph(500, 500, EX_NOMINIMIZE);

	//如果要实现多个特性的显示框,第三个参数用|连接
	initgraph(500, 500, EX_SHOWCONSOLE | EX_NOCLOSE | EX_NOMINIMIZE);

	getchar();//用于实现窗口的暂停
	return 0;
}

(2)窗口颜色调整

int main()
{
	//创建窗口(有黑框)
	initgraph(500, 500, EX_SHOWCONSOLE);

	//设置窗口颜色
	setbkcolor(WHITE);
	//清除原窗口颜色,以显示新的白色
	cleardevice();

	getchar();
}
	//库中颜色
	// Color constant
#define	BLACK			0
#define	BLUE			0xAA0000
#define	GREEN			0x00AA00
#define	CYAN			0xAAAA00
#define	RED				0x0000AA
#define	MAGENTA			0xAA00AA
#define	BROWN			0x0055AA
#define	LIGHTGRAY		0xAAAAAA
#define	DARKGRAY		0x555555
#define	LIGHTBLUE		0xFF5555
#define	LIGHTGREEN		0x55FF55
#define	LIGHTCYAN		0xFFFF55
#define	LIGHTRED		0x5555FF
#define	LIGHTMAGENTA	0xFF55FF
#define	YELLOW			0x55FFFF
#define	WHITE			0xFFFFFF
int main()
{
	//创建窗口(有黑框)
	initgraph(500, 500, EX_SHOWCONSOLE);

	//设置窗口颜色
	//在画图中查找色号可以实现想要颜色的填充,用RGB函数即可
	setbkcolor(RGB(21, 134, 41));

	//清除原窗口颜色,以显示新的颜色
	cleardevice();

	getchar();
}

        RGB号的找法:在画图软件中找

(3)坐标体系

二、基本图形绘制

 (1)线条

int main()
{
	//纯白窗口创建
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	//绘制一个点(x,y,颜色)
	putpixel(200, 100, RED);

	//绘制一条线(先设置好,再绘制)
	//设置线条颜色
	setlinecolor(BLUE);
	//设置线条样式(样式,粗细)
	setlinestyle(PS_SOLID, 3);
	//开始绘制(起点x,起点y,终点x,终点y)
	line(0, 0, 500, 500);
    //跟据显示框绘制
    line(0, 0, getwidth(), getheight());
	
	getchar();
	return 0;
}

        库中线条类型 :

/* Pen Styles */
#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

#define PS_ENDCAP_ROUND     0x00000000
#define PS_ENDCAP_SQUARE    0x00000100
#define PS_ENDCAP_FLAT      0x00000200
#define PS_ENDCAP_MASK      0x00000F00

#define PS_JOIN_ROUND       0x00000000
#define PS_JOIN_BEVEL       0x00001000
#define PS_JOIN_MITER       0x00002000
#define PS_JOIN_MASK        0x0000F000

#define PS_COSMETIC         0x00000000
#define PS_GEOMETRIC        0x00010000
#define PS_TYPE_MASK        0x000F0000

#define AD_COUNTERCLOCKWISE 1
#define AD_CLOCKWISE        2

(2)矩形

#include<easyx.h>//easyx的头文件
#include<iostream>
using namespace std;

int main()
{
	//纯白窗口创建
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	//绘制一个矩形边框
	//先调一下矩形线的颜色
	setlinecolor(RED);
	//开始绘制(左上角x,左上角y,右下角x,右下角y)
	rectangle(100, 0, 100 + 50, 0 + 50);

	//绘制一个填充颜色的矩形边框
	setlinecolor(RED);
	rectangle(210, 0, 210 + 50, 0 + 50);
	//设置填充的颜色
	setfillcolor(YELLOW);
	//把颜色填到矩形中
	fillrectangle(210, 0, 210 + 50, 0 + 50);
	
	//绘制一个无边框但填充颜色的矩形
	solidrectangle(320, 0, 320 + 50, 0 + 50);
	//设置填充的颜色
	setfillcolor(YELLOW);
	//可以看到,绘制无边框矩形时如果前面定义过填充颜色,会进行自动填充
	
	//绘制一个圆角矩形
	//开始绘制(左上角x,左上角y,右下角x,右下角y,角的椭圆a,角的椭圆b)
	roundrect(430, 0, 430 + 50, 0 + 50, 10, 10);
	//给圆角矩形填充颜色
	fillroundrect(430, 0, 430 + 50, 0 + 50, 10, 10);
	//给圆角矩形去边框
	solidroundrect(430, 0, 430 + 50, 0 + 50, 10, 10);

	getchar();
	return 0;
}

关于圆角矩形角的椭圆示意图:

(3)圆形

int main()
{
	//纯白窗口创建
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	setlinecolor(RED);
	//绘制一个圆(圆心x,圆心y,半径r)
	circle(100, 100, 50);
	//填充颜色
	setfillcolor(YELLOW);
	fillcircle(100, 100, 50);
	//去边框
	solidcircle(100, 100, 50);

	getchar();
	return 0;
}

 (4)椭圆

int main()
{
	//纯白窗口创建
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	setlinecolor(RED);
	//绘制一个椭圆(参数和矩形一样,只是会变成椭圆)
	ellipse(100, 0, 200, 50);
	//当然也可以进行颜色填充和去边操作

	getchar();
	return 0;
}

(5)库中更多图形的定义

// Drawing related functions

COLORREF getpixel(int x, int y);				// Get pixel color
void putpixel(int x, int y, COLORREF color);	// Set pixel color

void line(int x1, int y1, int x2, int y2);		// Draw a line

void rectangle	   (int left, int top, int right, int bottom);	// Draw a rectangle without filling
void fillrectangle (int left, int top, int right, int bottom);	// Draw a filled rectangle with a border
void solidrectangle(int left, int top, int right, int bottom);	// Draw a filled rectangle without a border
void clearrectangle(int left, int top, int right, int bottom);	// Clear a rectangular region

void circle		(int x, int y, int radius);		// Draw a circle without filling
void fillcircle (int x, int y, int radius);		// Draw a filled circle with a border
void solidcircle(int x, int y, int radius);		// Draw a filled circle without a border
void clearcircle(int x, int y, int radius);		// Clear a circular region

void ellipse	 (int left, int top, int right, int bottom);	// Draw an ellipse without filling
void fillellipse (int left, int top, int right, int bottom);	// Draw a filled ellipse with a border
void solidellipse(int left, int top, int right, int bottom);	// Draw a filled ellipse without a border
void clearellipse(int left, int top, int right, int bottom);	// Clear an elliptical region

void roundrect	   (int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight);		// Draw a rounded rectangle without filling
void fillroundrect (int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight);		// Draw a filled rounded rectangle with a border
void solidroundrect(int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight);		// Draw a filled rounded rectangle without a border
void clearroundrect(int left, int top, int right, int bottom, int ellipsewidth, int ellipseheight);		// Clear a rounded rectangular region

void arc	 (int left, int top, int right, int bottom, double stangle, double endangle);	// Draw an arc
void pie	 (int left, int top, int right, int bottom, double stangle, double endangle);	// Draw a sector without filling
void fillpie (int left, int top, int right, int bottom, double stangle, double endangle);	// Draw a filled sector with a border
void solidpie(int left, int top, int right, int bottom, double stangle, double endangle);	// Draw a filled sector without a border
void clearpie(int left, int top, int right, int bottom, double stangle, double endangle);	// Clear a rounded rectangular region

void polyline	 (const POINT *points, int num);								// Draw multiple consecutive lines
void polygon	 (const POINT *points, int num);								// Draw a polygon without filling
void fillpolygon (const POINT *points, int num);								// Draw a filled polygon with a border
void solidpolygon(const POINT *points, int num);								// Draw a filled polygon without a border
void clearpolygon(const POINT *points, int num);								// Clear a polygon region

void polybezier(const POINT *points, int num);									// Draw three square Bezier curves
void floodfill(int x, int y, COLORREF color, int filltype = FLOODFILLBORDER);	// Fill the area

(6)折线的绘制

int main()
{
	//纯白窗口创建
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	setlinecolor(RED);
	setlinestyle(PS_SOLID, 3);

	//POINT的实质的结构体
	POINT points[] = { {10,10},{50,50},{100,50},{220,350} };
	polyline(points, 4);

	getchar();
	return 0;
}

三、文字操作

(1)基本操作

int main()
{
	//纯白窗口创建
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	//画个填充颜色的带框矩形
	setlinecolor(RED);
	rectangle(100, 100, 300, 200);
	setfillcolor(YELLOW);
	fillrectangle(100, 100, 300, 200);

	//写文字
	// 注意:凡是easy文字相关函数的调用,字符串一定要写L进行字符集的转化
	//设置文字大小与类型(宽度,高度(0为自适应),字体)
	settextstyle(50, 0, L"华文楷体 常规");
	//设置文字颜色
	settextcolor(BLUE);
	//设置背景模式,以防止文字遮盖背景
	setbkmode(TRANSPARENT);
	//开写
	outtextxy(110, 120, L"HELLOW!");

	getchar();
	return 0;
}

        文体查找:

 

        三种解决字符集转换的方法:

(2)将int类型的变量输出为屏幕文字

        注意:这个地方使用了第三项来改变字符集

int main()
{
	//纯白窗口创建
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	//画个填充颜色的带框矩形
	setlinecolor(RED);
	rectangle(100, 100, 300, 200);
	setfillcolor(YELLOW);
	fillrectangle(100, 100, 300, 200);

	//写文字
	// 注意:凡是easy文字相关函数的调用,字符串一定要写L进行字符集的转化
	//设置文字大小与类型(宽度,高度(0为自适应),字体)
	settextstyle(50, 0, "华文楷体 常规");
	//设置文字颜色
	settextcolor(BLUE);
	//设置背景模式,以防止文字遮盖背景
	setbkmode(TRANSPARENT);
	//开写
	int score = 66;
	char str[100] = "";
	//三个参数(字符串地址,)
	sprintf_s(str, "score:%d", score);
	outtextxy(110, 120, str);

	getchar();
	return 0;
}

(3)文字在矩形居中显示

int main()
{
	//纯白窗口创建
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	//变量定义
	int rx = 100;
	int ry = 100;
	int rw = 200;
	int rh = 100;

	//画个填充颜色的带框矩形
	setlinecolor(RED);
	rectangle(rx, ry, rx + rw, ry + rh);
	setfillcolor(YELLOW);
	fillrectangle(rx, ry, rx + rw, ry + rh);

	//textwidth=tw   textheight=th
    settextstyle(30, 0, "华文楷体 常规");
	int hspace = (rw - textwidth("HELLOW!")) / 2;
	int vspace = (rh - textheight("HELLOW!")) / 2;
	
	settextcolor(BLUE);
	setbkmode(TRANSPARENT);
	
	outtextxy(rx + hspace, ry + vspace, "HELLOW!");

	getchar();
	return 0;
}

四、关于消息

(1)基本使用

        定义消息结构体,peekmessage是获取消息,返回一个bool值,如果获取到了就是真,它有三个参数,第一个是消息的地址,第二个是获取的目标,第二第三都有默认值,图中的EX_MOUSE是鼠标的意思,msg结构体有message成员存放消息信息,如果这个信息是鼠标左键被按下(WM_LBUTTONDOWN)就打印按下了鼠标左键

int main()
{
	//创建窗口
	initgraph(500, 500, EX_SHOWCONSOLE);
	//定义消息结构体变量
	ExMessage msg = { 0 };
	//套入死循环,便于多次检测消息
	while (1)
	{
		//获取消息(消息地址,控制目标(这里是鼠标))
		if (peekmessage(&msg, EX_MOUSE))
		{
			//(msg.message可以访问消息类型)
			switch (msg.message)
			{
			case WM_LBUTTONDOWN: // 左键按下
				printf("左键按下 \n");
				break;
			case WM_RBUTTONDOWN: // 右键按下
				printf("右键按下 \n");
				break;
			case WM_MBUTTONDOWN: // 中键按下
				printf("中键按下 \n");
				break;
			case WM_MOUSEWHEEL: // 滚轮滚动
				printf("滚轮滚动 \n");
				break;
			case WM_LBUTTONDBLCLK: // 左键双击
				printf("左键双击 \n");
				break;
			}
		}
	}
	return 0;
}

        库中的控制目标:

         库中的消息类型(可以在帮助文档中查找):

         打印点击位置和滚轮方向(+120是前,-120是后)

int main()
{
	//创建窗口
	initgraph(500, 500, EX_SHOWCONSOLE);
	//定义消息结构体变量
	ExMessage msg = { 0 };
	//套入死循环,便于多次检测消息
	while (1)
	{
		//获取消息(消息地址,控制目标(这里是鼠标))
		if (peekmessage(&msg, EX_MOUSE))
		{
			//(msg.message可以访问消息类型)
			switch (msg.message)
			{
			case WM_LBUTTONDOWN: // 左键按下
				printf("左键按下 pos(%d,%d)\n", msg.x, msg.y);
				break;
			case WM_RBUTTONDOWN: // 右键按下
				printf("右键按下 pos(%d,%d)\n", msg.x, msg.y);
				break;
			case WM_MBUTTONDOWN: // 中键按下
				printf("中键按下 pos(%d,%d)\n", msg.x, msg.y);
				break;
			case WM_MOUSEWHEEL: // 滚轮滚动
				printf("滚轮滚动 dir(%d)\n", msg.wheel);
				break;
			case WM_LBUTTONDBLCLK: // 左键双击
				printf("左键双击pos(%d,%d)\n", msg.x, msg.y);
				break;
			}
		}
	}
	return 0;
}

        结合键盘

int main()
{
	//创建窗口
	initgraph(500, 500, EX_SHOWCONSOLE);
	//定义消息结构体变量
	ExMessage msg = { 0 };
	//套入死循环,便于多次检测消息
	while (1)
	{
		//获取消息(这次获取的是键盘消息)
		if (peekmessage(&msg, EX_KEY))
		{
			//按键按下
			if (msg.message == WM_KEYDOWN)
			{
				printf("按键按下\n");
			}
			//按键抬起
			if (msg.message == WM_KEYUP)
			{
				printf("按键抬起\n");
			}
		}
	}
	return 0;
}

         检测具体按下了哪个键

int main()
{
	//创建窗口
	initgraph(500, 500, EX_SHOWCONSOLE);
	//定义消息结构体变量
	ExMessage msg = { 0 };
	//套入死循环,便于多次检测消息
	while (1)
	{
		//获取消息(这次获取的是键盘消息)
		if (peekmessage(&msg, EX_KEY))
		{
			//按键按下
			if (msg.message == WM_KEYDOWN)
			{
				printf("按键按下\n");
				//具体是哪个键按下
				switch (msg.vkcode)
				{
				case VK_UP:
					printf("上键按下\n");
					break;
				case VK_DOWN:
					printf("下键按下\n");
					break;
				case VK_LEFT:
					printf("左键按下\n");
					break;
				case VK_RIGHT:
					printf("右键按下\n");
					break;
					//用大写字符代表键盘上的具体某个键
				case 'A':
					printf("AAA\n");
					break;
				case 'C':
					printf("CCC\n");
					break;
				}
					
			}
			//按键抬起
			if (msg.message == WM_KEYUP)
			{
				printf("按键抬起\n");
			}
		}
	}
	return 0;
}

(2)画个移动圆形

#include<easyx.h>//easyx的头文件
#include<windows.h>
#include<iostream>
using namespace std;

int main()
{
	//创建窗口
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	//圆形属性
	int x = 50;
	int y = 50;
	int r = 30;

	int speed = 3;
	int vx = 0;
	int vy = 0;

	//开启双缓冲避免闪屏(一般是开始绘图时就要开启)
	BeginBatchDraw();

	//定义消息结构体变量
	ExMessage msg = { 0 };
	//套入死循环,便于多次检测消息
	while (1)
	{
		//清除上一帧的内容
		cleardevice();

		//获取消息(这次获取的是键盘消息)
		if (peekmessage(&msg, EX_KEY))
		{
			//按键按下
			if (msg.message == WM_KEYDOWN)
			{
				switch (msg.vkcode)
				{
				case VK_UP:
					vy = -1;
					break;
				case VK_DOWN:
					vy = 1;
					break;
				case VK_LEFT:
					vx = -1;
					break;
				case VK_RIGHT:
					vx = 1;
					break;
				}
			}

			else if (msg.message == WM_KEYUP)
			{
				switch (msg.vkcode)
				{
				case VK_UP:
					vy = 0;
					break;
				case VK_DOWN:
					vy = 0;
					break;
				case VK_LEFT:
					vx = 0;
					break;
				case VK_RIGHT:
					vx = 0;
					break;
				}
			}
		}

		//更新小球位置
		x += speed * vx;
		y += speed * vy;

		//绘制小球
		setlinecolor(RED);
		circle(x, y, r);
		setfillcolor(BLUE);
		fillcircle(x, y, 30);

		//加载双缓冲
		FlushBatchDraw();

		//这个为了控制帧率,不写会导致小球直接飞掉
		Sleep(10);
	}

	//结束双缓冲
	EndBatchDraw();
	return 0;
}

(3)按钮制作

五、帧率控制

(1)这个的问题是出现闪屏,没有控制数字改变的速度

int main()
{
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();
	setbkmode(TRANSPARENT);

	int score = 0;
	char str[50] = "";
	while (1)
	{
		sprintf_s(str, "Score:%d", score++);
		settextcolor(BLACK);

		//用于刷新分数,防止分数重叠
		cleardevice();
		outtextxy(20, 20, str);

		getchar();

	}

	return 0;
}

(2)加入双缓冲防止闪屏

        1.这是第一种,局部使用

int main()
{
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();
	setbkmode(TRANSPARENT);

	int score = 0;
	char str[50] = "";
	while (1)
	{
		sprintf_s(str, "Score:%d", score++);
		settextcolor(BLACK);

		BeginBatchDraw();

		cleardevice();
		outtextxy(20, 20, str);

		EndBatchDraw();

		getchar();

	}

	return 0;
}

        2.这是第二种,全局使用

int main()
{
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();
	setbkmode(TRANSPARENT);

	BeginBatchDraw();

	int score = 0;
	char str[50] = "";
	while (1)
	{
		sprintf_s(str, "Score:%d", score++);
		settextcolor(BLACK);

		cleardevice();
		outtextxy(20, 20, str);

		//这个写在绘制后
		FlushBatchDraw();
		getchar();
	}

	EndBatchDraw();

	return 0;
}

(3)加入帧率控制部分

int main()
{
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();
	setbkmode(TRANSPARENT);

	//60FPS定义
	//clock_t就是long
	const clock_t FPS = 1000 / 60;//1s/60帧 每一帧应该花费的时间

	int starttime = 0;//用于保存一次开始时的时间
	int freamtime = 0;//用于进行一次循环的时间

	BeginBatchDraw();

	int score = 0;
	char str[50] = "";
	while (1)
	{
		//clock返回的时程序进行到现在的时间
		starttime = clock();

		sprintf_s(str, "Score:%d", score++);
		settextcolor(BLACK);

		cleardevice();
		outtextxy(20, 20, str);

		FlushBatchDraw();

		freamtime = clock() - starttime;
		if (freamtime > 0)
		{
			//暂停使单次时间达到60FPS
			Sleep(FPS - freamtime);
		}

		getchar();
	}

	EndBatchDraw();

	return 0;
}

六、图片相关

(1)首先要有把图片保存到工程相关的地方

(2)基本操作

int main()
{
    //这里的窗口大小和图片属性的大小相同
	initgraph(2512, 1373, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	//定义图片变量
	IMAGE img;
	//加载图片(1.绝对路径 2.相对路径)
	//1. loadimage(&img, "D:\\代码\\界面库学习\\kon.jpg");
	//2. loadimage(&img,"界面库学习/kon.jpg");相对路径和main.cpp在同一个文件夹里面
	//分隔符要么是\\,要么是/
	//一般推荐第二种,便于代码移植
	loadimage(&img, "D:\\代码\\界面库学习\\界面库学习\\kon.png");
	//输出图片
    //前两个参数是图片左上角的坐标
	putimage(0, 0, &img);
	
	getchar();
	return 0;
}

 (2)原图和掩码图

        上面的例子有一个明显的缺点,图片的张贴会覆盖背景

int main()
{
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	//定义图片变量
	IMAGE img;
	loadimage(&img, "D:\\代码\\界面库学习\\界面库学习\\ghost-down.jpg");
	//输出图片
	putimage(100, 100, &img);
	
	getchar();
	return 0;
}

        把原图和它的掩码图同时加载,就可以避免背景覆盖问题

#include<easyx.h>//easyx的头文件
#include<windows.h>
#include<iostream>
#include<time.h>
using namespace std;

int main()
{
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	BeginBatchDraw();

	//定义图片变量
	IMAGE img;
	IMAGE img_mask;
	loadimage(&img_mask, "D:\\代码\\界面库学习\\界面库学习\\ghost-mask.jpg");
	loadimage(&img, "D:\\代码\\界面库学习\\界面库学习\\ghost-down.jpg");
	//输出图片(先张贴掩码图,在张贴原图)
	putimage(100, 100, &img_mask, NOTSRCERASE);
	putimage(100, 100, &img, SRCINVERT);

	FlushBatchDraw();

	getchar();

	EndBatchDraw();
	return 0;
}

(4)动态过程

#include<easyx.h>//easyx的头文件
#include<windows.h>
#include<iostream>
#include<time.h>
using namespace std;

int main()
{
	initgraph(500, 500, EX_SHOWCONSOLE);
	setbkcolor(WHITE);
	cleardevice();

	int FPS = 1000 / 60;

	int starttime = 0;
	int freamtime = 0;

	BeginBatchDraw();

	//定义图片变量
	IMAGE img1;
	IMAGE img2;
	IMAGE img3;

	loadimage(&img1, "D:\\代码\\界面库学习\\界面库学习\\ghost1-down.jpg");
	loadimage(&img2, "D:\\代码\\界面库学习\\界面库学习\\ghost2-down.jpg");
	loadimage(&img3, "D:\\代码\\界面库学习\\界面库学习\\ghost3-down.jpg");

	IMAGE image[3] = { img1,img2,img3 };

	while (1)
	{
		for (int i = 0; i < 3; i++)
		{
			//先清空屏幕,再贴图
			cleardevice();
			putimage(100, 100, image + i);

			starttime = clock();

			FlushBatchDraw();

			freamtime = clock() - starttime;
			if (freamtime > 0)
			{
				Sleep(FPS - freamtime);
			}

			FlushBatchDraw();

			getchar();
		}
	}

	EndBatchDraw();
	return 0;
}

(5)精灵表动画

七、音乐播放

(1)基本操作

#include<easyx.h>
//下面这三串代码是播放音乐必要的
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
//
#include<iostream>
using namespace std;

int main()
{
	//先open再play,只播放一次
	mciSendString("open D:\\代码\\界面库学习\\界面库学习\\Start.mp3", NULL, 0, NULL);
	mciSendString("play D:\\代码\\界面库学习\\界面库学习\\Start.mp3", NULL, 0, NULL);
	getchar();
	return 0;
}

(2)简便写法与调整音量大小

#include<easyx.h>
//下面这三串代码是播放音乐必要的
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
//
#include<iostream>
using namespace std;

int main()
{
	//先open再play,只播放一次
	//简便写法
	mciSendString("open D:\\代码\\界面库学习\\界面库学习\\Start.mp3 alias bgm", NULL, 0, NULL);
	mciSendString("play bgm", NULL, 0, NULL);
	//调整音量大小
	mciSendString("setaudio bgm volume to 50", NULL, 0, NULL);
	getchar();
	return 0;
}

(3)播放错误检查

#include<easyx.h>
//下面这三串代码是播放音乐必要的
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")
//
#include<iostream>
using namespace std;

int main()
{
	//先open再play,只播放一次
	//简便写法
	mciSendString("open D:\\代码\\界面库学习\\界面库学习\\Start.mp3 alias bgm", NULL, 0, NULL);
	mciSendString("play bgm", NULL, 0, NULL);
	//调整音量大小
	MCIERROR ret = mciSendString("setaudio bgm volume to 50", NULL, 0, NULL);
	//通过返回值确认是否播放成功
	if (ret != 0)
	{
		//获取错误信息
		char err[100] = { 0 };
		mciGetErrorString(ret, err, sizeof(err));
	}
	getchar();
	return 0;
}

(5)函数封装

        可以尝试写一个参数只有路径字符串的播放音乐的函数

        这个是示例

(6)用于播放音效的函数

         这个函数只能播放.wav格式的音乐

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

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

相关文章

django入门-orm数据库操作

一&#xff1a;下载数据库依赖项mysqlclient pip install mysqlclient 二&#xff1a;django配置文件配置数据库链接 路径&#xff1a;mysite2\mysite2\settings.py DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: data, # 数据库名称USER: root, …

STM32外部中断(EXTI)以及旋转编码器的简介

一、外部中断机制概述 中断是指当主程序执行期间出现特定触发条件&#xff08;即中断源&#xff09;时&#xff0c;CPU将暂停当前任务&#xff0c;转而执行相应的中断服务程序&#xff08;ISR&#xff09;&#xff0c;待处理完成后恢复原程序的运行流程。该机制通过事件驱动…

双擎驱动:华为云数字人与DeepSeek大模型的智能交互升级方案

一、技术融合概述 华为云数字人 华为云数字人&#xff0c;全称&#xff1a;数字内容生产线 MetaStudio。数字内容生产线&#xff0c;提供数字人视频制作、视频直播、智能交互、企业代言等多种服务能力&#xff0c;使能千行百业降本增效。另外&#xff0c;数字内容生产线&#…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.5 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.5 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图。 dataframe <-data.frame( wrapc(17,20,12,9,…

字节新出的MCP应用DeepSearch,有点意思。

大家好&#xff0c;我是苍何。 悄悄告诉你个事&#xff0c;昨天我去杭州参加字节火山方舟举办的开发者见面会了&#xff0c;你别说&#xff0c;还真有点刘姥姥进大观园的感觉&#x1f436; 现场真实体验完这次新发布的产品和模型&#xff0c;激动的忍不住想给大家做一波分享。…

期货反向跟单运营逻辑推导思路

期货反向跟单运营逻辑推导思路 很多刚接触期货反向跟的朋友第一印象就是&#xff1a;这绝对是一个完美的策略&#xff0c;在认知不到位的情况下就开始运营&#xff0c;结果就是赔的稀里哗啦。然后告诉身边所有的人&#xff0c;期货反向跟单不靠谱。 这就是一个很有意思的事情&…

使用 HTML + JavaScript 实现图片裁剪上传功能

本文将详细介绍一个基于 HTML 和 JavaScript 实现的图片裁剪上传功能。该功能支持文件选择、拖放上传、图片预览、区域选择、裁剪操作以及图片下载等功能&#xff0c;适用于需要进行图片处理的 Web 应用场景。 效果演示 项目概述 本项目主要包含以下核心功能&#xff1a; 文…

【灵动Mini-F5265-OB】vscode+gcc工程创建、下载、调试

【前言】 【灵动Mini-F5265-OB】在官方的例程中提供了mdk、IAR的开发环境&#xff0c;使用起来非常方便。有位大佬也提供了一个gcc的示例&#xff0c;但是我使用vscode的keil插件进行工程创建&#xff0c;但是提示pack是对不上的。所以我决定重新创建我的vscode来创建开发环境。…

现代语言模型中的分词算法全解:从基础到高级

基础分词&#xff08;Naive Tokenization&#xff09; 最简单的分词方式是基于空格将文本拆分为单词。这是许多自然语言处理&#xff08;NLP&#xff09;任务中常用的一种分词方法。 text "Hello, world! This is a test." tokens text.split() print(f"Tok…

第十三章 Java基础-特殊处理

文章目录 1.包和final2.权限修饰符和代码块3.抽象类1.包和final 2.权限修饰符和代码块 3.抽象类

【操作系统原理08】文件管理

文章目录 零.大纲一.文件管理0.大纲1.文件管理1.1 **文件属性**1.2 文件内部数据组织1.3 文件之间的组织1.4操作系统提供功能1.5 文件在外存存放 二.文件的逻辑结构0.大纲1.无结构文件2.有结构文件 三.文件目录0.大纲1.文件控制块2.目录结构3.索引节点(FCB改进) 四.文件共享0.大…

图论学习笔记 5 - 最小树形图

我们不废话&#xff0c;直接进入正题&#xff1a;最小树形图&#xff0c;一个名字看起来很高级的东西。 声明&#xff1a;为了便于理解&#xff0c;可能图片数量会有亿点点多。图片尺寸可能有的较大。 概念 最小树形图的英文是 Directed Minimum Spanning Tree。 相信懂英文…

《自动驾驶轨迹规划实战:Lattice Planner实现避障路径生成(附可运行Python代码)》—— 零基础实现基于离散优化的避障路径规划

《自动驾驶轨迹规划实战&#xff1a;Lattice Planner实现避障路径生成&#xff08;附可运行Python代码&#xff09;》 —— 零基础实现基于离散优化的避障路径规划 一、为什么Lattice Planner成为自动驾驶的核心算法&#xff1f; 在自动驾驶的路径规划领域&#xff0c;Lattice…

PyTorch——卷积操作(2)

二维矩阵 [[ ]] 这里面conv2d(N,C,H,W)里面的四个是 N就是batch size也就是输入图片的数量&#xff0c;C就是通道数这只是一个二维张量所以通道为1&#xff0c;H就是高&#xff0c;W就是宽&#xff0c;所以是1 1 5 5 卷积核 reshape 第一个参数是batch size样本数量 第二个参数…

【JavaWeb】SpringBoot原理

1 配置优先级 在前面&#xff0c;已经学习了SpringBoot项目当中支持的三类配置文件&#xff1a; application.properties application.yml application.yaml 在SpringBoot项目当中&#xff0c;我们要想配置一个属性&#xff0c;通过这三种方式当中的任意一种来配置都可以&a…

ubuntu22.04安装taskfile

sh -c "$(curl --location https://taskfile.dev/install.sh)" -- -dsudo mv ./bin/task /usr/local/bin/测试 task --version

遥感影像建筑物变化检测

文章目录 效果1、环境安装2、项目下载3、数据集下载4、模型训练5、模型推理6、推理结果7、批量推理效果 1、环境安装 参考文章 搭建Pytorch的GPU环境超详细 win10安装3DGS环境(GPU)超详细 测试GPU环境可用 2、项目下载 https://gitcode.com/gh_mirrors/ch/change_detectio…

多模态大语言模型arxiv论文略读(103)

Are Bigger Encoders Always Better in Vision Large Models? ➡️ 论文标题&#xff1a;Are Bigger Encoders Always Better in Vision Large Models? ➡️ 论文作者&#xff1a;Bozhou Li, Hao Liang, Zimo Meng, Wentao Zhang ➡️ 研究机构: 北京大学 ➡️ 问题背景&…

汇编语言基础: 搭建实验环境

环境配置 1.Visual Studio 创建空项目 创建成功 2.平台框架改为为WIN32 右键点击项目 点击属性 点击配置管理器 平台改为Win32(本文使用32位的汇编) 3.生成采用MASM 在项目属性里点击"生成依赖项"的"生成自定义" 勾选 masm 4.创建第一个汇编程序 右…

基于springboot的益智游戏系统的设计与实现

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…