
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++ 图片加背景音乐的处理》 是转载文章,点击查看原文。