目录

先祝大家新年快乐,在新的一年身体健康,万事如意。这个播放器我已经筹划很久了,技术等方面已经成熟,可以达到一般播放器的水平了,虽然还有一些功能没有实现{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可播放的各种音频&视频文件(看电影没问题了)

截图:

安装向导

自编播放器 — Music Never Sleep v5.0 新年贺岁版

界面(完整和迷你)

自编播放器 — Music Never Sleep v5.0 新年贺岁版

皮肤展示

自编播放器 — Music Never Sleep v5.0 新年贺岁版

播放视频

自编播放器 — Music Never Sleep v5.0 新年贺岁版
自编播放器 — Music Never Sleep v5.0 新年贺岁版
自编播放器 — Music Never Sleep v5.0 新年贺岁版
自编播放器 — Music Never Sleep v5.0 新年贺岁版

下载地址:

安装版(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;
    }
}

窗口设计

自编播放器 — Music Never Sleep v5.0 新年贺岁版
自编播放器 — Music Never Sleep v5.0 新年贺岁版
自编播放器 — Music Never Sleep v5.0 新年贺岁版
自编播放器 — Music Never Sleep v5.0 新年贺岁版

图标设计

自编播放器 — Music Never Sleep v5.0 新年贺岁版

怎么样,觉得好的话就评论一下或者点一下左下角的赞,谢谢……

©著作权归作者所有

发表评论