目录
先祝大家新年快乐,在新的一年身体健康,万事如意。这个播放器我已经筹划很久了,技术等方面已经成熟,可以达到一般播放器的水平了,虽然还有一些功能没有实现{PS:这个日志是很早写的,现在已经实现全部功能,不过考虑到部分功能尚不成熟(有bug),暂时没有添加},请大家支持我……
简介:
软件全称:Music Never Sleep v5.0 新年贺岁版
软件制作:龚晓宇
发布时间:2012.1.22
操作平台:WinXP, Win7,Win8(在Win8开发者预览版里测试成功){其他系统应该也是可以的,不过没有测试}
宣传片(自己做的)
更新内容:
1.优化了界面
2.优化了按钮
3.优化了菜单
4.代码模块化
5.增加播放模式功能
6.增加了更换皮肤功能
7.增加上一曲、下一曲功能
8.降低了CPU和内存使用率
9.支持播放Windows Media Player可播放的各种音频&视频文件(看电影没问题了)
截图:
安装向导
界面(完整和迷你)
皮肤展示
播放视频
下载地址:
安装版(10.8MB,最新完整版):Music Never Sleep v5.0 安装程序.7z (安装密码:cgxymns)
皮肤包(1.77MB,个性皮肤随心换):Music Never Sleep v5.0 完整皮肤包.7z
后面的内容 — 播放器背后的故事(看看谁能坚持看完~~):
大家不要以为编一个小小的播放器很容易,其实要写很多代码的,本次首次公布源代码和工程设计。代码写的比较规范,注释也写了很多,才敢发出来^_^
#include "StdAfx.h"
#include <windows.h>
#include <windowsx.h>
#include "resource.h"
#include "MainDlg.h"
#include <mmsystem.h>
#include <commdlg.h> //打开文件 头文件
#include "shellapi.h" //访问网站 头文件
#include <commctrl.h>
#define WM_MYMESSAGE WM_USER+100
//定义全局变量
int pop; //判断是播放还是暂停,0为播放,1为暂停
int sos; //判断是静音还是恢复,0为静音,1为恢复
int window = 1; //判断是显示还是隐藏,0为显示,1为隐藏
int LongM1; //音乐当前长度(分)
int LongM2; //音乐总长度(分)
int LongS1; //音乐当前长度(秒)
int LongS2; //音乐总前长度(秒)
long Time3; //音乐当前长度(长整型)
long Time4; //音乐总长度(长整型)
//TCHAR menu[100]; //播放列表目录——关于读取播放列表(未测试成功)
TCHAR title[MAX_PATH]; //文件名
TCHAR Time1[MAX_PATH]; //音乐当前长度(字符)
TCHAR Time2[MAX_PATH]; //音乐总长度(字符)
TCHAR TimeName[MAX_PATH]; //文件目录+获取时间
TCHAR szFile[MAX_PATH]; //文件目录
TCHAR szFile2[MAX_PATH]; //文件目录2,用于判断
TCHAR shortPath[MAX_PATH]; //文件短目录
TCHAR PlayTime[MAX_PATH]; //播放时间
TCHAR szCommand[MAX_PATH + 10];//文件短目录+音量大小
TCHAR musicname[MAX_PATH + 10];//文件短目录+播放方式
FILE * fp = fopen("C:\\Program Files\\Music Never Sleep v4.0\\Music Menu.txt", "r+");
//函数声明
void CALLBACK Timer1(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime);
void CALLBACK Timer2(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime);
void TimePlay();
BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
HANDLE_MSG(hWnd, WM_INITDIALOG, Main_OnInitDialog);
HANDLE_MSG(hWnd, WM_COMMAND, Main_OnCommand);
HANDLE_MSG(hWnd,WM_CLOSE, Main_OnClose);
}
return FALSE;
}
//字体
HFONT hFont= CreateFont
(
23, //高度
23, //宽度
0, //旋转角度
0, //方向
0, //线条宽度
0, //斜体
0, //下划线
0, //加粗
DEFAULT_CHARSET, //字符集
OUT_DEFAULT_PRECIS, //精度
CLIP_DEFAULT_PRECIS,//剪裁方式
DEFAULT_QUALITY, //渲染质量
DEFAULT_PITCH, //字体族
"Webdings" //字体名
);
//窗口初始化
BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
{
//开始提示音
TCHAR up1[128];
TCHAR up2[128];
GetShortPathName("C:\\Program Files\\Music Never Sleep v4.0\\Up.mp3", up1, sizeof(up1));
wsprintf(up2, "play %s", up1);
mciSendString(up2, "", 0, NULL);
//加载皮肤
SkinH_Attach();
//托盘显示
HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
NOTIFYICONDATA nt;
nt.cbSize = sizeof(NOTIFYICONDATA);
nt.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
nt.hWnd = hwnd;
lstrcpy(nt.szTip,TEXT("Music Never Sleep v4.0"));//鼠标放在上面显示
nt.uCallbackMessage = WM_SIZE;
nt.uFlags = NIF_MESSAGE | NIF_TIP | NIF_ICON;
nt.uID = IDI_ICON1;
Shell_NotifyIcon(NIM_ADD,&nt);
//按钮图标
SendMessage(GetDlgItem(hwnd,IDC_OK1),WM_SETFONT,(WPARAM)hFont,0);
SendMessage(GetDlgItem(hwnd,IDC_LIST),WM_SETFONT,(WPARAM)hFont,0);
//读取播放列表(未测试成功)
/*fgets(menu, sizeof(menu), fp);
if (menu[0] != ' ')
{
HWND hwndList = GetDlgItem(hwnd, IDC_LIST1);
ListBox_InsertString(hwndList, -1, menu);
}
fclose(fp);*/
return TRUE;
}
//播放时间(当前) 定时器
void CALLBACK Timer1(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
wsprintf(TimeName, "status %s position", shortPath);
mciSendString(TimeName, Time1, MAX_PATH, 0);
Time3 = LongS1 = strtol(Time1, NULL, 10);
LongS1 = LongS1 / 1000;
LongM1 = LongS1 / 60;
LongS1 = LongS1 - (LongM1 * 60);
//滑块控件
HWND hwndSlider = GetDlgItem(hwnd, IDC_SLIDER1);
SendMessage(hwndSlider, TBM_SETRANGEMIN, (WPARAM)TRUE, 0); //设定最小值
SendMessage(hwndSlider, TBM_SETRANGEMAX, (WPARAM)TRUE, Time4); //设定最大值
SendMessage(hwndSlider, TBM_SETPOS, (WPARAM)TRUE, Time3); //设定当前的滚动值
/*if(LOWORD(wParam) == TB_THUMBPOSITION || LOWORD(WM_HSCROLL) == TB_LINEUP || LOWORD(WM_HSCROLL) == TB_LINEDOWN || LOWORD(WM_HSCROLL) == TB_PAGEDOWN || LOWORD(WM_HSCROLL) == TB_PAGEUP)
{
long Long = Time4 - (SendMessage(hwndSlider, TBM_GETPOS, 0, 0));
wsprintf(musicname,"seek %s to %ld", shortPath, Long, sizeof(shortPath));
mciSendString(musicname,"",0,NULL);
}*/
/*HWND hwnd1 = GetDlgItem(hwnd, IDC_PROGRESS1);
SendMessage(hwnd1, TBM_SETRANGEMIN, (WPARAM)TRUE, 0); //设定最小值
SendMessage(hwnd1, TBM_SETRANGEMAX, (WPARAM)TRUE, Time4); //设定最大值
SendMessage(hwnd1, TBM_SETPOS, (WPARAM)TRUE, Time3); */ //设定当前的滚动值
wsprintf(PlayTime, "%02d:%02d / %02d:%02d", LongM1, LongS1, LongM2, LongS2);
SetDlgItemText(hwnd, IDC_EDITTIME, PlayTime);
}
//播放时间(总)
void TimePlay()
{
wsprintf(TimeName, "status %s length", shortPath);
mciSendString(TimeName, Time2, MAX_PATH, 0);
Time4 = LongS2 = strtol(Time2, NULL, 10);
LongS2 = LongS2 / 1000;
for (int i=0; i<10; ++i)
{
if (LongS2 >= 60)
{
LongS2 = LongS2 - 60;
++LongM2;
}
}
}
//播放状态 定时器
void CALLBACK Timer2(HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
if (pop == 1)
{
SetDlgItemText(hwnd, IDC_STATE, "暂停");
}
else if (pop == 0)
{
SetDlgItemText(hwnd, IDC_STATE, "正在播放");
}
else
{
//SetDlgItemText(hwnd, IDC_STATE, "播放完毕");
//SetWindowText(GetDlgItem(hwnd,IDC_OK1),TEXT("4"));
}
}
void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
//播放时间 定时器
SetTimer(hwnd, 1, 1000, Timer1);
//播放状态 定时器
SetTimer(hwnd, 2, 100, Timer2);
HWND hwndList = GetDlgItem(hwnd, IDC_LIST1);
UINT MESSAGE_INPUT = codeNotify;
if (MESSAGE_INPUT == LBN_DBLCLK)
{
HWND hwndList = GetDlgItem(hwnd, IDC_LIST1);
int menu = ListBox_GetCurSel(hwndList);
ListBox_GetText(hwndList, menu, szFile);
wsprintf(musicname, "stop %s", shortPath);
mciSendString(musicname, "", 0, NULL);
SetWindowText(GetDlgItem(hwnd,IDC_OK1),TEXT(";"));
GetFileTitle(szFile, title, sizeof(title));
GetShortPathName(szFile, shortPath, sizeof(shortPath));
SetDlgItemText(hwnd, IDC_MUSIC, title);
wsprintf(musicname, "play %s", shortPath);
mciSendString(musicname, "", 0, NULL);
pop = 0;
}
switch(id)
{
//显示播放列表
case ID_MENUITEMSHOW:
case IDC_LIST:
{
if (window == 0)
{
MoveWindow(hwnd, 530, 280, 350, 250, true);
SetDlgItemText(hwnd, IDC_LIST, "5");
window = 1;
}
else
{
MoveWindow(hwnd, 530, 280, 350, 148, true);
SetDlgItemText(hwnd, IDC_LIST, "6");
window = 0;
}
}
break;
//播放主程序
case ID_MENUITEMPLAY:
case IDC_OK1: //播放&暂停
{
GetDlgItemText(hwnd, IDC_COMBO1, szFile, sizeof(szFile));
if (pop == 1) //继续
{
SetWindowText(GetDlgItem(hwnd,IDC_OK1),TEXT(";"));
GetDlgItemText(hwnd, IDC_COMBO1, szFile, sizeof(szFile));
GetShortPathName(szFile, shortPath, sizeof(shortPath));
wsprintf(musicname, "play %s fullscreen", shortPath);
mciSendString(musicname, "", 0, NULL);
pop = 0;
wsprintf(szFile2, "%s", szFile);
}
else if (pop == 0) //暂停
{
SetWindowText(GetDlgItem(hwnd,IDC_OK1),TEXT("4"));
GetDlgItemText(hwnd, IDC_COMBO1, szFile, sizeof(szFile));
GetShortPathName(szFile, shortPath, sizeof(shortPath));
wsprintf(musicname, "pause %s", shortPath);
mciSendString(musicname, "", 0, NULL);
pop = 1;
}
else
{
SetWindowText(GetDlgItem(hwnd,IDC_OK1),TEXT(";"));
wsprintf(musicname, "play %s", shortPath);
mciSendString(musicname, "", 0, NULL);
pop = 0;
}
}
break;
//文件菜单
case IDC_ADD:
case ID_MENUITEM40002: //打开
{
OPENFILENAME ofn;
ZeroMemory(&ofn,sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = TEXT('\0');
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = TEXT("MP3\0*.mp3*\0WMV\0*.wmv\0");
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.hwndOwner = hwnd;
ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn))
{
if (szFile[0] != ' ')
{
wsprintf(musicname, "stop %s", shortPath);
mciSendString(musicname, "", 0, NULL);
SetWindowText(GetDlgItem(hwnd,IDC_OK1),TEXT(";"));
GetFileTitle(szFile, title, sizeof(title));
GetShortPathName(szFile, shortPath, sizeof(shortPath));
wsprintf(musicname, "play %s", shortPath);
mciSendString(musicname, "", 0, NULL);
SetDlgItemText(hwnd, IDC_MUSIC, title);
ListBox_InsertString(hwndList, -1, szFile);
LongM1 = LongM2 = LongS1 = LongS2 = pop = sos = 0;
TimePlay();
}
}
}
break;
case ID_MENUITEMS: //保存播放列表
{
FILE * fp = fopen("C:\\Program Files\\Music Never Sleep v4.0\\Music Menu.txt", "r+");
TCHAR s[300];
int num1 = ListBox_GetCount(hwndList);
for (int i=0; i<num1; ++i)
{
ListBox_GetText (hwndList, i, s);
fprintf(fp, "%s\n", s);
}
fclose(fp);
}
break;
case ID_MENUITEMD: //清空播放列表
{
int num2 = ListBox_GetCount(hwndList);
for (int j=0; j<=num2; ++j)
{
ListBox_DeleteString(hwndList, 0);
}
}
break;
case ID_MENUITEM40004: //退出
{
exit(0);
}
break;
//选项菜单
//音量
case ID_MENUITEM40008: //高
{
GetDlgItemText(hwnd, IDC_COMBO1, szFile, sizeof(szFile));
GetShortPathName(szFile, shortPath, sizeof(shortPath));
int iVolNum1 = 1000;
wsprintf(szCommand, TEXT("setaudio %s volume to %d"), shortPath, iVolNum1);
mciSendString(szCommand, NULL, 0, NULL);
}
break;
case ID_MENUITEM40009: //中
{
GetDlgItemText(hwnd, IDC_COMBO1, szFile, sizeof(szFile));
GetShortPathName(szFile, shortPath, sizeof(shortPath));
int iVolNum2 = 500;
wsprintf(szCommand, "setaudio %s volume to %d", shortPath, iVolNum2);
mciSendString(szCommand, NULL, 0, NULL);
}
break;
case ID_MENUITEM40010: //低
{
GetDlgItemText(hwnd, IDC_COMBO1, szFile, sizeof(szFile));
GetShortPathName(szFile, shortPath, sizeof(shortPath));
int iVolNum3 = 200;
wsprintf(szCommand, "setaudio %s volume to %d", shortPath, iVolNum3);
mciSendString(szCommand, NULL, 0, NULL);
}
break;
case ID_MENUITEM40011: //静音&恢复
{
if (sos == 0) //静音
{
GetDlgItemText(hwnd, IDC_COMBO1, szFile, sizeof(szFile));
GetShortPathName(szFile, shortPath, sizeof(shortPath));
wsprintf(szCommand, "setaudio %s off", shortPath);
mciSendString(szCommand, NULL, 0, NULL);
sos = 1;
}
else //恢复
{
GetDlgItemText(hwnd, IDC_COMBO1, szFile, sizeof(szFile));
GetShortPathName(szFile, shortPath, sizeof(shortPath));
wsprintf(szCommand, TEXT("setaudio %s on"), shortPath);
mciSendString(szCommand, NULL, 0, NULL);
sos = 0;
}
}
break;
//窗口
case ID_MENUITEMDOUDONG://抖动窗口
{
TCHAR shake1[256];
TCHAR shake2[256];
GetShortPathName("C:\\Program Files\\Music Never Sleep v4.0\\shake.mp3", shake1, sizeof(shake1)); //抖动窗口提示音
wsprintf(shake2, "play %s", shake1);
mciSendString(shake2, "", 0, NULL);
int i, x, y, j, k;
x = 530; //窗口在桌面的横坐标
y = 280; //窗口在桌面的纵坐标
j = 25; //抖动间隔
k = 3; //抖动幅度
if (window == 0)
{
for(i=0;i<=5;i++)
{
MoveWindow(hwnd, x+k, y-k, 350, 148, true);
Sleep(j);
MoveWindow(hwnd, x-k, y-k, 350, 148, true);
Sleep(j);
MoveWindow(hwnd, x-k, y+k, 350, 148, true);
Sleep(j);
MoveWindow(hwnd, x+k, y+k, 350, 148, true);
Sleep(j);
MoveWindow(hwnd, x, y, 350, 148, true);
Sleep(j);
}
}
else
{
for(i=0;i<=5;i++)
{
MoveWindow(hwnd, x+k, y-k, 350, 250, true);
Sleep(j);
MoveWindow(hwnd, x-k, y-k, 350, 250, true);
Sleep(j);
MoveWindow(hwnd, x-k, y+k, 350, 250, true);
Sleep(j);
MoveWindow(hwnd, x+k, y+k, 350, 250, true);
Sleep(j);
MoveWindow(hwnd, x, y, 350, 250, true);
Sleep(j);
}
}
}
break;
//其他菜单
case ID_MENUITEM40001: //关于
{
HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
DialogBox(hInstance, MAKEINTRESOURCE(IDD_ABOUT), NULL, Main_Proc);
}
break;
case ID_MENUITEM40005: //帮助
{
HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
DialogBox(hInstance, MAKEINTRESOURCE(IDD_HELP), NULL, Main_Proc);
}
break;
case ID_MENUITEMMORE: //正版音乐库
{
ShellExecute(hwnd,"open","http://music.qq.com/portal_v2/static/list/singerlist_7.html",NULL,NULL,SW_SHOWNORMAL);
}
break;
case IDC_DELETE:
{
HWND hwndList = GetDlgItem(hwnd, IDC_LIST1);
int menu = ListBox_GetCurSel(hwndList);
ListBox_DeleteString(hwndList, menu);
}
//break;
/*case ID_MENUITEMMIN: //最小化到托盘(有bug——不可还原)
{
ShowWindow(hwnd,SW_HIDE);
HINSTANCE hInstance = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
NOTIFYICONDATA nt;
nt.cbSize = sizeof(NOTIFYICONDATA);
nt.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
nt.hWnd = hwnd;
lstrcpy(nt.szTip,TEXT("Music Never Sleep v4.0"));//鼠标放在上面显示
nt.uCallbackMessage = WM_SIZE;
nt.uFlags = NIF_MESSAGE | NIF_TIP | NIF_ICON;
nt.uID = IDI_ICON1;
Shell_NotifyIcon(NIM_ADD,&nt);
}
break;
case WM_MYMESSAGE:
{
NOTIFYICONDATA nt;
ShowWindow(hwnd,SW_SHOWNORMAL);
Shell_NotifyIcon(NIM_DELETE,&nt);
SetForegroundWindow(hwnd);
}*/
default:
break;
}
}
窗口设计
图标设计
怎么样,觉得好的话就评论一下或者点一下左下角的赞,谢谢……
版权属于:microyu (除特别说明外)
本文链接:https://blog.microyu.top/archives/149/
版权声明:本博客文章采用CC BY-NC-SA 4.0进行许可,请在转载时注明出处及本声明!