使用vs播放.wav文件

news2024/11/20 6:36:43

本次操作在Windows10平台vs2019完成。

一、准备好.wav资源文件

上网找到自己想要播放的音乐文件,下载到本地后建议放到项目所在文件夹中。

二、添加资源文件

在“解决方案”中右键“资源文件”,点击“添加”,点击“资源”,

选择“Accelerator”,点击“导入”,选择自己要加入的资源文件,点击“打开”后保存一下,

注意上面红框圈主的部分,如果你的某些文件没有显示出来就在这里选择后缀名,

之后我们的“资源文件”这里会有一个.rc的文件,右键该文件选择“查看代码”后选择“是”,在我们的.rc文件中我们可以找到下面一行代码:

IDR_WAVE1               WAVE                    "E:\\projects\\vs\\Sword_Offer\\alert01 .wav"

IDR_WAVE1:这是资源的标识符。

WAVE:这指示了资源的类型。

"E:\\projects\\vs\\Sword_Offer\\alert01 .wav":这是资源的路径或位置。

同时我们的“头文件”也会有一个resource.h文件,里面可以找到下面一行代码:

#define IDR_WAVE1                       101

 #define IDR_WAVE1 101 是一个宏定义,它用于将标识符 IDR_WAVE1 映射到整数值 101。这个宏定义通常用于将资源标识符映射到整数值,以便在程序中引用这些资源。

三、代码实现

//v_1
void AlertSound()
{
    // 播放WAV资源
    PlaySound(MAKEINTRESOURCE(IDR_WAVE1), GetModuleHandle(NULL), SND_RESOURCE | SND_ASYNC);
}

MAKEINTRESOURCE(IDR_WAVE1):这部分是关于要播放的声音资源的信息。IDR_WAVE1 是资源标识符,它告诉 PlaySound 函数要播放哪个资源,MAKEINTRESOURCE 是一个宏,它将整数值(资源标识符)转换为资源名称的字符串。

 GetModuleHandle(NULL):这部分是关于声音资源所在的模块的信息。

GetModuleHandle(NULL) 获取了当前模块(通常是当前正在运行的程序)的句柄。

SND_RESOURCE | SND_ASYNC:这是有关播放声音的标志参数。具体含义如下:

  • SND_RESOURCE:这个标志指示 PlaySound 函数要从资源中播放声音。
  • SND_ASYNC:这个标志指示异步播放声音,即不会阻塞程序的执行,而是在后台播放声音。

在实际测试时发现,上面的代码并没有报错,但是也没有播放声音。经过检查是由于主线程过快结束导致,因此采取使用线程来执行报警函数,并在主函数中保留足够长的时间来播放声音。

//报警系统
void AlertSound()
{
    // 播放WAV资源
    PlaySound(MAKEINTRESOURCE(IDR_WAVE1), GetModuleHandle(NULL), SND_RESOURCE | SND_ASYNC);
    //Sleep(10000);
}

//测试报警函数
void testForSound()
{
    std::thread testThread(AlertSound);
    testThread.join();
}

int main()
{
    testForSound();
    //延长主线程时间
    for (int i = 0; i < 10000; ++i)
        std::cout << "Warning!!!!\n";
    return 0;
}

四、补充

为什么要将资源标识符映射到整数?

        1.将资源标识符映射到整数值,使得在程序的源代码中更容易引用和操作这个资源。

        2.在 .rc 文件中,资源标识符和类型是一对一关联的,而整数值是它们的唯一关联标识。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AGC】App Linking首次不能重定向指定页面的问题

【关键字】 AGC、App Linking、重定向 【问题描述】 有开发者反馈app linking未安装应用时&#xff0c;自定义地址可以重定向到apk应用内的任意页面会出现问题。app linking 未安装apk时指定到对应页面时&#xff0c;只拉开应用市场&#xff0c;安装后首次不能跳转到指定页面…

【操作系统】聊聊常见的内存管理方式

CPU 的实模式和保护模式。这两个模式 CPU 对内存的操作方式完全不同。在实模式下&#xff0c;CPU 直接通过物理地址访问内存。在保护模式下&#xff0c;CPU 通过一个地址映射表把虚拟的内存地址转为物理的内存地址&#xff0c;然后再去读取数据。 虚拟内存 在保护模式下&#…

数据结构--6.2关键路径

AOE网&#xff1a; 在一个表示工程的带权有向图中&#xff0c;用顶点表示事件&#xff0c;用有向边上的权值表示活动表示持续时间&#xff0c;这种有向图的边表示活动的网&#xff0c;我们称为AOE网&#xff08;Activity On Edge Network&#xff09;。 我们把AOE网中没有入边的…

Nginx重写功能和反向代理

目录 一、重写功能rewrite 1.1 if指令 1.2 return 1.3 set指令 1.4 break 指令 二、反向代理 2.1动静分离 2.2 缓存功能 2.3 ip穿透 2.4 http反向代理负载均衡 一、重写功能rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求&#xff0c;此…

Mybatis-plus联表查询 -- mybatis-plus-join

以t_order、t_user、t_product三表联合查询为例&#xff0c;其中t_order表为主表。 0.数据源配置 在springboot项目中&#xff0c;像往常一样正常配置数据源。 1.引入依赖 首先在项目中引入引入依赖坐标&#xff0c;因为mpj中依赖较高版本mybatis-plus中的一些api&#xff0…

