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;
}
相关推荐
Tony Bai1 分钟前
Cloudflare 2025 年度报告发布——Go 语言再次“屠榜”API 领域,AI 流量激增!
开发语言·人工智能·后端·golang
ID_180079054732 分钟前
有没有其他语言实现淘宝商品详情API接口采集的方案?
开发语言
清水白石0085 分钟前
《Python 责任链模式实战指南:从设计思想到工程落地》
开发语言·python·责任链模式
love is sour13 分钟前
深入浅出 jmap:Java 内存分析的“显微镜“
java·开发语言·测试工具·性能优化
json{shen:"jing"}16 分钟前
2-C语言的运算符和表达式
c语言·开发语言
AI视觉网奇23 分钟前
ue 虚幻引擎学习笔记
开发语言·虚幻引擎
ghie909036 分钟前
使用MATLAB的k-Wave工具箱进行超声CT成像
开发语言·matlab
catchadmin37 分钟前
PHP 8.6 新增 clamp() 函数
开发语言·php
杰克尼43 分钟前
蓝桥云课-5. 花灯调整【算法赛】
java·开发语言·算法
.小墨迹44 分钟前
C++学习之std::move 的用法与优缺点分析
linux·开发语言·c++·学习·算法·ubuntu