C++ 图片加背景音乐的处理

作者:laocooon523857886日期:2025/11/9

在这里插入图片描述

1//music_manager.h
2#pragma once
3
4// 播放背景音乐
5void playBackgroundMusic(const char* music, bool repeat = false, int volume = -1);
6
7// 暂停当前播放的音乐
8void pauseBackgroundMusic();
9
10// 恢复暂停的音乐
11void resumeBackgroundMusic();
12
13// 停止并关闭当前音乐
14void stopBackgroundMusic();
15
16// 关闭所有音乐资源
17void closeAllMusic();
18
19
1//music_manager.cpp
2#include <windows.h>
3#include <mmsystem.h>
4#include <stdio.h>
5#include <vector>
6#include <string>
7
8// 存储所有打开的设备别名
9static std::vector<std::string> g_deviceAliases;
10static std::string g_currentDevice = "";
11
12void playBackgroundMusic(const char* music, bool repeat, int volume)
13{
14    static int i = 0;
15    char alias[20];
16    sprintf(alias, "bgm%d", i++);
17
18    char cmd[256] = { 0 };
19
20    // 打开设备
21    sprintf(cmd, "open \"%s\" alias %s", music, alias);
22    MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);
23    if (ret != 0)
24    {
25        char err[100] = { 0 };
26        mciGetErrorString(ret, err, sizeof(err));
27        printf("[open error]: %s\n", err);
28        return;
29    }
30
31    // 设置音量
32    if (volume != -1)
33    {
34        sprintf(cmd, "setaudio %s volume to %d", alias, volume);
35        ret = mciSendString(cmd, NULL, 0, NULL);
36        if (ret != 0)
37        {
38            char err[100] = { 0 };
39            mciGetErrorString(ret, err, sizeof(err));
40            printf("[volume error]: %s\n", err);
41        }
42    }
43
44    // 播放
45    sprintf(cmd, "play %s %s", alias, repeat ? "repeat" : "");
46    ret = mciSendString(cmd, NULL, 0, NULL);
47    if (ret != 0)
48    {
49        char err[100] = { 0 };
50        mciGetErrorString(ret, err, sizeof(err));
51        printf("[play error]: %s\n", err);
52        // 播放失败时关闭设备
53        sprintf(cmd, "close %s", alias);
54        mciSendString(cmd, NULL, 0, NULL);
55        return;
56    }
57
58    // 保存设备信息
59    g_deviceAliases.push_back(alias);
60    g_currentDevice = alias;
61
62    printf("Playing music: %s on device: %s\n", music, alias);
63}
64
65void pauseBackgroundMusic()
66{
67    if (g_currentDevice.empty()) {
68        printf("No music is currently playing.\n");
69        return;
70    }
71
72    char cmd[100] = { 0 };
73    sprintf(cmd, "pause %s", g_currentDevice.c_str());
74
75    MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);
76    if (ret != 0)
77    {
78        char err[100] = { 0 };
79        mciGetErrorString(ret, err, sizeof(err));
80        printf("[pause error]: %s\n", err);
81    }
82    else
83    {
84        printf("Music paused: %s\n", g_currentDevice.c_str());
85    }
86}
87
88void resumeBackgroundMusic()
89{
90    if (g_currentDevice.empty()) {
91        printf("No music is currently paused.\n");
92        return;
93    }
94
95    char cmd[100] = { 0 };
96    sprintf(cmd, "resume %s", g_currentDevice.c_str());
97
98    MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);
99    if (ret != 0)
100    {
101        char err[100] = { 0 };
102        mciGetErrorString(ret, err, sizeof(err));
103        printf("[resume error]: %s\n", err);
104    }
105    else
106    {
107        printf("Music resumed: %s\n", g_currentDevice.c_str());
108    }
109}
110
111void stopBackgroundMusic()
112{
113    if (g_currentDevice.empty()) {
114        printf("No music is currently playing.\n");
115        return;
116    }
117
118    char cmd[100] = { 0 };
119
120    // 停止播放
121    sprintf(cmd, "stop %s", g_currentDevice.c_str());
122    mciSendString(cmd, NULL, 0, NULL);
123
124    // 关闭设备
125    sprintf(cmd, "close %s", g_currentDevice.c_str());
126    MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);
127    if (ret != 0)
128    {
129        char err[100] = { 0 };
130        mciGetErrorString(ret, err, sizeof(err));
131        printf("[close error]: %s\n", err);
132    }
133    else
134    {
135        printf("Music stopped and closed: %s\n", g_currentDevice.c_str());
136        // 从列表中移除
137        for (auto it = g_deviceAliases.begin(); it != g_deviceAliases.end(); ++it) {
138            if (*it == g_currentDevice) {
139                g_deviceAliases.erase(it);
140                break;
141            }
142        }
143        g_currentDevice = "";
144    }
145}
146
147void closeAllMusic()
148{
149    char cmd[100] = { 0 };
150
151    // 关闭所有设备
152    for (const auto& alias : g_deviceAliases) {
153        sprintf(cmd, "close %s", alias.c_str());
154        mciSendString(cmd, NULL, 0, NULL);
155        printf("Closed device: %s\n", alias.c_str());
156    }
157
158    g_deviceAliases.clear();
159    g_currentDevice = "";
160    printf("All music devices closed.\n");
161}
162
1#include "music_manager.h"
2#include <windows.h>  // 添加这行
3#include<graphics.h>
4#include <conio.h>
5#define WIDTH 800
6#define HEIGHT 600
7IMAGE background;
8int swap;
9void init() {
10    initgraph(WIDTH, HEIGHT,1);  // 初始化图形窗口
11    loadimage(&background, _T("syk.png"));
12    putimage(0, 0, &background);
13}
14
15
16int main()
17{
18    init();
19    // 播放音乐
20    playBackgroundMusic("background.mp3", true, 500);  // 循环播放,音量50%
21
22    while (1) {
23        //如果有鼠标左键按下 swap=~swap;
24        if (MouseHit()) {
25            MOUSEMSG msg = GetMouseMsg();
26            if (msg.uMsg == WM_LBUTTONDOWN) {
27                swap = ~swap;
28                if (swap) {
29                    pauseBackgroundMusic();
30                }
31                else {
32                    resumeBackgroundMusic();
33                }
34            }
35            //如果有鼠标右键按下,结束音乐
36            if (msg.uMsg == WM_RBUTTONDOWN) {
37                playBackgroundMusic("b1.mp3", true, 500);  // 循环播放,音量50%
38            }
39            //如果中间鼠标
40            if (msg.uMsg == WM_MBUTTONDOWN) {
41                closeAllMusic();
42            }
43            //如果双击右键,音量加10
44            if (msg.uMsg == WM_RBUTTONDBLCLK) {
45                
46            }
47        }
48    }
49    // 暂停音乐
50    Sleep(3000);  // 播放3秒后暂停
51    pauseBackgroundMusic();
52
53    // 恢复播放
54    Sleep(2000);  // 暂停2秒后恢复
55    resumeBackgroundMusic();
56
57    // 停止当前音乐
58    Sleep(3000);  // 再播放3秒后停止
59    //stopBackgroundMusic();
60
61    // 播放另一首音乐
62    playBackgroundMusic("b1.mp3", false, 800);  // 不循环,音量80%
63
64
65    Sleep(10000);
66    // 程序结束时关闭所有资源
67    closeAllMusic();
68    
69    _getch();
70    closegraph();  // 关闭图形窗口
71
72    return 0;
73}
74