【C++】函数参数扩展 ② ( 占位参数 | 占位参数规则 - 必须为占位参数传入实参 | 默认参数与占位参数结合使用 )

文章目录 一、占位参数1、占位参数简介2、占位参数规则 - 必须为占位参数传入实参 二、默认参数与占位参数结合使用1、结合用法2、代码示例 - 占位参数与默认参数结合用法 博客总结 : 默认参数 : 在 声明 函数时 , 为 函数参数 定义一个默认值 ;默认参数规则 : " 默认参数…

JS数组迭代方法实操

数组迭代方法有 1. every() 2.some() 3.foreach() 4.map() 5.filter 逐一操作&#xff0c;并简要区分之。 1 every() every() 方法使用指定的函数测试数组中所有的项&#xff0c;在数组的所有项都满足该条件时&#xff0c;才返回true&#xff0c;否则返回false&#xff1b; …

基于亚马逊云科技打造的游戏AIGC专业版,创梦天地快速上线AI生图服务

生成式人工智能&#xff08;以下简称“生成式AI”&#xff09;的热潮正在全球范围内掀起新一轮的科技革命&#xff0c;释放出巨大的商业价值。各类“AI绘画神器”的涌现&#xff0c;为创意行业带来了翻天覆地的变化。 在游戏领域&#xff0c;生成式AI技术也吸引了玩家们的广泛关…

QT day5

服务器&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化对象server new QTcpServer(this); }Widget::~Widget() {delete ui…

数学建模之层次分析法

目录 1 模型概述2 模型流程2.1 建立递阶层次结构2.2 构造判断矩阵2.3 一致性检验2.4 计算权重2.4.1 算术平均法2.4.2 几何平均法2.4.3 特征值法 2.5 计算各方案的得分 3 编写代码4 模型局限性 1 模型概述 层次分析法(The analytic hierarchy process, 简称AHP)&#xff0c;是建…

9-AJAX-2综合案例

AJAX-综合案例 目录 案例-图书管理图片上传案例-网站换肤案例-个人信息设置 学习目标 今天主要就是练&#xff0c;巩固 axios 的使用 完成案例-图书管理系统&#xff08;增删改查&#xff09;经典业务掌握图片上传的思路完成案例-网站换肤并实现图片地址缓存完成案例-个人信…

Cyber RT学习笔记 --- 1.Cyber RT框架介绍

1.Cyber RT框架介绍 1.1 Cyber RT简介 Apollo Cyber是首个专为自动驾驶定制的高性能且开源的实时通信框架&#xff0c;于2019年与Apollo 3.5开放平台同期发布&#xff0c;它主要解决了自动驾驶系统的高并发、低延迟、高吞吐、任务调度等问题&#xff0c;同时还提供了多种通信…

Docker 使用

简介 Docker是一个开源的容器引擎&#xff0c;它有助于更快地交付应用。 Docker可将应用程序和基础设施层隔离&#xff0c;并且能将基础设施当作程序一样进行管理。使用 Docker可更快地打包、测试以及部署应用程序&#xff0c;并可以缩短从编写到部署运行代码的周期。 Docker…

Web前端开发概述

Web&#xff08;World Wide Web&#xff0c;全球广域网&#xff09;是指一种基于互联网的信息系统&#xff0c;通过超文本链接将全球各地的文档、图像、视频等资源相互关联起来&#xff0c;并通过Web浏览器进行交互浏览和访问。Web的发展使得人们可以方便地获取和共享各种类型的…

GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域&#xff1a;1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言&#xff0c;都可以为你提供相关的代码示例。2、数据可视化…

SpringMVC入门指南

目录 前言 一、什么是SpringMVC 二、MVC架构模式 三、SpringMVC的工作流程 四、SpringMVC核心组件 五、SpringMVC的优势 六、SpringMVC的配置与常用注解 七、SpringMvc请求处理流程、 控制器的编写 、视图的渲染 1.请求处理流程&#xff1a; 2.控制器的编写&#xff1…

Gin学习记录2——路由

路由 一. 常规路由二. 动态路由三. 带参数的路由3.1 GET3.2 POST3.3 绑定 四. 简单的路由组五. 文件分组 一. 常规路由 package mainimport ("net/http""github.com/gin-gonic/gin" )func index(ctx *gin.Context) {ctx.String(http.StatusOK, "Hell…

模板和STL简介

模板和STL简介 一、泛型编程1、通用交换函数的实现&#xff08;1&#xff09;代码&#xff08;2&#xff09;总结 2、泛型编程的概念3、模板的概念 二、函数模板1、概念2、格式3、代码4、原理 三、函数模板实例化1、概念2、隐式实例化&#xff08;1&#xff09;概念&#xff08…

传输层—TCP原理详解

目录 前言 1.TCP协议 2.TCP协议段格式 3.如何解包如何分用 4.网络协议栈和文件的关系 5.如何理解TCP报头 6.TCP的特点 7.TCP字段 7.1 16位窗口大小 7.2标志位 8.超时重传 9.连接管理机制 10.滑动窗口 11.拥塞控制 12.延迟应答 13.捎带应答 14.理解TCP的面向字…

【算法系列篇】分冶-快排

文章目录 前言什么是分冶1.颜色分类1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 排序数组2.1 题目要求2.2 做题思路2.3 Java代码实现 3.数组中的第k个最大元素3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 最小的k个数4.1 题目要求4.2 做题思路4.3 Java代码实现 总结 前言 …