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;
}
相关推荐
20岁30年经验的码农19 小时前
Java Elasticsearch 实战指南
java·开发语言·elasticsearch
雾岛听蓝19 小时前
C++ 类和对象(一):从概念到实践,吃透类的核心基础
开发语言·c++·经验分享·笔记
CoderYanger19 小时前
优选算法-优先级队列(堆):75.数据流中的第K大元素
java·开发语言·算法·leetcode·职场和发展·1024程序员节
TracyCoder12320 小时前
MySQL 实战宝典(八):Java后端MySQL分库分表工具解析与选型秘籍
java·开发语言·mysql
非凡的世界20 小时前
为什么我和越来越多的PHP程序员,选择了 Webman ?
开发语言·php·workman·webman
Dream it possible!20 小时前
LeetCode 面试经典 150_图_克隆图(90_133_C++_中等)(深度优先:DFS)
c++·leetcode·面试·
MarkHD20 小时前
车辆TBOX科普 第45次
java·开发语言
还债大湿兄20 小时前
阿里通义千问调用图像大模型生成轮动漫风格 python调用
开发语言·前端·python
鸭子程序员20 小时前
c++ 算法
开发语言·c++·算法
不会c嘎嘎21 小时前
算法百练,直击OFFER -- day5
c++·算法