其实我的音乐播放器在看了《C语言也能干大事》前十节就已经开始做了,我根据老师提供的资料做了一个非常简单的音乐播放器,我的第一个音乐播放器只有播放、暂停、等简单的功能,一次只能添加一个音乐文件
我的第一个音乐播放器的下载地址http://www.rupeng.com/forum/forum.php?mod=viewthread&tid=41174&extra=
后来我又做了我的第二个音乐播放器
第二个音乐播放器是重新做的增加了许多功能可以上一曲、下一曲、还可以一次性读取多个音乐文件、还增加了对音乐文件的删除,还美化了界面,仅此而已
我的第二个音乐播放器http://www.rupeng.com/forum/forum.php?mod=viewthread&tid=41183&extra=
在做第二个音乐播放器的时候对于都个音乐文件的添加,我参考了杨中科老师提供的资料
多文件的处理http://xxkkff.blog.51cto.com/162016/26222
在第二个音乐播放器中我使用了ListBox控件显示歌曲,ListBox控件的API函数和ComboBox的API函数差不多,只是将ComboBox改成ListBox
本来还想通过滑动滑块控制声音,在测试的时候还可以,但是一直到播放器上就不行了,最后只能作罢
在第二个音乐播放器中增加的
做完第二个音乐播放器后停了一段时间没有理会,而是继续学习《C语言也能干大事》,学了一段时间后学到了数据库,当学到VC连接MySQL数据库的时候,总是连不上数据库,在之前我为了安装MySQL也花了许多时间,此时心里也非常难过
为了使自己好受一些,我又开始改进我的音乐播放器,这次也改进了不少地方,在改进的过程中也看了许多别人写的音乐播放器,发现他们大多都能最小化到托盘,在托盘上单击或双击就可以复原,我也试着做最小化托盘,正好我看过杨中科老师
讲的对话框的高级操作,我想还可以用上二级对话框,就像QQ一样但退出程序时,会弹出一个退出对话框
在最小化托盘中大多数人是在托盘中双击左键恢复程序,我觉得这样很麻烦,我用的是单击左键恢复程序,单击右键退出程序,本来还想实现气泡的,最后还是没实现
还实现了滑动滑块调节声音大小
尽管如此还有许多功能没实现
没实现的功能:
连续播放
显示播放进度
皮肤美化
播放方式
主功能源代码
#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include <commdlg.h>
/*打开文件对话框头文件*/
#include <mmsystem.h>
/*播放音乐头文件*/
#include <commctrl.h>
/*使用滑块头文件*/
#include "resource.h"
#include "MainDlg.h"
#include "Dialog.h"
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd,WM_VSCROLL,Main_OnSlider);
HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd, WM_CLOSE, Main_OnClose);
case WM_SHOWTASK:
{
/*在托盘图标上单击左键*/
if(WM_LBUTTONDOWN == lParam)
{
/*还原音乐播放器*/
ToTray(hWnd,2);
}
/*单击右键*/
if(WM_RBUTTONDOWN == lParam)
{
/*退出音乐播放器*/
ToTray(hWnd, 3);
}
}
break;
}
return FALSE;
}
/**********************************************************
void Main_OnSlider(HWND hwnd,HWND hwndCtl,UINT code,int pos)
响应滑块滑动调节声音的大小
***********************************************************/
void Main_OnSlider(HWND hwnd,HWND hwndCtl,UINT code,int pos)
{
switch(GetDlgCtrlID(hwndCtl))
{
case IDC_SLIDER1:
{
SetVolume(hwnd);
}
break;
}
}
/********************************************************************
void SetVolume(HWND hwnd)
设置音量
********************************************************************/
void SetVolume(HWND hwnd)
{
/*得到ListBox控件的句柄*/
HWND hwndList = GetDlgItem(hwnd, IDC_LIST1);
/*得到当前选定的歌曲*/
int CurSel = ListBox_GetCurSel(hwndList);
/*保存歌曲的全路径*/
TCHAR All[256];
/*得到歌曲的全路径*/
ListBox_GetText(hwndList, CurSel, All);
/*保存歌曲的短路径*/
TCHAR ShortPath[256];
/*得到文件的段路径*/
GetShortPathName(All, ShortPath, sizeof(ShortPath));
//得到当前滑块的音量值
int voice = SendMessage(GetDlgItem(hwnd,IDC_SLIDER1),TBM_GETPOS,0,0);
/*调节音量*/
voice = 1000 - voice * 10;
TCHAR szVoice[256];
/*将音量设置到滑块的值*/
wsprintf(szVoice,"setaudio %s volume to %d", ShortPath,voice);
/*设置音量*/
mciSendString(szVoice,(LPTSTR)NULL,0,0);
}
/*窗口初始化*/
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
/*在窗口的标题栏上显示图标*/
SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICON1)));
/*在托盘上显示一个图标*/
ToTray(hwnd,4);
/*得到组合框的句柄*/
HWND hwndCombo = GetDlgItem(hwnd, IDC_COMBO1);
ComboBox_InsertString(hwndCombo, -1, TEXT("单曲播放"));
ComboBox_InsertString(hwndCombo, -1, TEXT("随机播放"));
ComboBox_InsertString(hwndCombo, -1, TEXT("循环播放"));
return TRUE;
}
/***************************************************
void Stop_Music(HWND hwnd)
停止播放
***************************************************/
void Stop_Music(HWND hwnd)
{
/*定义ListBox的句柄*/
HWND hwndList = GetDlgItem(hwnd,IDC_LIST1);
/*得到ListBox的索引*/
int CurSel = ListBox_GetCurSel(hwndList);
/*保存歌曲*/
TCHAR line[MAX_PATH];
/*得到选定的歌曲*/
ListBox_GetText(hwndList, CurSel, line);
/*储存文件的短路径*/
TCHAR ShortPath[MAX_PATH];
/*储存: 文件名 + 操作*/
TCHAR cmd[MAX_PATH + 5];
/*得到文件的段路径*/
GetShortPathName(line, ShortPath, sizeof(ShortPath));
/*将文件的段路径和操作打印到 cmd中*/
wsprintf(cmd,"stop %s",ShortPath);
/*停止*/
mciSendString(cmd, "", 0, NULL);
}
/******************************
Play_Music(HWND hwnd)
播放
*******************************/
void Play_Music(HWND hwnd)
{
/*定义ListBox的句柄*/
HWND hwndList = GetDlgItem(hwnd,IDC_LIST1);
/*得到ListBox的索引*/
int CurSel = ListBox_GetCurSel(hwndList);
/*保存歌曲*/
TCHAR line[MAX_PATH];
/*得到选定的歌曲*/
ListBox_GetText(hwndList, CurSel, line);
/*储存文件的短路径*/
TCHAR ShortPath[MAX_PATH];
/*储存: 文件名 + 操作*/
TCHAR cmd[MAX_PATH + 5];
/*得到文件的段路径*/
GetShortPathName(line, ShortPath, sizeof(ShortPath));
/*将文件的段路径和操作打印到 cmd中*/
wsprintf(cmd,"play %s repeat",ShortPath);
/*播放*/
mciSendString(cmd, "", 0, NULL);
}
/****************************************
void Add_Music(HWND hwnd)
添加歌曲
******************************************/
void Add_Music(HWND hwnd)
{
OPENFILENAME ofn;/*文件打开结构*/
TCHAR szOpenFileName[MAX_PATH * 80];/*要打开文件的文件名*/
TCHAR szPath[MAX_PATH];/*文件路径*/
TCHAR szFileName[MAX_PATH * 80];
TCHAR *p;/*用于遍历文件*/
int len = 0;
ZeroMemory(&ofn , sizeof(ofn));/*对文件结构清零*/
ofn.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT;/*文件打开的风格*/
ofn.lStructSize = sizeof(ofn);/*文件结构的大小*/
ofn.lpstrFile = szOpenFileName;/*文件名*/
ofn.nMaxFile = sizeof(szOpenFileName);/*要打开的文件的大小*/
ofn.lpstrFile[0] = '\0';/*文件结尾的标志*/
ofn.lpstrFilter = TEXT("Mp3\0*.mp3*\0All\0*.*");/*过滤器*/
if(GetOpenFileName(&ofn))
{
/*把第一个文件名复制到szPath
如果只选了一个文件,就复制到最后一个'\'
如果选了多个文件,就复制到第一个NULL字符*/
lstrcpyn(szPath, szOpenFileName, ofn.nFileOffset);
/*当只选了一个文件时,下面的NULL是必须的
这是不区别待选了一个和多个文件情况
*/
szPath[ofn.nFileOffset] = '\0';
len = lstrlen(szPath);
if(szPath[len - 1] != '\\')
{
lstrcat(szPath,TEXT("\\"));
}
p = szOpenFileName + ofn.nFileOffset;
ZeroMemory(szFileName, sizeof(szFileName));
HWND hwndList = GetDlgItem(hwnd, IDC_LIST1);
while(*p)
{
lstrcat(szFileName, szPath);/*给文件名加上路径*/
lstrcat(szFileName, p);/*加上文件名*/
ListBox_InsertString(hwndList, -1, p);
lstrcat(szFileName, TEXT("\n"));/*换行*/
p += lstrlen(p) + 1;/*移到下一个文件*/
}
}
}
/********************************
void Delete_Music(HWND hwnd)
删除歌曲
*********************************/
void Delete_Music(HWND hwnd)
{
/*保存歌曲*/
TCHAR line[MAX_PATH];
/*得到ListBox的句柄*/
HWND hwndList = GetDlgItem(hwnd, IDC_LIST1);
/*得到Listbox的索引*/
int CurSel = ListBox_GetCurSel(hwndList);
/*得到选定的歌曲*/
ListBox_GetText(hwndList, CurSel, line);
/*储存文件的短路径*/
TCHAR ShortPath[MAX_PATH];
/*储存: 文件名 + 操作*/
TCHAR cmd[MAX_PATH + 5];
/*得到文件的段路径*/
GetShortPathName(line, ShortPath, sizeof(ShortPath));
/*将文件的段路径和操作打印到 cmd中*/
wsprintf(cmd,"stop %s",ShortPath);
/*停止*/
mciSendString(cmd, "", 0, NULL);
/*删除歌曲*/
ListBox_DeleteString(hwndList, CurSel);
}
/*************************************
void Pause_Music(HWND hwnd)
暂停播放
************************************/
void Pause_Music(HWND hwnd)
{
/*定义ListBox的句柄*/
HWND hwndList = GetDlgItem(hwnd,IDC_LIST1);
/*得到ListBox的索引*/
int CurSel = ListBox_GetCurSel(hwndList);
/*保存歌曲*/
TCHAR line[MAX_PATH];
/*得到选定的歌曲*/
ListBox_GetText(hwndList, CurSel, line);
/*储存文件的短路径*/
TCHAR ShortPath[MAX_PATH];
/*储存: 文件名 + 操作*/
TCHAR cmd[MAX_PATH + 5];
/*得到文件的段路径*/
GetShortPathName(line, ShortPath, sizeof(ShortPath));
/*将文件的段路径和操作打印到 cmd中*/
wsprintf(cmd,"pause %s",ShortPath);
/*暂停*/
mciSendString(cmd, "", 0, NULL);
}
/**************************************
Void Up_Music(HWND hwnd)
上一曲
***************************************/
void Up_Music(HWND hwnd)
{
/*定义ListBox的句柄*/
HWND hwndList = GetDlgItem(hwnd,IDC_LIST1);
/*得到ListBox的索引*/
int CurSel = ListBox_GetCurSel(hwndList);
/*保存歌曲*/
TCHAR line[MAX_PATH];
/*得到选定的歌曲*/
ListBox_GetText(hwndList, CurSel, line);
/*储存文件的短路径*/
TCHAR ShortPath[MAX_PATH];
/*储存: 文件名 + 操作*/
TCHAR cmd[MAX_PATH + 5];
/*得到文件的段路径*/
GetShortPathName(line, ShortPath, sizeof(ShortPath));
/*将文件的段路径和操作打印到 cmd中*/
wsprintf(cmd,"stop %s",ShortPath);
/*停止*/
mciSendString(cmd, "", 0, NULL);
/*上一曲*/
CurSel--;
ListBox_SetCurSel(hwndList, CurSel);
/*得到选定的歌曲*/
ListBox_GetText(hwndList, CurSel, line);
/*得到文件的段路径*/
GetShortPathName(line, ShortPath, sizeof(ShortPath));
/*将文件的段路径和操作打印到 cmd中*/
wsprintf(cmd,"play %s",ShortPath);
/*播放*/
mciSendString(cmd, "", 0, NULL);
}
/*****************************************
下一曲
Void Down_Music(HWND hwnd)
******************************************/
void Down_Music(HWND hwnd)
{
/*定义ListBox的句柄*/
HWND hwndList = GetDlgItem(hwnd,IDC_LIST1);
/*得到ListBox的索引*/
int CurSel = ListBox_GetCurSel(hwndList);
/*保存歌曲*/
TCHAR line[MAX_PATH];
/*得到选定的歌曲*/
ListBox_GetText(hwndList, CurSel, line);
/*储存文件的短路径*/
TCHAR ShortPath[MAX_PATH];
/*储存: 文件名 + 操作*/
TCHAR cmd[MAX_PATH + 5];
/*得到文件的段路径*/
GetShortPathName(line, ShortPath, sizeof(ShortPath));
/*将文件的段路径和操作打印到 cmd中*/
wsprintf(cmd,"stop %s",ShortPath);
/*停止*/
mciSendString(cmd, "", 0, NULL);
/*下一曲*/
CurSel++;
ListBox_SetCurSel(hwndList, CurSel);
/*得到选定的歌曲*/
ListBox_GetText(hwndList, CurSel, line);
/*得到文件的段路径*/
GetShortPathName(line, ShortPath, sizeof(ShortPath));
/*将文件的段路径和操作打印到 cmd中*/
wsprintf(cmd,"play %s",ShortPath);
/*播放*/
mciSendString(cmd, "", 0, NULL);
}
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
/*播放歌曲*/
case IDC_PLAY:
{
/*播放歌曲*/
Play_Music(hwnd);
}
break;
/*添加歌曲*/
case IDC_ADD:
{
/*添加歌曲*/
Add_Music(hwnd);
}
break;
/*删除歌曲*/
case IDC_DELETE:
{
/*删除歌曲*/
Delete_Music(hwnd);
}
break;
/*停止*/
case IDC_STOP:
{
Stop_Music(hwnd);
}
break;
/*暂停*/
case IDC_PAUSE:
{
/*暂停播放*/
Pause_Music(hwnd);
}
break;
/*上一曲*/
case IDC_MUSIC1:
{
Up_Music(hwnd);
}
break;
/*下一曲*/
case IDC_MUSIC2:
{
Down_Music(hwnd);
}
break;
case IDC_LIST1:
{
/*双击ListBox控件*/
if(LBN_DBLCLK == codeNotify)
{
//mciSendString("play sound", NULL, 0, NULL); //
/*播放歌曲*/
Play_Music(hwnd);
}
}
break;
default:
break;
}
}
/*弹出关闭对话框*/
void Main_OnClose(HWND hwnd)
{
/*得到窗口的实例句柄*/
HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);
/*弹出对话框*/
DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, Dialog_Proc, NULL);
}
附加功能源代码
#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include "shellapi.h"
/*取用托盘头文件*/
#include "resource.h"
#include "MainDlg.h"
#include "Dialog.h"
BOOL WINAPI Dialog_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd, WM_INITDIALOG, Dialog_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMAND, Dialog_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE, Dialog_OnClose);
}
return FALSE;
}
BOOL Dialog_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
return TRUE;
}
void Dialog_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
switch(id)
{
case IDC_RADIO1:/*最小化到托盘*/
case IDC_RADIO2:/*直接退出程序*/
{
CheckRadioButton(hwnd, IDC_RADIO1, IDC_RADIO2, id);
}
break;
case IDOK:
{
/*最小化到托盘*/
int iChecked1 = IsDlgButtonChecked(hwnd, IDC_RADIO1);
/*直接退出程序*/
int iChecked2 = IsDlgButtonChecked(hwnd, IDC_RADIO2);
if(BST_CHECKED == iChecked1)
{
ToTray(hwnd , 1);
}
/*直接退出程序*/
if(BST_CHECKED == iChecked2)
{
Main_OnClose1(hwnd);
}
}
break;
/*取消*/
case IDCANCEL:
{
EndDialog(hwnd,0);
}
break;
default:
break;
}
}
/*处理托盘消息托盘*/
void ToTray(HWND hwnd, int flag)
{
/*得到父窗口的句柄*/
HWND hwnd1 = FindWindow(NULL, TEXT("My Music"));
/*传递托盘消息结构*/
NOTIFYICONDATA nid;
/*对托盘结构清零*/
ZeroMemory(&nid, sizeof(NOTIFYICONDATA));
/*托盘消息结构的大小*/
nid.cbSize = (DWORD)sizeof(NOTIFYICONDATA);
/*父窗口的句柄*/
nid.hWnd = hwnd1;
/*将父窗口最小化到托盘*/
nid.uID = IDD_MAIN;
/*起作用的成员: hIcon、uCallbackMessage、 szTip*/
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP ;
/*在托盘中显示软件名*/
wsprintf(nid.szTip ,"%s", TEXT("Music Player1"));
/*程序定义的消息标示符*/
nid.uCallbackMessage = WM_SHOWTASK;
/*增加、修改或删除图标句柄*/
nid.hIcon = LoadIcon( (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), MAKEINTRESOURCE(IDI_ICON1));
switch(flag)
{
/*音乐播放器最小化到托盘*/
case 1:
{
/*关闭退出提示框*/
EndDialog(hwnd, 0);
/*隐藏窗口*/
ShowWindow(hwnd1, SW_HIDE);
}
break;
/*还原音乐播放器*/
case 2:
{
/*显示窗口*/
ShowWindow(hwnd1, SW_SHOW);
}
break;
/*退出音乐播放器*/
case 3:
{
/*退出程序*/
Main_OnClose1(hwnd);
}
break;
case 4:
{
/*在托盘上显示图标*/
Shell_NotifyIcon(NIM_ADD, &nid);
}
break;
case 5:
{
Shell_NotifyIcon(NIM_DELETE, &nid);
}
break;
default:
break;
}
}
/*关闭程序*/
void Main_OnClose1(HWND hwnd)
{
ToTray(hwnd, 5);
exit(0);
}
void Dialog_OnClose(HWND hwnd)
{
EndDialog(hwnd, 0);
}