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

cpp 复制代码
//music_manager.h
#pragma once

// 播放背景音乐
void playBackgroundMusic(const char* music, bool repeat = false, int volume = -1);

// 暂停当前播放的音乐
void pauseBackgroundMusic();

// 恢复暂停的音乐
void resumeBackgroundMusic();

// 停止并关闭当前音乐
void stopBackgroundMusic();

// 关闭所有音乐资源
void closeAllMusic();
cpp 复制代码
//music_manager.cpp
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <vector>
#include <string>

// 存储所有打开的设备别名
static std::vector<std::string> g_deviceAliases;
static std::string g_currentDevice = "";

void playBackgroundMusic(const char* music, bool repeat, int volume)
{
    static int i = 0;
    char alias[20];
    sprintf(alias, "bgm%d", i++);

    char cmd[256] = { 0 };

    // 打开设备
    sprintf(cmd, "open \"%s\" alias %s", music, alias);
    MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);
    if (ret != 0)
    {
        char err[100] = { 0 };
        mciGetErrorString(ret, err, sizeof(err));
        printf("[open error]: %s\n", err);
        return;
    }

    // 设置音量
    if (volume != -1)
    {
        sprintf(cmd, "setaudio %s volume to %d", alias, volume);
        ret = mciSendString(cmd, NULL, 0, NULL);
        if (ret != 0)
        {
            char err[100] = { 0 };
            mciGetErrorString(ret, err, sizeof(err));
            printf("[volume error]: %s\n", err);
        }
    }

    // 播放
    sprintf(cmd, "play %s %s", alias, repeat ? "repeat" : "");
    ret = mciSendString(cmd, NULL, 0, NULL);
    if (ret != 0)
    {
        char err[100] = { 0 };
        mciGetErrorString(ret, err, sizeof(err));
        printf("[play error]: %s\n", err);
        // 播放失败时关闭设备
        sprintf(cmd, "close %s", alias);
        mciSendString(cmd, NULL, 0, NULL);
        return;
    }

    // 保存设备信息
    g_deviceAliases.push_back(alias);
    g_currentDevice = alias;

    printf("Playing music: %s on device: %s\n", music, alias);
}

void pauseBackgroundMusic()
{
    if (g_currentDevice.empty()) {
        printf("No music is currently playing.\n");
        return;
    }

    char cmd[100] = { 0 };
    sprintf(cmd, "pause %s", g_currentDevice.c_str());

    MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);
    if (ret != 0)
    {
        char err[100] = { 0 };
        mciGetErrorString(ret, err, sizeof(err));
        printf("[pause error]: %s\n", err);
    }
    else
    {
        printf("Music paused: %s\n", g_currentDevice.c_str());
    }
}

void resumeBackgroundMusic()
{
    if (g_currentDevice.empty()) {
        printf("No music is currently paused.\n");
        return;
    }

    char cmd[100] = { 0 };
    sprintf(cmd, "resume %s", g_currentDevice.c_str());

    MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);
    if (ret != 0)
    {
        char err[100] = { 0 };
        mciGetErrorString(ret, err, sizeof(err));
        printf("[resume error]: %s\n", err);
    }
    else
    {
        printf("Music resumed: %s\n", g_currentDevice.c_str());
    }
}

void stopBackgroundMusic()
{
    if (g_currentDevice.empty()) {
        printf("No music is currently playing.\n");
        return;
    }

    char cmd[100] = { 0 };

    // 停止播放
    sprintf(cmd, "stop %s", g_currentDevice.c_str());
    mciSendString(cmd, NULL, 0, NULL);

    // 关闭设备
    sprintf(cmd, "close %s", g_currentDevice.c_str());
    MCIERROR ret = mciSendString(cmd, NULL, 0, NULL);
    if (ret != 0)
    {
        char err[100] = { 0 };
        mciGetErrorString(ret, err, sizeof(err));
        printf("[close error]: %s\n", err);
    }
    else
    {
        printf("Music stopped and closed: %s\n", g_currentDevice.c_str());
        // 从列表中移除
        for (auto it = g_deviceAliases.begin(); it != g_deviceAliases.end(); ++it) {
            if (*it == g_currentDevice) {
                g_deviceAliases.erase(it);
                break;
            }
        }
        g_currentDevice = "";
    }
}

