浅谈音乐播放器的制作心得

看杨中科老师的《C语言也能干大事》也有一段时间了,自己也跟着里面的讲解也做过一些东西,今天重点讲一下我认为我目前做的比较满意的一个项目音乐播放器.

其实我的音乐播放器在看了《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);
}


 下载音乐播放器

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
浅谈蒙台梭利语言教具的制作 浅谈蒙台梭利语言教具的制作 摘要: 幼儿期是语言发展的关键时期,也是人的一生中语言发展最迅速的时期,在这一时期内,幼儿通过视觉、听觉等感官来感受外界所带来的信息,来进行语言的积累及学习,正如蒙台梭利博士所说:“语言是儿童最早获得能力之一。”那么,在我们的蒙台梭利教室内,该如何通过教具的操作与展示使幼儿获得语言的自主学习呢,主要的来源就是延伸教具的制作与操作。 关键词:蒙台梭利语言教育 敏感期 教具制作 幼儿期是语言发展的关键时期,也是人的一生中语言发展最迅速的时期,在这一时期内,幼儿通过视觉、听觉等感官来感受外界所带来的信息,来进行语言的积累及学习,正如蒙台梭利博士所说:“语言是儿童最早获得能力之一。”那么,在我们的蒙台梭利教室内,该如何通过教具的操作与展示使幼儿获得语言的自主学习呢,主要的来源就是延伸教具的制作与操作。就目前的蒙台梭利教育而言,蒙台梭利教室的语言教具的投放一直是一个可挖掘的盲点,我们的蒙台梭利教师望“语言”而止步,使蒙台梭利教室内经典的语言教育,没有真正意义上的发挥其作用。蒙台梭利博士认为:幼儿语言上的缺陷和不完善,一是由于先天原因造成的生理缺陷;二是由于后天原因造成的功能性缺陷,即在幼儿的语言形成期,因为听不到正确的发音、完整的语言,或是由不好的(错误的)发音习惯造成的言语缺陷。针对两方面的原因,作为蒙台梭利教师,除了要

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值