自己动手开发音乐播放器(四)文件操作

所有的准备工作做完了后,就可以实现播放音乐的功能了吗,NO,在实现播放音乐之前还需要处理音乐文件,就是对音乐文件的增删改查

首先我们需要知道OPENFILENAME结构和GetFileName函数

OPENFILENAME结构是一个文件处理结构

 参数:

DWORD         lStructSize;
  HWND          hwndOwner;
  HINSTANCE     hInstance;
  LPCTSTR       lpstrFilter;
  LPTSTR        lpstrCustomFilter;
  DWORD         nMaxCustFilter;
  DWORD         nFilterIndex;
  LPTSTR        lpstrFile;
  DWORD         nMaxFile;
  LPTSTR        lpstrFileTitle;
  DWORD         nMaxFileTitle;
  LPCTSTR       lpstrInitialDir;
  LPCTSTR       lpstrTitle;
  DWORD         Flags;
  WORD          nFileOffset;
  WORD          nFileExtension;
  LPCTSTR       lpstrDefExt;
  LPARAM        lCustData;
  LPOFNHOOKPROC lpfnHook;
  LPCTSTR       lpTemplateName;

由于OPENFILENAME结构的参数过多,我就不一一介绍,在后面程序中使用时,我再介绍


还需要一个函数GetOpenFileName用于打开文件夹,GetOpenFileName只用一个参数,OPENFILENAME的地址

在使用时还需要定义一些全局变量为了减少变量的使用

/************************************************************************
          处理音乐文件时所需的全局变量
*************************************************************************/
static OPENFILENAME ofn;//打开文件对话框的文件结构

static char szOpenFileName[80*MAX_PATH];//保存文件名

static char szFileName[80*MAX_PATH];//保存歌曲的全路径

static char szPath[80*MAX_PATH];//储存路径

static char OpenMusicFile[MAX_PATH];//保存路径(用于操作音乐)

为了处理音乐文件还需要定义几个函数

void FileInit(HWND hwnd)

/**********************************************************************
                 函数名:   FileInit(HWND hwnd)
                 函数功能: 打开文件初始化文件对话框
****************************************************************************/
void FileInit(HWND hwnd)
{
	//文件结构清零
	ZeroMemory(&ofn,sizeof(ofn));

	//文件结构的大小
	ofn.lStructSize = sizeof(ofn);

	//文件路径
	ofn.lpstrFile = szOpenFileName;

	ofn.lpstrFile[0] = TEXT('\0');

	ofn.nMaxFile = sizeof(szOpenFileName);

	//过滤器
	ofn.lpstrFilter = TEXT("所有支持文件(*.wav,*.mp3,*.wma)\0*.wav;*.mp3;*.wma\0wave文件(*.wav)\0*.wav\0mp3文件(*.mp3)\0*.mp3\0wma文件(*.wma)\0*.wma\0");
	
	ofn.nFilterIndex = 1;

	ofn.lpstrFileTitle = NULL;

	ofn.nMaxFileTitle = 0;

	ofn.lpstrInitialDir = NULL;

	ofn.hwndOwner = hwnd;

	ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_ALLOWMULTISELECT;
}


int OpenFileDlg(void)

/**********************************************************************
              函数名:   bool OpenFileDlg(void)
              函数功能: 打开文件对话框
************************************************************************/
int OpenFileDlg(void)
{
	return GetOpenFileName(&ofn);
}