void closeAllMusic()
{
    char cmd[100] = { 0 };

    // 关闭所有设备
    for (const auto& alias : g_deviceAliases) {
        sprintf(cmd, "close %s", alias.c_str());
        mciSendString(cmd, NULL, 0, NULL);
        printf("Closed device: %s\n", alias.c_str());
    }

    g_deviceAliases.clear();
    g_currentDevice = "";
    printf("All music devices closed.\n");
}
cpp 复制代码
#include "music_manager.h"
#include <windows.h>  // 添加这行
#include<graphics.h>
#include <conio.h>
#define WIDTH 800
#define HEIGHT 600
IMAGE background;
int swap;
void init() {
    initgraph(WIDTH, HEIGHT,1);  // 初始化图形窗口
    loadimage(&background, _T("syk.png"));
    putimage(0, 0, &background);
}


int main()
{
    init();
    // 播放音乐
    playBackgroundMusic("background.mp3", true, 500);  // 循环播放,音量50%

    while (1) {
        //如果有鼠标左键按下 swap=~swap;
        if (MouseHit()) {
            MOUSEMSG msg = GetMouseMsg();
            if (msg.uMsg == WM_LBUTTONDOWN) {
                swap = ~swap;
                if (swap) {
                    pauseBackgroundMusic();
                }
                else {
                    resumeBackgroundMusic();
                }
            }
            //如果有鼠标右键按下,结束音乐
            if (msg.uMsg == WM_RBUTTONDOWN) {
                playBackgroundMusic("b1.mp3", true, 500);  // 循环播放,音量50%
            }
            //如果中间鼠标
            if (msg.uMsg == WM_MBUTTONDOWN) {
                closeAllMusic();
            }
            //如果双击右键,音量加10
            if (msg.uMsg == WM_RBUTTONDBLCLK) {
                
            }
        }
    }
    // 暂停音乐
    Sleep(3000);  // 播放3秒后暂停
    pauseBackgroundMusic();

    // 恢复播放
    Sleep(2000);  // 暂停2秒后恢复
    resumeBackgroundMusic();

    // 停止当前音乐
    Sleep(3000);  // 再播放3秒后停止
    //stopBackgroundMusic();

    // 播放另一首音乐
    playBackgroundMusic("b1.mp3", false, 800);  // 不循环,音量80%


    Sleep(10000);
    // 程序结束时关闭所有资源
    closeAllMusic();
    
    _getch();
    closegraph();  // 关闭图形窗口

    return 0;
}
相关推荐
apocelipes2 小时前
POSIX兼容系统上read和write系统调用的行为总结
linux·c语言·c++·python·golang·linux编程
爱编程的鱼2 小时前
C# var 关键字详解:从入门到精通
开发语言·c#·solr
MATLAB代码顾问2 小时前
MATLAB实现TCN神经网络数值预测
开发语言·matlab
No0d1es2 小时前
2025年第十六届蓝桥杯青少组省赛 C++编程 中级组真题
c++·青少年编程·蓝桥杯·省赛
千禧皓月2 小时前
【C++】基于C++的RPC分布式网络通信框架(二)
c++·分布式·rpc
南汐汐月2 小时前
重生归来,我要成功 Python 高手--day33 决策树
开发语言·python·决策树
AA陈超3 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P07-08 点击移动
c++·游戏·ue5·游戏引擎·虚幻
星释3 小时前
Rust 练习册 :Proverb与字符串处理
开发语言·后端·rust
·白小白3 小时前
力扣(LeetCode) ——209. 长度最小的子数组(C++)
c++·算法·leetcode