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

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

正题:

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

运行后点击左键播放,点击右键暂停,双击右键就关闭音乐结束程序。

这个小程序虽然很短,但已经运用了今天的大部分所学,希望大家能够理解。

本文结束啦,下文见!

目录
相关文章
|
存储 Rust 并行计算
【密码学】一文读懂XTS模式
这篇文章的灵感来源于我偶然翻到的一个某U盘有关磁盘加密的一个介绍(这一篇不是广告蛤), 然后发现这个模式我之前还真没遇到过,因此呢,就学习了一下,就出来了这一篇文章。
8673 0
【密码学】一文读懂XTS模式
|
4月前
|
弹性计算 小程序 固态存储
云服务器租用价格多少钱一年?用于搭建小程序费用清单,2026最新整理
2026年阿里云小程序服务器最新报价:入门级2核2G轻量服务器低至38元/年(含200M峰值带宽、50G系统盘),99元/年ECS经济型实例续费同价;香港地域25元/月起。覆盖GPU、按量付费及带宽/云盘明细,性价比高,适合个人开发者与中小企业快速部署小程序。
1532 17
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
719 10
|
运维 监控 关系型数据库
运维实战:Windows服务挂掉了怎么办,通过Bat脚本实现自动重启
本文介绍了如何使用Bat脚本自动监控并重启Windows服务器上的挂掉服务,例如MySQL,以避免在假期等情况下需要紧急处理问题。首先,创建一个Bat脚本,设定每小时检查一次服务状态,如果服务停止则自动重启。脚本内容包括检查服务是否运行并根据状态执行相应操作。同时,脚本中包含了确保以管理员权限运行的代码。 脚本需设置为ANSI编码以防止乱码。推荐将Bat脚本封装为Windows服务以保证稳定运行,提供了使用NSSM工具、Windows服务程序和开源的Java工具winsw将批处理脚本转化为服务的方法。这些方法可以确保服务在后台可靠运行,即使在服务意外停止时也能自动恢复。
|
搜索推荐 测试技术 API
探秘电商API:从测试到应用的深度解析与实战指南
电商API是电子商务背后的隐形引擎,支撑着从商品搜索、购物车更新到支付处理等各个环节的顺畅运行。它通过定义良好的接口,实现不同系统间的数据交互与功能集成,确保订单、库存和物流等信息的实时同步。RESTful、GraphQL和WebSocket等类型的API各自适用于不同的应用场景,满足多样化的需求。在测试方面,使用Postman、SoapUI和jMeter等工具进行全面的功能、性能和安全测试,确保API的稳定性和可靠性。未来,随着人工智能、大数据和物联网技术的发展,电商API将进一步智能化和标准化,为用户提供更个性化的购物体验,并推动电商行业的持续创新与进步。
833 5
|
人工智能 计算机视觉 Python
AI计算机视觉笔记十九:Swin Transformer训练
本文介绍了使用自定义数据集训练和测试目标检测模型的步骤。首先,通过安装并使用标注工具labelme准备数据集;接着修改配置文件以适应自定义类别,并调整预训练模型;然后解决训练过程中遇到的依赖冲突问题并完成模型训练;最后利用测试命令验证模型效果。文中提供了具体命令及文件修改指导。
|
人工智能 自然语言处理 搜索推荐
超越边界:探索2023年AIGC技术盛宴,预测前沿科技的奇迹 🚀
本文探讨了互联网内容生产从PGC、UGC到AIGC的演变,特别关注了AIGC(人工智能生成内容)的发展及其对未来内容生产的深远影响。文章详细介绍了AIGC的定义、技术进展(如生成算法、多模态技术、AI芯片等),并展示了AIGC在多个领域的广泛应用,如代码生成、智能编程、个性化服务等。未来,AIGC将在各行各业创造巨大价值,推动社会进入更加智能化的时代。同时,文章也探讨了AIGC对开发者的影响,以及其可能无法完全取代人类的原因,强调开发者可以利用AIGC提升工作效率。
582 0
|
存储 算法 C语言
数据结构基础详解(C语言):单链表_定义_初始化_插入_删除_查找_建立操作_纯c语言代码注释讲解
本文详细介绍了单链表的理论知识,涵盖单链表的定义、优点与缺点,并通过示例代码讲解了单链表的初始化、插入、删除、查找等核心操作。文中还具体分析了按位序插入、指定节点前后插入、按位序删除及按值查找等算法实现,并提供了尾插法和头插法建立单链表的方法,帮助读者深入理解单链表的基本原理与应用技巧。
3342 6
|
Windows
windows系统bat批处理 windows 关机,重启,锁定,休眠,注销
windows系统bat批处理 windows 关机,重启,锁定,休眠,注销
4098 0