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

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

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

本文结束啦,下文见!

目录
相关文章
|
2月前
|
存储 机器学习/深度学习 人工智能
Qt魔法书:打造自定义鼠标键盘脚本(二)
Qt魔法书:打造自定义鼠标键盘脚本
35 0
|
10月前
如何用easyx播放音乐,插入图片
如何用easyx播放音乐,插入图片
158 0
|
2月前
|
开发框架 Linux API
Qt魔法书:打造自定义鼠标键盘脚本(一)
Qt魔法书:打造自定义鼠标键盘脚本
23 0
|
10月前
运用事件与定时器实现字幕滚动效果(Qt开发)
1、效果展示 我们经常能够在外面看到那种滚动字幕,那么就拿qt来做一个吧。 2、实现思路 实现一个窗口部件,这个窗口部件显示了一串文本标语,它会每t毫秒向左移动一个像素。如果窗口部件比文本宽,那么文本将会被多次重复,直到能够填满整个窗口部件的宽度为止。 3、滚动窗口部件 创建一个滚动窗口类,将其命名为ticker。 3.1、成员变量 我们需要提供几个成员变量。 myText用来表示要显示的文本内容。 offset表示当前偏移量。 myTimerId表示定时器的ID编号。 QString myText; int offset; int myTimer
60 0
|
11月前
|
人机交互 C# 图形学
【游戏开发】键盘消息处理
《仙剑奇侠传98柔情版》的人机交互方式,用的仅仅是键盘。在那个物质并不充裕的时代,一台配置并不高的电脑,一款名叫《仙剑奇侠传》的游戏,却能承载一代人对梦想的追逐。
70 0
基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条
基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条
基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条
|
存储 JSON 移动开发
基于Qt的网络音乐播放器(五)实现歌词滚动显示
基于Qt的网络音乐播放器(五)实现歌词滚动显示
基于Qt的网络音乐播放器(五)实现歌词滚动显示
|
程序员 C语言
Qt编写自定义控件60-声音波形图
一、前言 这个控件源自于一个音乐播放器,在写该音乐播放器的时候,需要将音频的数据转换成对应的频谱显示,采用的fmod第三方库来处理(fmod声音系统是为游戏开发者准备的革命性音频引擎,非常强大和牛逼),fmod负责拿到音频数据对应的采样频谱数据,然后传给这个控件进行绘制即可,本控件主需要专注于绘制即可,这样fmod对应封装的类专注于音频采集等处理,实现了隔离,修改和增加功能比较方便,声音波形图控件除了可以设置采样的深度以外,还支持三种数据样式展示,线条样式、柱状样式、平滑样式。
1768 0