C++ 图片加背景音乐的处理》 是转载文章,点击查看原文


相关推荐


让数据库“听懂“人话:Text2Sql.Net 深度技术解析
许泽宇的技术分享2025/11/6

从自然语言到SQL的智能转换之旅——基于.NET与Semantic Kernel的企业级实践 📖 引言:当AI遇见数据库 想象一下这样的场景:产品经理走到你面前说"帮我查一下上个月销售额最高的前10个产品",你不用打开SQL客户端,不用回忆表结构,甚至不用写一行代码,只需要把这句话原封不动地"告诉"数据库,几秒钟后,结果就呈现在眼前。 这不是科幻,这就是 Text2Sql.Net 正在做的事情。 在数据驱动的时代,SQL依然是连接人与数据的桥梁。但让我们面对现实:不是每个人都会


Redis(98) Redis的安全更新如何进行?
Victor3562025/11/2

保持Redis的安全更新至关重要,以防止潜在的安全漏洞和攻击。以下是详细的Redis安全更新步骤和相关代码示例。 1. 检查当前Redis版本 首先,检查当前安装的Redis版本。 redis-server --version 或通过Redis CLI: redis-cli info server | grep redis_version 2. 备份Redis数据 在进行任何更新之前,务必备份Redis数据,以防止数据丢失。 手动触发RDB快照 redis-cli BGSAVE 备份RDB


Python 的内置函数 eval
IMPYLH2025/10/30

Python 内建函数列表 > Python 的内置函数 eval Python 的内置函数 eval() 是一个强大的功能函数,用于执行动态生成的 Python 表达式。它的完整语法是: eval(expression, globals=None, locals=None) 其中: expression 是必需参数,表示要执行的字符串形式的 Python 表达式globals 是可选的全局变量字典locals 是可选的局部变量字典 示例: x = 10 result = eval


