Easyx趣味编程7,鼠标消息读取及音频播放

news/2024/5/18 13:39:28 标签: 计算机外设, 音视频, c语言, 游戏, 笔记, 游戏程序

在这里插入图片描述

hello大家好,这里是dark flame master,今天给大家带来Easyx图形库最后一节功能实现的介绍,前边介绍了绘制各种图形及键盘交互,文字,图片等操作,今天就可以使写出的程序更加生动且容易操控。一起学习吧!
由于会用到前边的内容
专栏:Easyx趣味编程

正题:
EasyX提供了记录并判断玩家使用鼠标对窗体进行的操作,这些操作会放在操作列表中,等待被处理。

getmassage函数

getmassage函数是从消息列表中获取一个消息,并将该消息移除,程序会根据这条消息进行相关的响应。
在这里插入图片描述
这个函数有两次重载,但是功能相同
在这里插入图片描述
若getmessage()函数传入参数是-1,表示获取所有类型的消息。

如果不需要读取所有类型的消息,可以单独写某一种,或者利用|(或)运算符进行合并。

创建一个ExMessage变量
如果我们鼠标消息和键盘消息都想要,其他两种可以不读取

ExMessage msg;
msg = getmessage(EX_MOUSE | EX_CHAR);

ExMessage结构体如下
在这里插入图片描述
消息标识:传入的参数为鼠标消息就使用鼠标的结构体,传入参数是什么,就调用哪个结构体。
消息标识:
在这里插入图片描述
我们这节课只讲鼠标消息类型,所以只举例说明鼠标消息标识
 对照上表,实现鼠标移动时绘制一个半径为2的黑色的填充圆,左键按下绘制半径为20的蓝色填充圆,右键按下绘制黄色半径为50的填充五角星。
代码如下:

#include <stdio.h>
#include <easyx.h>
#include <stdlib.h>
#include <math.h>
#define Pai 3.14
int main()
{
	initgraph(800, 600);
	setbkcolor(WHITE);
	cleardevice();
	ExMessage msg;
	while (1)
	{
		msg = getmessage(EX_MOUSE);
		switch(msg.message)
		{
			case WM_MOUSEMOVE://在移动过程中
				setfillcolor(BLACK);
				solidcircle(msg.x, msg.y, 2);
				break;
			case WM_LBUTTONDOWN://在移动过程中
				setfillcolor(BLUE);
				solidcircle(msg.x, msg.y, 20);
				break;
			case WM_RBUTTONDOWN:
				setfillcolor(GREEN);
				int r = 50;//半径
				//初始角度
				double theta = Pai / 2;
				//递增角度
				double delta = 2 * Pai / 5;
				POINT points[5];//定义一个数组,存放点的坐标
				for (int i = 0; i < 5; i++)
				{
					points[i].x = cos(theta + i * delta * 2) * r+msg.x;
					points[i].y = sin(theta + i * delta * 2) * r+msg.y;
				}
				setfillcolor(YELLOW);
				setpolyfillmode(WINDING);
				solidpolygon(points, 5);
				break;
		}
	}
	return 0;
}

运行后如图
在这里插入图片描述
 之前的操作都默认为单击事件,不论我们点击的有多快,都还是会判定为单击事件。
在创建窗体时,加上EX_DBLCLKS即可识别双击事件。

	initgraph(800, 600, EX_DBLCLKS);

要注意:EX_DBCLICKS这个版本已经不能在VS上使用了。
更改代码,双击出现五角星,左击蓝色圆,右击红色圆,左边双击黄色五角星。

	while (1)
	{
		msg = getmessage(EX_MOUSE);
		switch(msg.message)
		{
			case WM_MOUSEMOVE://在移动过程中
				setfillcolor(BLACK);
				solidcircle(msg.x, msg.y, 5);
				break;
			case WM_LBUTTONDOWN://在移动过程中
				setfillcolor(BLUE);
				solidcircle(msg.x, msg.y, 20);
				break;
			case WM_RBUTTONDOWN://在移动过程中
				setfillcolor(RED);
				solidcircle(msg.x, msg.y, 20);
				break;
			case WM_LBUTTONDBLCLK:
				setfillcolor(GREEN);
				int r = 50;//半径
				//初始角度
				double theta = Pai / 2;
				//递增角度
				double delta = 2 * Pai / 5;
				POINT points[5];//定义一个数组,存放点的坐标
				for (int i = 0; i < 5; i++)
				{
					points[i].x = cos(theta + i * delta * 2) * r+msg.x;
					points[i].y = sin(theta + i * delta * 2) * r+msg.y;
				}
				setfillcolor(YELLOW);
				setpolyfillmode(WINDING);
				solidpolygon(points, 5);
				break;
		}
	}

运行后如图
在这里插入图片描述
音频播放
 v趣味化编程,只有画面可不行,我们要声色俱全,如果我们玩一个小游戏,一定会有相应的背景音乐。
认识一个新函数mciSendString

MCIERROR mciSendString(
	LPCTSTR lpszCommand,//命令字符串,如open,close,
	LPTSTR lpszReturnString,//接收返回信息的字符串,一般直接填NULL
	UINT cchReturn,//返回信息的长度,可以直接填零
	HANDLE hwndCallback,//回调窗口句柄,一般直接填NULL
);

