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

在这里插入图片描述

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;
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode周赛365补题(3 / 3)

目录 1、2、有序三元组的最大值 - 预处理前后最大值 遍历 &#xff08;1&#xff09;预处理前后值遍历&#xff08;枚举j&#xff09; &#xff08;2&#xff09;枚举k 2、无限数组的最短子数组 - 前缀和 滑动窗口 1、2、有序三元组的最大值 - 预处理前后最大值 遍历 …

【STM32】标准库的引入

一、为什么要会有标志外设库 1、传统单片机软件开发方式 (1)芯片厂商提供数据手册、示例代码、开发环境 (2)单片机软件工程师面向产品功能&#xff0c;查阅数据手册&#xff0c;参考官方示例代码进行开发 (3)硬件操作的方式是用C语言对寄存器进行读写以操作硬件 (4)主要工作量…

【vue】使用less报错:显示this.getOptions is not a function

在vue-cli中使用 lang“less” 时报错&#xff1a; Module build failed: TypeError: this.getOptions is not a function at Object.lessLoader 原因&#xff1a;版本过高所致&#xff0c;所用版本为 解决&#xff1a;降低版本&#xff1a;npm install less-loader4.1.0 --s…

Use nvidia card in docker

1.确保在宿主机上已经安装了nvidia 显卡的驱动 $ nvidia-smi 2.准备Nvidia-docker的环境 $ distribution$(. /etc/os-release;echo $ID$VERSION_ID) && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/k…

【微信小程序】6天精准入门(第5天:利用案例与后台的数据交互)附源码

一、什么是后台交互&#xff1f; 在小程序中&#xff0c;与后台交互指的是小程序前端与后台服务器之间的数据通信和请求处理过程。通过与后台交互&#xff0c;小程序能够获取服务器端的数据、上传用户数据、发送请求等。 小程序与后台交互可以实现数据的传输、用户认证、实时消…

订水商城H5实战教程-04用户注册

目录 1 用户注册2 创建模型应用3 开发审核功能4 配置菜单5 发布预览最终效果 我们上一篇讲解了用户协议的功能&#xff0c;如果用户同意协议&#xff0c;就可以跳转到注册页面&#xff0c;要求用户录入个人基本信息&#xff0c;本篇我们介绍一下用户注册功能。 1 用户注册 用户…

Kafka快速入门(最新版3.6.0)

文章目录 一、初识MQ1.1 什么是MQ1.2 同步和异步通讯1.1.1 同步通讯1.1.2 异步通讯 1.3 技术对比1.4 MQ的两种模式 二、初识Kafka2.1 Kafka的使用场景2.2 Kafka基本概念2.3 Topic与Partition 三、Kafka基本使用3.1 部署前的准备3.2 启动kafka服务器3.3 Kafka核心概念之Topic3.4…

【机器学习合集】标准化与池化合集 ->(个人学习记录笔记)

文章目录 标准化与池化1. 标准化/归一化1.1 归一化归一化的作用 1.2 标准化批标准化方法 Batch Normailzation标准化方法的对比自动学习标准化方法 2. 池化2.1 池化的作用2.2 常见的池化方法2.3 池化方法的差异2.4 池化的必要性 标准化与池化 1. 标准化/归一化 1.1 归一化 归…

springcloud笔记 (8) -网关 Gateway

网关 出国需要过海关 网关&#xff1a;网络的关卡 网关的作用 1&#xff1a;路由转发 2&#xff1a;安全控制 保护每个服务&#xff0c;不需要将每个暴露出去 3&#xff1a;负载均衡 1.没有网关&#xff1a;客户端直接访问我们的微服务&#xff0c;会需要在客户端配置很多…

【实战】Kubernetes安装持久化工具NFS-StorageClass

文章目录 前言技术积累存储类&#xff08;storage class&#xff09;什么是NFS什么是PV\PVC为什么要用NFS-StorageClass 安装NFS-StorageClass保证N8S集群正常投用安装NFS工具与客户端NFS安装常见错误安装NFS-StorageClass存储器 前言 前面的博文我们介绍了如何用kuberadmin的…

ExcelPatternTool 开箱即用的Excel工具包现已发布!

文章目录 ExcelPatternTool功能特点&#xff1a;快速开始使用说明常规类型高级类型Importable注解Exportable注解IImportOption导入选项IExportOption导出选项单元格样式StyleMapping样式映射使用数据库作为数据源 示例Sample1&#xff1a;不同类型字段导出Sample2&#xff1a;…

乘势“2”上 双影来袭 | 距大势智慧2023秋季新品发布会还有2天!

乘势“2”上 双影来袭 全国产、真安全 大势智慧2023秋季新品发布会 倒计时2天 10.27 | 14:30 一键扫码预约 #实景三维##三维重建##实景三维中国##国产替代##新品发布# ​​​

uni-app小程序,uview-ui组件样式无法穿透修改的解决办法

1.首先设置以下选项.该选项的作用是让微信小程序允许样式穿透. 在需要改动的文件内加上 options: { styleIsolation: shared } 2.然后再使用vue的样式穿透写法. ::v-deep .类样式{} 或者 /deep/ .类样式{}

css总结

记录做项目经常会写到的css 1、左边导航栏固定&#xff0c;右边div占满剩余宽度 <template><div class"entrance"><div class"left"></div><div class"right"><div class"content"></div>…

useLayoutEffect和useEffect的区别

使用方式 这两个函数的使用方式其实非常简单&#xff0c;他们都接受一个函数一个数组&#xff0c;只有在数组里面的值改变的情况下才会再次执行 effect。所以对于使用方式我就不过多介绍了&#xff0c;不清楚的可以先参考官网 。 差异 useEffect 是异步执行的&#xff0c;而…

UG\NX二次开发 获取面的面面积、周长

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 weixin_38891498 订阅本专栏,非常感谢。 简介 UG\NX二次开发 获取面的面面积、周长 效果 代码 #include "me.hpp" #include <NXOpen/Session…

2021年下半年 软件设计师 上午试卷(1-28)

计算机指令系统采用多种寻址方式。立即寻址是指操作数包含在指令中&#xff0c;寄存器寻址是指操作数在寄存器中&#xff0c;直接寻址是指操作数的地址在指令中。这三种寻址方式获取操作数的速度 &#xff08;1&#xff09; 。 &#xff08;1&#xff09; A. 立即寻址最快&am…

小程序设计基本微信小程序的校园生活助手系统

项目介绍 通篇文章的撰写基础是实际的应用需要&#xff0c;然后在架构系统之前全面复习大学所修习的相关知识以及网络提供的技术应用教程&#xff0c;以校园生活助手系统的实际应用需要出发&#xff0c;架构系统来改善现校园生活助手系统工作流程繁琐等问题。不仅如此以操作者…

lv8 嵌入式开发-网络编程开发 20 域名解析与http服务实现原理

目录 1 域名解析 2 如何实现万维网服务器&#xff1f; 2.1 HTTP 的操作过程 2.2 万维网服务器实现 1 域名解析 域名解析gethostbyname函数 主机结构在 <netdb.h> 中定义如下&#xff1a; struct hostent {char *h_name; /* 官方域名 */char **h_alias…

拦截器以及统一功能的实现

目录 引言 实现一个简单的拦截器 拦截器小结 统一访问前缀 统一异常处理 统一返回参数 ControllerAdvice 引言 HandlerInterceptor是Spring MVC框架提供的一个拦截器接口&#xff0c;它用于对请求进行拦截和处理。在Spring MVC中&#xff0c;拦截器可以用于实现一些通用的功能…