Spring Boot 启动流程源码解析
湮酒2025/10/28

⚙️Spring Boot 启动流程源码解析 文章目录 ⚙️Spring Boot 启动流程源码解析🎯 一、Spring Boot 启动流程概览🔄 启动流程全景图⏱️ 启动阶段时间线 🏗️ 二、SpringApplication 初始化阶段🚀 SpringApplication.run() 入口分析🔧 应用类型推断机制📦 工厂加载机制 ⚙️ 三、启动前准备:Banner、Environment、Listener🚀 run() 方法执行流程🎨 Banner 打印机


BUYCOIN:以社区共治重构加密交易版图,定义交易所3.0时代
焦点链创研究所2025/10/25

2025年,全球加密市场在合规化浪潮与信任重建需求的双重驱动下,正经历一场深刻的范式革命。当FTX暴雷事件的余波仍在引发行业对中心化模式的反思,当传统交易所“少数人受益”的分配壁垒愈发凸显,持有美国MSB合规牌照的BUYCOIN交易所横空出世。它以“非托管架构+DAO治理”为双引擎,以“全民持股”为核心内核,不仅破解了传统交易所的信任难题与价值分配困局,更在加密行业迈入万亿美元规模的关键节点,为全球用户勾勒出“共建、共治、共享”的交易新生态。 破局者登场:瞄准行业沉疴的范式革新 当前加密市场呈


UVa 1660 Cable TV Network
寂静山林2025/10/22

题目描述 给定一个双向连接的有线电视网络,网络由中继器(节点)和电缆(边)组成。网络连通的定义是:任意两个节点之间至少存在一条路径。安全系数 fff 的定义如下: 如果无论删除多少个节点(只要不全部删除),网络都保持连通,则 f=nf = nf=n(nnn 为节点数)。 否则,fff 等于能够使网络断开的最小删除节点数。 注意: 空网络(n=0n = 0n=0)或单节点网络(n=1n = 1n=1)视为连通。 输入数据保证正确,节点数 n≤50n \leq 50n


Android studio 修改包名
lichong9512025/10/22

在 Android Studio 里把 package="com.fhvideo.phone" 整体改掉(例如换成 com.mycompany.newapp)分两步走: 让 源码目录结构 和 package 声明 一致让 build.gradle 的 applicationId 与 AndroidManifest.xml 的 package 同步(否则安装时会当成全新应用) 下面给出 最简无坑流程,全程 2-3 min,复制即可用。 一、一键重命名(IDE 自带) 切到 Projec


闲谈KubeBlocks For MongoDB设计实现
小猿姐2025/10/20

闲谈KubeBlocks For MongoDB设计实现 引言 MongoDB 是目前最受欢迎的 NoSQL 数据库之一,这跟它的多种特性有关,如面向文档、高性能、易使用等等,业务使用较为友好。不过由于它本身的复杂性,如节点多状态、多拓扑结构等,使得 MongoDB 的运维管理较为困难。在 K8S 环境下,由于资源的灵活编排,网络的隔离限制,进一步增加了 MongoDB 云原生化的难度,本文将从以下几点阐述 KubeBlocks For MongoDB 在设计实现过程中遇到的难点及解决方案,让大


复杂结构数据挖掘(二)关联规则挖掘 Association rule mining
nju_spy2025/10/19

你是否曾好奇,为什么超市总把啤酒和尿布摆在一起?这看似随意的陈列背后,藏着数据挖掘领域的经典智慧 —— 关联规则挖掘。在大数据时代,海量交易记录如同未开垦的金矿,而关联规则正是撬开这座金矿的关键工具。想象一下,当你在电商平台浏览商品时,系统推荐的 "买了这个的人还买了...",或是超市根据消费数据优化的货架布局,这些场景背后都离不开关联规则算法的神奇魔力。         从本质上讲,关联规则挖掘要解决的核心问题,是在庞大的交易数据中找出 "X→Y" 这样的隐含关系 —— 例如 "买了面包的人


程序员必备!5 款免费又好用的数据库管理工具推荐
追逐时光者2025/10/18

前言 在数据驱动的时代,数据库管理工具对于程序员而言如同瑞士军刀般不可或缺。它们不仅能够帮助我们高效地管理数据库,还能提升数据处理的准确性和速度。今天大姚给大家分享 5 款免费且实用的数据库管理工具(排名不分先后,欢迎文末留下你常用的数据库管理工具),希望可以帮助到有需要的同学。 DataGrip DataGrip 是 JetBrains 推出的一款跨平台(在 Windows、macOS 和 Linux 上提供一致的体验)数据库 IDE,专为 SQL 开发与数据库管理而打造。它集智能代码补全、A

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0