我想学会用slider控件,显示音乐播放器的进程,如题,就是我想播放音乐的时候,然后当它播放的时候,那个油条就跟着我走,直到这首歌播放完。
还有音乐播放的循环,随机循环的,全部循环的那些谢谢求各位前辈们的提示谢谢谢谢谢谢谢谢谢谢谢谢谢谢

解决方案 »

  1.   

    直接用media player 控件开发,简单有效
      

  2.   

    unsigned long CPlayerDlg::getmusictime(CString s) //获取音乐的播放时间
    {        unsigned long m_dLength;
            int m_wDeviceID;
         //   char buf[128];
            MCI_OPEN_PARMS mciOpen;        MCI_STATUS_PARMS mciStatusParms;
            MCIERROR mciError; 
            mciOpen.lpstrElementName=(LPCTSTR)s;//取得文件名
            mciError=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpen);//打开文件
    m_wDeviceID=mciOpen.wDeviceID;
       
           mciStatusParms.dwItem=MCI_STATUS_LENGTH;
           mciSendCommand(MCI_ALL_DEVICE_ID,MCI_STATUS,MCI_WAIT|MCI_STATUS_ITEM,(DWORD)(LPVOID)&mciStatusParms);//关键,取得长度
           m_dLength=mciStatusParms.dwReturn;
       //  mciSendCommand(m_wDeviceID,MCI_CLOSE,0,NULL);//关闭文件
       MusicLength=m_dLength;
           return m_dLength;
    }
    //===================================================================
          CSliderCtrl* CSDC=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1); //进度条      CSDC->SetPos((CSDC->GetPos())+1);
    //=======================================================================
    //音乐播放的循环,随机循环的,全部循环
    加一个菜单,可以设置播放模式,如用一个整数区分,,放完一首之后,检查播放模式,
      

  3.   

    用MCI来做的话,还是挺简单的、、
      

  4.   

    CSliderCtrl* CSDC=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1); //进度条
    这个是什么意思??
      

  5.   

    。。Slider控件 你肯定要设置 宽高 然后设置最大值 和最小值你只要取到歌曲的总时长 然后播放的时候 记录下时间 在Timer里去更新 Slider滑块的位置不就得了随机播放 就是从你的播放列表里 随便拿出一首歌播放啊列表循环 比如你有个列表1到5   就是你判断歌曲有没有播放到5 5一完 马上跳到1不就做完了
      

  6.   

    // BrowseDirDialog.cpp 
    ////////////////////////////////////////////////////////////////////// #include "stdafx.h"
    #include "MciPlay.h"#include < MMSystem.h >
    #include < Vfw.h >
    #include < shlobj.H >#pragma comment(lib, "winmm.lib")
    //#pragma comment(lib, "Vfw32.lib")#define AudioStereo 0
    #define AudioLeft 1
    #define AudioRight 2#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif/*
    //构造函数 
    CMciPlay::CMciPlay() 
    {
    } //析构函数 
    CMciPlay::~CMciPlay() 


    */WNDPROC OldProc;
    LRESULT CALLBACK MCIWindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
    /*'======================================================*\
    '根据文件名,确定设备
    \'=======================================================*/
    LPSTR CMciPlay::GetDriverID(LPSTR ff)
    {
    char aa[3];
    int i;
    char bb[3];
    int lenff=strlen(ff);
    for(i=0;i<3;i++)
    {
    aa[i]=ff[lenff-3+i];
    if(aa[i]>=97||aa[i]<=122)aa[i]-=32;
    }
    aa[3]=0;
    strcpy(bb,"MID");
    if(strcmp(aa,bb)==0)return "Sequencer";
    strcpy(bb,"RMI");
    if(strcmp(aa,bb)==0)return "Sequencer";
    strcpy(bb,"IDI");
    if(strcmp(aa,bb)==0)return "Sequencer";
    strcpy(bb,"WAV");
    if(strcmp(aa,bb)==0)return "Waveaudio";

    return "MPEGVideo";
    }
    //=======================================================
    //打开MCI设备,FILENAME为文件名,传值代表成功与否
    //=======================================================
    bool CMciPlay::OpenMusic(LPSTR FileName,HWND hWnd=NULL)
    {
    CloseMusic();
    CString ShortPathName,lpstrCommand;
    CString tmpStr=FileName; ShortPathName=ToShortPathName(FileName);
    // if(tmpStr.Left(7)=="http://")
    // ShortPathName=FileName;
    // else
    // GetShortPathName(FileName,ShortPathName.GetBuffer(0), 255);
    // MessageBox(NULL,ShortPathName.GetBuffer(0),"",MB_OK);

    char *DrvID=GetDriverID(ShortPathName.GetBuffer(0));
    lpstrCommand.Format("open %s type %s alias NOWMUSIC",ShortPathName.GetBuffer(0), DrvID);
    if(strcmp(DrvID,"MPEGVideo")>=0)
    {
    if(hWnd!=NULL)
    lpstrCommand.Format("open %s type %s alias NOWMUSIC parent %d  style child",ShortPathName.GetBuffer(0), DrvID,(int)hWnd);
    else
    lpstrCommand+=" style overlapped ";
    }
    if( mciSendString(lpstrCommand.GetBuffer(0),NULL,0,0)==0 )
    {
    OldProc=(WNDPROC)GetWindowLong(GetWindowHandle(),GWL_WNDPROC);
    //MCIWindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
    SetWindowLong( GetWindowHandle(),GWL_WNDPROC,(long)MCIWindowProc );
    return true;
    } return false;
    }
    //=======================================================
    //关闭MCI设备,FILENAME为文件名,传值代表成功与否
    //=======================================================
    bool CMciPlay::CloseMusic()
    {
    if( mciSendString("close NOWMUSIC",NULL, 0,0)==0 )
    return true;
    else
    return false;
    }
    //'======================================================
    //'播放文件
    //'======================================================
    bool CMciPlay::PlayMusic()
    {
    //MCIERROR  WINAPI mciSendString(LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback);
    if(mciSendString("play NOWMUSIC", NULL, 0, 0)==0)
    return true;
    else
    return false;
    }
    //'======================================================
    //'获取媒体的长度
    //'======================================================
    long CMciPlay::GetMusicLength()
    {
    char RefStr[80];
    mciSendString("status NOWMUSIC length", RefStr, 80, 0);
    return atol(RefStr);
    }
    //'======================================================
    //'添充画面
    //'======================================================
    bool CMciPlay::PutToWindow(RECT rc)
    {
    CString lpstrCommand;
    lpstrCommand.Format("put NOWMUSIC window at %d %d %d %d",rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top);
    if(mciSendString(lpstrCommand.GetBuffer(0),NULL,0,0)==0)
    return true;
    else
    return false;
    }
    //'======================================================
    //'获取当前播放进度
    //'======================================================
    long CMciPlay::GetMusicPos()
    {
    char RefStr[80];
    mciSendString("status NOWMUSIC position", RefStr, 80, 0);
    return atol(RefStr);
    }
    //'======================================================
    //'设置媒体的当前进度
    //'======================================================
    bool CMciPlay::SetMusicPos(long Position)
    {
    CString lpstrCommand;
    lpstrCommand.Format("seek NOWMUSIC to %d",Position);
    if(mciSendString(lpstrCommand.GetBuffer(0),NULL,0,0)==0)
    return true;
    else
    return false;
    }
    //'======================================================
    //'暂停播放
    //'======================================================
    bool CMciPlay::PauseMusic()
    {
    if(mciSendString("pause NOWMUSIC", NULL, 0, 0)==0)
    return true;
    else
    return false;
    }
    //'======================================================
    //'设置声道
    //'======================================================
    bool CMciPlay::SetAudioSource(int AudioSource)
    {
    CString lpstrCommand;
    lpstrCommand="setaudio  NOWMUSIC source to ";
    switch(AudioSource)
    {
    case AudioStereo: lpstrCommand+="stereo";
    break;
    case AudioLeft:   lpstrCommand+="left";
    break;
    case AudioRight:  lpstrCommand+="right";
    break;
    }
    if(mciSendString(lpstrCommand.GetBuffer(0),NULL,0,0)==0)
    return true;
    else
    return false;
    }
    //'======================================================
    //'全屏播放
    //'======================================================
    bool CMciPlay::PlayFullScreen()
    {
    if(mciSendString("play NOWMUSIC fullscreen", NULL, 0, 0)==0)
    return true;
    else
    return false;
    }
    //'=====================================================
    //'设置声音大小1-1000
    //'=====================================================
    bool CMciPlay::SetVolume(int Volume)
    {
    CString lpstrCommand;
    lpstrCommand.Format("setaudio NOWMUSIC volume to %d",Volume);
    if(mciSendString(lpstrCommand.GetBuffer(0),NULL,0,0)==0)
    return true;
    else
    return false;
    }
    //'=====================================================
    //'设置播放速度1-2000
    //'=====================================================
    bool CMciPlay::SetSpeed(int Speed)
    {
    CString lpstrCommand;
    lpstrCommand.Format("set NOWMUSIC speed %d",Speed);
    if(mciSendString(lpstrCommand.GetBuffer(0),NULL,0,0)==0)
    return true;
    else
    return false;
    }
    //'====================================================
    //'静音True为静音,FALSE为取消静音
    //'====================================================
    bool CMciPlay::SetAudioOnOff(bool AudioOff)
    {
    if(AudioOff)
    {
    if(mciSendString("setaudio NOWMUSIC off",NULL,0,0)==0)
    return true;
    }
    else
    {
    if(mciSendString("setaudio NOWMUSIC on",NULL,0,0)==0)
    return true;
    }
    return false;
    }
    //'====================================================
    //'是否有画面True为有,FALSE为取消
    //'====================================================
    bool CMciPlay::SetWindowShow(bool WindowOff)
    {
    if(WindowOff)
    {
    if(mciSendString("window NOWMUSIC  state show",NULL,0,0)==0)
    return true;
    }
    else
    {
    if(mciSendString("window NOWMUSIC  state hide",NULL,0,0)==0)
    return true;
    }
    return false;
    }
    //'====================================================
    //'获得当前媒体的状态是不是在播放
    //'====================================================
    bool CMciPlay::IsPlaying()
    {
    // char RefStr[10];
    CString RefStr;
    if(mciSendString("status NOWMUSIC mode",RefStr.GetBuffer(10), 10, 0)==0)
    {
    if(RefStr.Find("playing")>=0||RefStr.Find("播放")>=0)
    return true;
    }
    return false;
    }
    //'====================================================
    //'获得播放窗口的handle
    //'====================================================
    HWND CMciPlay::GetWindowHandle()
    {
    char RefStr[80];
    mciSendString("status NOWMUSIC window handle", RefStr, 80, 0);
    return (HWND)atol(RefStr);
    }
    //'====================================================
    //'获取DeviceID
    //'====================================================
    MCIDEVICEID GetDeviceID()
    {
    return mciGetDeviceID("NOWMUSIC");
    }
    //'====================================================
    //'处理窗口事件
    //'====================================================
    LRESULT CALLBACK MCIWindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
     
    // HDC hdc;
    int wmId;
    switch (message)
    {
    case WM_COMMAND: wmId    = LOWORD(wParam); 
    //   MessageBox(NULL,"OK","sd",MB_OK);
       /*switch(wmId)
       {
       default:
        break;
       }//*/
    break;
    case WM_LBUTTONUP:return 0;
    break;
    case WM_RBUTTONUP:POINT  pt;
    GetCursorPos(&pt);
    break;
    case WM_PAINT:  break;
    default:break;
    }
    return CallWindowProc(OldProc,hWnd,message,wParam,lParam);
    }
    //用来将长路径名转化为短路径名.
    CString CMciPlay::ToShortPathName(CString SLongPathName)
    {
    char strBuffer[_MAX_PATH];

    GetShortPathName(SLongPathName,strBuffer,_MAX_PATH);

    CString m_toDir(strBuffer);

    return m_toDir; 
    }
      

  7.   

    //#if !defined(AFX_BROWSEDIRDIALOG_H__296DDE5D_7B8A_4413_A768_72FC7ED78A2E__INCLUDED_)
    //#define AFX_BROWSEDIRDIALOG_H__296DDE5D_7B8A_4413_A768_72FC7ED78A2E__INCLUDED_#if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000
    // browseDirDialog.h : header file
    //#include < MMSystem.h >
    #include < Vfw.h >
    #include < shlobj.H >/////////////////////////////////////////////////////////////////////////////
    // CbrowseDirDialog dialogclass CMciPlay
    {
    public:
    CString ToShortPathName(CString SLongPathName);
    // WNDPROC OldProc;
    //CBrowseDirDialog();
    //virtual ~CBrowseDirDialog(); LPSTR GetDriverID(LPSTR ff);
    bool OpenMusic(LPSTR FileName,HWND hWnd);
    bool PlayMusic();
    long GetMusicLength();
    bool PutToWindow(RECT rc);
    long GetMusicPos();
    bool SetMusicPos(long Position);
    bool PauseMusic();
    bool CloseMusic();
    bool SetAudioSource(int AudioSource);
    bool PlayFullScreen();
    bool SetVolume(int Volume);
    bool SetSpeed(int Speed);
    bool SetAudioOnOff(bool AudioOff);
    bool SetWindowShow(bool WindowOff);
    bool IsPlaying();
    HWND GetWindowHandle();
    MCIDEVICEID GetDeviceID();
    // LRESULT CALLBACK MCIWindowProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
    bool ShowOpenSave(LPSTR FileName,bool OpenOrSave,HWND hWnd);
    bool SavePicture(LPSTR FileName,HWND hWnd);

    /* int DoBrowse();
    CString m_Path; //存放返回的路径信息
    CString m_InitDir; //初始显示的路径名,默认为桌面 
    CString m_SelDir; //打开对话框后,默认选中的目录名,缺省为根目录 
    CString m_Title; //设置对话框中浏览信息的标题,默认为"打开" 
    int m_ImageIndex;
    */
    }; 
    //#endif
      

  8.   

    上面可以照抄。这是一个控制的:void CMusicDlg::OnReleasedcaptureSliderPlay(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    // TODO: Add your control notification handler code here
    pMciPlay.PauseMusic ();
    pMciPlay.SetMusicPos( m_CtrlSliderPlay.GetPos() );
    pMciPlay.PlayMusic ();
    *pResult = 0;
    }
      

  9.   

    但是我不是想要抄你的,我想自己学会,再加上我又看不懂你的是什么意思又过了一天还是不会用滑块,5555......
    我给你看看我的代码,看下我为什么错了,滑块不动:
    #include "stdafx.h"
    #include <windows.h>
    #include <windowsx.h>
    #include "resource.h"
    #include "MainDlg.h"
    #include <commdlg.h>
    #include "mmsystem.h"
    #include <commctrl.h>
    #pragma   comment(lib, "Winmm.lib")//-----------------------------------
    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;
    }
    BOOL Main_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam)
    {
        return 0;
    }
    int playLength=0;
    long musicLength=0;
    void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
    {
    switch (idEvent)
    {
    case 2:
    {
    TCHAR strCurrTime[256];
    mciSendString("status music position",strCurrTime,255,NULL);
    playLength=atoi(strCurrTime)/1000; //获取当前播放时间

    HWND hSilderTime=GetDlgItem(hwnd,IDC_SLIDER);
    SendMessage(hSilderTime,TBM_SETPOS,TRUE,playLength);

    }
    break;
    }
    }
    void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
    {
       switch(id)
        {
            case IDC_ADD:
            {
    TCHAR music[]="c:\\3.mp3";//我故意把一首歌放在C盘的
    TCHAR cmp[256];
    wsprintf(cmp,"play %s",music);
    mciSendString(cmp,NULL,0,0); char sPosition[256];
    //得到播放文件的长度
    mciSendString("Status music length", sPosition, 255,0);
    musicLength=atol(sPosition);
    int AllTime=musicLength/1000;  //把毫秒转化为秒

    HWND hSliderTime=GetDlgItem(hwnd,IDC_SLIDER); //获取滑块的句柄
    //设置滑块的范围
    SendMessage(hSliderTime,TBM_SETRANGE,1,(LPARAM)MAKELONG(0, AllTime)); //每秒钟设置滑块显示时间进度,并且显示音乐当前播放的时间
    SetTimer(hwnd,2,1000,TimerProc); 
    }break;
    }
    }void Main_OnClose(HWND hwnd)
    {
        EndDialog(hwnd, 0);
    }
      

  10.   

    还有我貌似是用C来编程的,不是用C++来编的你的那些算不算是C++的??初学不久,它们我两个分得不是很清楚,是不是有了类和模板就叫做C++的??你的那些 CMusicDlg::OnReleasedcaptureSliderPlay(有两个冒号的是不是就是指那些里面的什么成员来的??是不是??
      

  11.   

    多打几个断点不就知道了~~是滑块控件的问题,还是你那个什么mci获取的值的问题,还是timer没跑到什么的。