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,//接收返回信息的字符串,一般直接填NULLUINT 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;
}
运行后点击左键播放,点击右键暂停,双击右键就关闭音乐结束程序。
这个小程序虽然很短,但已经运用了今天的大部分所学,希望大家能够理解。
本文结束啦,下文见!
相关文章:
Easyx趣味编程7,鼠标消息读取及音频播放
hello大家好,这里是dark flame master,今天给大家带来Easyx图形库最后一节功能实现的介绍,前边介绍了绘制各种图形及键盘交互,文字,图片等操作,今天就可以使写出的程序更加生动且容易操控。一起学习吧&…...
towxml的使用,在微信小程序中快速将markdown格式渲染为wxml文本
towxml的使用,在微信小程序中快速将markdown格式渲染为wxml文本 Towxml概述安装下载 Towxml在小程序中使用 towxml Towxml概述 towxml3.0 支持以下功能: ● echarts图表,默认禁用,需自行构建以开启此功能 ● LaTeX数学公式&#…...
项目管理实战总结(一)-沟通路径问题
前言 那是2021年春节之后,我决定主动申请参与到这个项目,是知道工作强度大、难度大的情况的。有很多的同事是想躲,而我是明知山有虎偏向虎山行。我确定,通过这个项目,一定有我需要的东西。现在项目已经完成了终验专家…...
UE5场景逐渐变亮问题
1、显示 -- 关闭眼部适应 2、项目设置 -- 关闭自动曝光 参考: 虚幻5/UE5 场景亮度逐渐变亮完美解决方法 - 哔哩哔哩...
VM16Pro的Win10虚拟机安装Linux子系统Kali
VM16Pro的Win10虚拟机安装Linux子系统Kali 一、启用Windows功能二、配置WSL三、安装Kali四、安装kali基本工具包五、图形化六、适用的报错七、其他问题参考 一、启用Windows功能 启用后需重启二、配置WSL wsl --update #管理员启动Powershell执行,完成后将下面…...
C++中类的声明
C中类的声明 假设您要编写一个模拟人(如您自己)的程序。人有其特征:姓名、出生日期、出生地和性别(这些信息让每个人都是独一无二的),还能做某些事情,如交谈、自我介绍等。 要在程序中模拟人&…...
IDEA常用AI插件
只推荐免费的 一、对话式AI 1. ChatGPT GPT-4 - Bito AI Code Assistant ChatGPT GPT-4 - Bito AI Code Assistant 插件地址:https://plugins.jetbrains.com/plugin/18289-chatgpt-gpt-4–bito-ai-code-assistant支持自定义prompt支持解释代码支持生成代码注释支持…...
【LeetCode】每日一题最后一个单词的长度投票法求解多数元素异或操作符巧解只出现一次的数字整数反转
个人主页直达:小白不是程序媛 LeetCode系列专栏:LeetCode刷题掉发记 目录 LeetCode 58.最后一个单词的长度 LeetCode169.多数元素 LeetCode 136.出现一次的数字 LeetCode 7.整数反转 LeetCode 58.最后一个单词的长度 难度:简单 OJ链接…...
自然语言处理---注意力机制
注意力概念 观察事物时,之所以能够快速判断一种事物(当然允许判断是错误的),是因为大脑能够很快把注意力放在事物最具有辨识度的部分从而作出判断,而并非是从头到尾的观察一遍事物后,才能有判断结果。正是基于这样的理论…...
目标检测YOLO实战应用案例100讲-基于改进YOLO v7的智能振动分拣系统开发(续)
目录 3.2 引入EIOU损失函数 3.2.1 CIOU损失函数 3.3.2 基于Focal-EIOU损失函数的网络优化 编辑...
Ubuntu - 用户和权限
sudo sudo(Super User Do)是在Linux和Unix系统中用于执行具有超级用户(root)权限的命令的命令。它允许普通用户以特权身份运行特定命令,通常需要输入密码以确认其身份。 sudo 是一种安全的方式,用于限制哪…...
JAVA实现Jfilechooser搜索功能
JAVA实现Jfilechooser搜索功能 背景介绍需求描述思路和方法Java代码实现和注释相关知识点介绍视频演示结语 背景介绍 Java是一种面向对象的编程语言,广泛应用于各种应用程序开发中。文件搜索是我们在日常工作或者学习中经常会遇到的需求,比如查找某个文…...
iOS上架App Store的全攻略
第一步:申请开发者账号 在开始将应用上架到App Store之前,你需要申请一个开发者账号。 1.1 打开苹果开发者中心网站:Apple Developer 1.2 使用Apple ID和密码登录(如果没有账号则需要注册),要确保使用与公…...
线性代数3:矢量方程
一、前言 欢迎回到系列文章的第三篇文章,内容是线性代数的基础知识,线性代数是机器学习背后的基础数学。在我之前的文章中,我介绍了梯队矩阵形式。本文将介绍向量、跨度和线性组合,并将这些新想法与我们已经学到的内容联系起来。本…...
线性代数的本质笔记
课程来自b站发现的《线性代数的本质》,可以帮助从直觉层面理解线性代数的一些基础概念,以及把一些看似不同的数学概念解释之后,发现其实有内在的关联。 这里只对部分内容做一个记录,完整内容请自行观看视频~ 01-向量究竟是什么 …...
[SQL | MyBatis] MyBatis 简介
目录 一、MyBatis 简介 1、MyBatis 简介 2、工作流程 二、入门案例 1、准备工作 2、示例 三、Mapper 代理开发 1、问题简介 2、工作流程 3、注意事项 4、测试 四、核心配置文件 mybatis-config.xml 1、environment 2、typeAilases 五、基于 xml 的查询操作 1、…...
FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
一、FreeRTOS 介绍 什么是 FreeRTOS ? Free即免费的,RTOS的全称是Real time operating system,中文就是实时操作系统。 注意:RTOS不是指某一个确定的系统,而是指一类操作系统。比如:uc/OS,Fr…...
zookeeper(目前只有安装)
安装 流程 学kafka的时候安装 Apache ZooKeeper 安装地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.5.7/apache-zookeeper-3.5.7-bin.tar.gz 解压 tar -zxvf kafka_2.12-3.0.0.tgz -C /export/server/ 改配置 cd config cp zoo_sample.cfg z…...
点云cloudpoint生成octomap的OcTree的两种方法以及rviz可视化
第一种:在自己的项目中将点云通过ros的topic发布,用octomap_server订阅点云消息,在octomap_server中生成ocTree 再用rviz进行可视化。 创建工作空间,记得source mkdir temp_ocotmap_test/src cd temp_ocotmap_test catkin_make…...
Python---死循环概念---while True
在编程中一个靠自身控制无法终止的程序称为“死循环”。 在Python中,我们也可以使用while True来模拟死循环: 代码: while True: print(每天进步一点点) 图示 应用: 比如,在测试里面,自动化测试用例…...
ADAPT-VQE算法:量子计算中的自适应变分本征求解器
1. ADAPT-VQE算法概述ADAPT-VQE(Adaptive Derivative-Assembled Pseudo-Trotter Variational Quantum Eigensolver)是一种改进的变分量子本征求解器算法,专为量子计算机设计用于高效模拟量子多体系统的基态性质。与传统VQE使用固定参数化量子…...
Docker+Python+openGauss:5分钟搭建你的第一个数据库Web应用原型
DockerPythonopenGauss:从零构建学生成绩管理系统原型 在当今快速迭代的软件开发环境中,能够迅速验证想法并构建最小可行产品(MVP)的能力变得至关重要。对于全栈开发初学者而言,掌握如何将数据库、后端服务和前端展示无缝衔接是一项基础但关键…...
别再只懂LRU了!用Caffeine的W-TinyLFU算法,轻松应对突发热点流量
突破传统缓存瓶颈:Caffeine的W-TinyLFU如何重塑高并发系统性能 在电商大促的流量洪峰中,服务器集群的缓存系统往往成为第一个崩溃的环节。当每秒数十万请求涌来时,传统的LRU缓存就像用漏勺接水——看似在运作,实际命中率惨不忍睹。…...
Vivado 2017下Zynq-7000 PS端UDP通信实战:从lwIP配置到性能调优全记录
Vivado 2017环境下Zynq-7000 PS端UDP通信全流程实战指南 在嵌入式系统开发中,网络通信功能的实现往往面临工具链版本限制的挑战。本文将深入探讨如何在Vivado 2017这一相对陈旧的开发环境中,为Zynq-7000系列芯片的PS端构建完整的UDP通信功能。不同于新版…...
别再只会用vector了!C++ STL中queue队列的5个实战场景与避坑指南
别再只会用vector了!C STL中queue队列的5个实战场景与避坑指南 在C开发中,很多开发者习惯性地将vector作为默认容器选择,却忽略了STL中其他容器适配器的独特价值。queue作为一种FIFO(先进先出)数据结构,在特…...
金三银四突击必备:Java架构六大核心专题面试宝典!
Java面试是一个老生常谈的问题。每年到了金三银四&金九银十这种跳槽黄金季就会有一大批程序员出来面试找工作。流程就是熟悉的网上开始找面试题,面试手册,面试宝典,一收藏就是一大把,看到什么都觉得Nice,看几眼之后…...
终极Obsidian知识管理方案:三步构建你的第二大脑
终极Obsidian知识管理方案:三步构建你的第二大脑 【免费下载链接】obsidian-template Starter templates for Obsidian 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-template 你是否曾经在信息洪流中迷失方向?收藏了无数文章却从未回顾…...
从原理到调参:一文读懂CycleMorph在2D/3D图像配准中的核心技术与实践陷阱
从原理到调参:CycleMorph在2D/3D图像配准中的核心技术解析与实战避坑指南 医学影像分析中,精确的图像配准一直是影响诊断和治疗规划的关键技术。传统方法在处理复杂形变时往往面临拓扑结构破坏、计算效率低下等瓶颈。CycleMorph通过引入循环一致性约束和…...
NVIDIA Container Toolkit失效、nvidia-smi不可见、AI模型加载卡死——Docker AI调试三重门全拆解
第一章:NVIDIA Container Toolkit失效、nvidia-smi不可见、AI模型加载卡死——Docker AI调试三重门全拆解当容器内执行 nvidia-smi 返回 command not found 或空白输出,PyTorch/TensorFlow 加载模型时卡在 torch.cuda.is_available() 或显存分配阶段&…...
PyTorch实战:用膨胀卷积替换池化层,保持特征图尺寸提升分割精度
PyTorch实战:用膨胀卷积替换池化层提升分割精度的工程实践 当你在深夜调试一个医学影像分割模型时,可能会遇到这样的困境:显微镜下的细胞边缘总是被预测成模糊的色块,而肿瘤区域的细小突起在多次下采样后彻底消失在特征图里。这时…...
