规划,流程:(音乐文件和图片文件放在智能电子钢琴文件夹里)
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 程序模拟按键
按键消息
SendMessagec++
5.播放完示例音乐,后出现一张start图片停留2000ms后恢复钢琴界面windows
1.建立win32应用程序(Visual c++ -->win32应用程序)数组
注:去掉安全开发生命周期(SDL)检查,不然一些功能将用不了安全
2.项目属性-->配置属性-->常规-->字符集-->使用多字节字符集函数
3.代码:.net
// 智能电子钢琴.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; }
播放完示例音乐,出现图片:
线程
start图片停留2000ms后,便可自由演奏3d