软件:VS2013-->win32应用程序
语言: C/C++
程序功能: 运行程序后自动播放一段示例音乐,开始自由演奏(用户再按下1~7数字键发出对应音符)
下载地址:https://download.csdn.net/download/cai_niaocainiao/10618216
规划,流程:(音乐文件和图片文件放在智能电子钢琴文件夹里)
1.播放音乐 //音乐格式为mp3
1.1 音乐文件
1.2 打开音乐文件
1.3 播放音乐文件
1.4 关闭音乐文件
2.按键控制音乐播放
2.1 getch获取按键
2.2 switch调用不同函数播不同音乐文件
3.加上界面 //图片格式为.bmp
3.1 一开始做好界面
贴图三部曲:定义变量 加载图片 贴图
3.2 按下对应的按键就用灰色把对应的钢琴键覆盖
3.3 等待一段时间后还原
4.智能自动播放示例音乐
4.1 程序模拟按键
按键消息
SendMessage
5.播放完示例音乐,后出现一张start图片停留2000ms后恢复钢琴界面
步骤:
1.创建win32应用程序(Visual c++ -->win32应用程序)
注:去掉安全开发生命周期(SDL)检查,否则一些功能将用不了
2.项目属性-->配置属性-->常规-->字符集-->使用多字节字符集
3.代码:
// 智能电子钢琴.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "windows.h"
#include "Mmsystem.h"
#include "conio.h" //getch的头文件
#include <graphics.h> // 图形库的头文件,需要先安装好easyx
//图片宽
#define WIDTH 100
//图片高
#define HEIGH 400
//定时器间隔时间
#define SPACE 50
//贴图,定义变量
IMAGE bmp[7];
IMAGE down;
IMAGE start;
HWND G_hWnd;
#pragma comment(lib,"Winmm.lib")
void playMusic(char *m) //m为传进来的音乐名
{
int m_in;
char buff[256] = { 0 }; //初始化为空
sprintf(buff, "open sounds\\%s alias m", m); //alias m别名,将m写入字符串里
//对应位置贴灰色图片
m_in = m[0] - '0'; //转换成Int型
printf("n:%d\n", m_in);
putimage((m_in - 1)*WIDTH, 0, &down);
//1 播放音乐
mciSendString(buff, NULL, NULL, NULL);//设置字节符为多字节字符集,解决不匹配问题。
mciSendString("play m", NULL, NULL, NULL);
Sleep(50); //延迟50ms
//贴回对应图片
putimage((m_in - 1)*WIDTH, 0, &bmp[m_in-1]);
Sleep(200);
mciSendString("close m", NULL, NULL, NULL);
}
//贴图的准备工作
void initDraw()
{
char buff[256];
//1制作窗口
G_hWnd=initgraph(7 * WIDTH, HEIGH,SHOWCONSOLE);
//加载图片
loadimage(&down, "images\\down.bmp");
loadimage(&start, "images\\start.bmp");
for (int i = 0; i < 7; i++)
{
memset(buff, 0, 256);//清空数组
sprintf(buff, "images\\%d.bmp", i + 1);
loadimage(&bmp[i], buff);
}
}
void drawbeginWindow() //画开始界面
{
for (int i = 0; i < 7; i++)
{
putimage(i*WIDTH, 0, &bmp[i]);
}
}
int array[] = { 6, 0, 6, 0, 3, 0, 6, 0, 0, 0, 6, 0, 6, 0,
5, 0, 6, 0, 7, 0, 5, 0, 3, 0, 4, 0, 4, 0, 4, 0, 5, 0, 4, 0, 4, 0, 4, 0, 3, 0, 2, 0, 3, 0, 3, 0 };
int len = sizeof(array) / sizeof(array[0]);//获取数组元素个数
int index = 0;
//每隔固定时间做的事情
VOID timeProc(HWND G_hWnd, UINT uInt, UINT_PTR ptr,DWORD dWord)
{
//防止数组越界
if (index >= len)
{
KillTimer(G_hWnd, 10086); //结束自动播放
putimage(0, 0, &start); //贴start图片
Sleep(2000);
//贴回对应图片
drawbeginWindow();
}
switch (array[index]){
case 1:
SendMessage(G_hWnd, WM_KEYDOWN, 49, NULL);
break;
case 2:
SendMessage(G_hWnd, WM_KEYDOWN, 50, NULL);
break;
case 3:
SendMessage(G_hWnd, WM_KEYDOWN, 51, NULL);
break;
case 4:
SendMessage(G_hWnd, WM_KEYDOWN, 52, NULL);
break;
case 5:
SendMessage(G_hWnd, WM_KEYDOWN, 53, NULL);
break;
case 6:
SendMessage(G_hWnd, WM_KEYDOWN, 54, NULL);
break;
case 7:
SendMessage(G_hWnd, WM_KEYDOWN, 55, NULL);
break;
}
index++;
}
int _tmain(int argc, _TCHAR* argv[])
{
initDraw();
// 2 按键控制
int ch; //用来保存按键虚拟键值
DWORD id; //线程的身份证号
//定时器 每隔固定时间就响一下
SetTimer(G_hWnd, 10086, SPACE, (TIMERPROC)timeProc); //10086是定时器的id
while (1)
{
drawbeginWindow();
ch = getch();
printf("%d\n", ch);
switch (ch)
{
case 49: //创建线程
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)playMusic, "1.mp3", NULL, &id);
break;
case 50: //创建线程
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)playMusic, "2.mp3", NULL, &id);
break;
case 51: //创建线程
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)playMusic, "3.mp3", NULL, &id);
break;
case 52: //创建线程
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)playMusic, "4.mp3", NULL, &id);
break;
case 53: //创建线程
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)playMusic, "5.mp3", NULL, &id);
break;
case 54: //创建线程
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)playMusic, "6.mp3", NULL, &id);
break;
case 55: //创建线程
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)playMusic, "7.mp3", NULL, &id);
break;
}
}
while (1);
return 0;
}
结果部分截图:
程序运行后:![](https://i-blog.csdnimg.cn/blog_migrate/b0795e4479b796ccaeb4635b117b5473.png)
播放完示例音乐,出现图片:
start图片停留2000ms后,即可自由演奏