在播放之前要将播放的歌曲放置在工程目录下。
在这里插入图片描述
当我们在使用时却会报错
在这里插入图片描述
这是因为这个函数在库winmm.lib中,默认情况下链接器不会输入这个库文件。
添加库winmm.lib
在这里插入图片描述
点击添加即可
在这里插入图片描述
在这里插入图片描述
将库添加即可
在这里插入图片描述
我们这里用到了汉语,所以要将字符集设置为未设置
在这里插入图片描述
代码如下

int main()
{
		mciSendString("open 及你太美.mp3", NULL, 0, NULL);//打开音乐,没有进行播放
		printf("打开音乐");
		getchar();
		mciSendString("play 及你太美.mp3", NULL, 0, NULL);//播放
		printf("播放音乐");
		getchar();
		mciSendString("pause 及你太美.mp3", NULL, 0, NULL);//暂停播放
		printf("暂停");
		getchar();
		mciSendString("resume 及你太美.mp3", NULL, 0, NULL);//继续播放
		printf("继续");
		getchar();
		mciSendString("stop 及你太美.mp3", NULL, 0, NULL);//停止播放
		printf("停止");
		getchar();
		mciSendString("close 及你太美.mp3", NULL, 0, NULL);//关闭音乐
		printf("关闭");
		getchar();
	return 0;
}

现在就可以实现一个坤坤播放器
创建窗体,将所用到的材料都放在工程目录里。
绘制坤坤.png作为背景
在这里插入图片描述
大概找出篮球的区域就可以编写程序了。
代码如下

int main()
{
	int key = 1;
	initgraph(600,600, EX_DBLCLKS);
	IMAGE img;
	//创建窗体
	loadimage(&img, "坤坤.png", 600, 600);
	putimage(0, 0, &img);
	mciSendString("open 及你太美.mp3", NULL, 0, NULL);//打开音乐,没有进行播放
	//如果我们点击篮球,就会播放歌曲
	ExMessage msg;
	while (key)
	{

		msg = getmessage(EX_MOUSE);
		switch(msg.message)
		{				
			case WM_LBUTTONDOWN://左击
				if (msg.x > 0 && msg.x < 600 && msg.y>450 && msg.y < 600)
				{
					mciSendString("play 及你太美.mp3", NULL, 0, NULL);//播放
				}
				break;
			case WM_RBUTTONDOWN://右击
				if (msg.x > 0 && msg.x < 600 && msg.y>450 && msg.y < 600)
				{
					mciSendString("pause 及你太美.mp3", NULL, 0, NULL);//暂停
				}
				break;
			case WM_LBUTTONDBLCLK://右键双击关闭音乐
				mciSendString("close 及你太美.mp3", NULL, 0, NULL);//关闭音乐
				key = 0;
				break;
		}
	}

	closegraph();
	return 0;
}

运行后点击左键播放,点击右键暂停,双击右键就关闭音乐结束程序。
这个小程序虽然很短,但已经运用了今天的大部分所学,希望大家能够理解。
本文结束啦,下文见!


http://www.niftyadmin.cn/n/5111080.html

相关文章

【Edabit 算法 ★☆☆☆☆☆】 Basic Variable Assignment

【Edabit 算法 ★☆☆☆☆☆】 Basic Variable Assignment bugs functional_programming language_fundametals strings Instructions A student learning JavaScript was trying to make a function. His code should concatenate a passed string name with string "E…

[java进阶]——异常详解,try catch捕获异常,抛出异常

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 一、异常的体系结构 二、处理异常的本质 三、异常处理的三种方式 3.1虚拟机jvm处理(默认) 3.2 try catch捕获异常 3.3抛出异常 3.4finally关键字 四、自定义异常 五、总结 一、异常的体系结构 分析&#…

正则表达式提取http和http内容

http.* 这样匹配到的就是我们要的内容 取反正则&#xff1a;^((?!要取反的正则表达式).)*$ 取反&#xff1a;^((?!http.).)$ 这样匹配到的就是我们不要的内容 提取域名 /[(http|ftp|https):\/\/]?([\w_-](?:(?:\.[\w_-])))([\w.,?^%&:\/~#-]*[\w?^%&\/~#-]…

docker 安装 sftpgo

sftpgo 简介 sftpgo 是一个功能齐全且高度可配置的 SFTP 服务器&#xff0c;具有可选的 HTTP/S、FTP/S 和 WebDAV 支持。支持多种存储后端&#xff1a;本地文件系统、加密本地文件系统、S3&#xff08;兼容&#xff09;对象存储、Google 云存储、Azure Blob 存储、SFTP。 官…

力扣每日一题53:最大子数组和

题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,…

PHP写用户注册、登录和密码重置功能

目录 连接数据库&#xff1a; 用户注册功能&#xff1a; 用户登录功能&#xff1a; 密码重置功能: 首先&#xff0c;创建一个名为users的数据库表&#xff0c;包含以下字段&#xff1a; id&#xff1a;用户ID&#xff0c;自增主键username&#xff1a;用户名&#xff0c;唯一…

【Pillow库的内涵】01/3 进行基本图像操作

一、说明 Pillow 具有被 Python 社区广泛使用的优势&#xff0c;并且它不像其他一些图像处理库那样具有陡峭的学习曲线。应用PIL库的Image对象&#xff0c;益处很多&#xff0c;首先它可以处理网上URL文件&#xff0c;其次&#xff0c;图片可以方面转化成int32、64或float类型&…

点云从入门到精通技术详解100篇-基于路侧激光雷达的交通目标感知方法与实现(中)

目录 2.4.3点云数据丢失 2.4.4点云数据遮挡 3地平面分割与目标点云聚类方法实现 3.1引言