void AddFile(HWND hwnd)
/**********************************************************************
           函数名:   void AddFile(HWND hwnd)
		   函数功能: 添加文件
***********************************************************************/
void AddFile(HWND hwnd)
{
	TCHAR *p;//用于遍历音乐文件

	int len = 0;

	FileInit(hwnd);//文件初始化
	
	if(OpenFileDlg())
	{
	/*把第一个文件名复制到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 AddFolder(HWND hwnd)

/************************************************************************************
                 函数名:   AddFolder(HWND hwnd)
				 函数功能: 添加文件夹
****************************************************************************/
void AddFolder(HWND hwnd)
{

	 //保存文件夹的路径
	 TCHAR szFile[MAX_PATH];

	 TCHAR pBuffer_Directory[MAX_PATH];//存放文件信息

     BROWSEINFO sBrowseInfo;//文件夹结构
	 
	 LPCITEMIDLIST lpitem;//用于判断是否选择了一个文件夹
	 
	 WIN32_FIND_DATA sfd;//文件的全部属性结构

	 //对文件夹结构清零
	 ZeroMemory(&sBrowseInfo,sizeof(BROWSEINFO));

	 //浏览文件夹对话框的父窗体句柄。
	 sBrowseInfo.hwndOwner=hwnd;

	 //该浏览文件夹对话框对话框的显示文本,用来提示该浏览文件夹对话框的功能、作用和目的。
	 sBrowseInfo.lpszTitle="请选择文件夹";

	 //文件夹对话框的选项
	 sBrowseInfo.ulFlags=BIF_RETURNONLYFSDIRS;
     //BIF_RETURNFSANCESTORS:返回文件系统的一个节点。仅仅当选中的是有意义的节点时,“OK”按钮才可以使用。
	 
    //显示一个选择文件夹的对话框
	 lpitem=SHBrowseForFolder(&sBrowseInfo);

	 //判断是否选择了文件夹
	 if(NULL==lpitem)
	 {
		 return;
	 }
	 
	 //获得文件夹的路径
	 SHGetPathFromIDList(lpitem,pBuffer_Directory);
	 
	 strcpy(szFile,pBuffer_Directory);

	 //枚举过滤条件(只实现MP3)
    lstrcat(pBuffer_Directory,"\\*.mp3");	
	 
	 /*得到第一个文件(第一首歌)的句柄*/
	 HANDLE hfindfile = FindFirstFile(pBuffer_Directory,&sfd);
	 
	 if(INVALID_HANDLE_VALUE==hfindfile)//判断文件是否有效
	 {
		 return;
	 }
	 
	 do
	 {
		 if (sfd.cFileName[0]=='.')
		 {
			 continue;
		 }
		 
		 lstrcat(szFileName,szFile);

		 lstrcat(szFileName,TEXT("\\"));

		 lstrcat(szFileName,sfd.cFileName);

		 lstrcat(szFileName,TEXT("\n"));

		 //得到ListBox控件的句柄
		 HWND hwndList = GetDlgItem(hwnd,IDC_LIST1);

		 //将音乐文件的文件名(歌曲名)添加到播放列表中
		 ListBox_InsertString(hwndList,-1,sfd.cFileName);

	 }while (FindNextFile(hfindfile,&sfd));
	 /*只要没遍历到文件夹中的最后一个文件就一直添加*/
}


在void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)中添加下面的代码

	/*添加歌曲到列表中*/
        case ID_MENUADD:
		{
			AddFile(hwnd);
		}
        break;

		/*添加歌曲到播放列表中*/
		case IDC_ADD:
		{
			AddFile(hwnd);
		}
		break;


运行效果




删除列表中的歌曲,删除列表中的歌曲主要使用ListBox_DeleteString函数

ListBox_DeleteString有两个参数

int ListBox_DeleteString(
  HWND hwndCtl,
  int index
);

一个是ListBox控件的句柄,一个是删除的歌曲的索引

在删除歌曲中需要定义一个函数void DeleteMusic(HWND hwnd)用于删除选定的歌曲

/*************************************************************************
                函数名:   void DeleteMusic(HWND hwnd)
				函数功能: 删除选定的歌曲
**************************************************************************/
void DeleteMusic(HWND hwnd)
{
	GetMusic(hwnd);//选定歌曲

	//得到ListBox控件的句柄
	HWND hwndList = GetDlgItem(hwnd,IDC_LIST1);

	//得到选择的歌曲的序号
	int CurSel = ListBox_GetCurSel(hwndList);

	//下一曲
	JumpMusic(hwnd,1);

	//删除选定的歌曲
	ListBox_DeleteString(hwndList,CurSel);
}


在void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)中添加下面的代码

	//删除歌曲
		case IDC_DELETE:
		{
			DeleteMusic(hwnd);
		}
		break;

运行效果

删除"美丽的神话"

删除前



删除后


清空列表框中的歌曲,清空列表框中的歌曲和删除歌曲的方法类似,只是循环删除,直到列表框中没有歌曲

老规矩先定义一个函数用于清空播放列表

void DeleteList(HWND hwnd)函数用于清空列表框中的歌曲

/**************************************************************************
                 函数名:   void DeleteList(HWND hwnd)
				 函数功能: 清空播放列表
**************************************************************************/
void DeleteList(HWND hwnd)
{
	HWND hwndList = GetDlgItem(hwnd,IDC_LIST1);

	//得到播放列表中歌曲的数量
	int Count = ListBox_GetCount(hwndList);

	for(int i=Count-1;i>=0;i--)
	{
		ListBox_DeleteString(hwndList,i);
	}


在void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)中添加下面的代码

	//清空播放列表
		case IDC_DELETE_LIST:
		{
			DeleteList(hwnd);
		}
		break;

测试音乐播放器

执行清空列表前



清空播放列表后



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值