简单MP3播放器

 MP3Function.asm(MP3函数模块):

include        winmm.inc
includelib    winmm.lib
include        masm32.inc
includelib    masm32.lib

        .
const
nOpenState            equ    
1
nPlayState            equ    
2
nPauseState            equ    
3
nStopState            equ    
4
nCloseState            equ    
5
nLengthState        equ    
6
nPositionState        equ    
7
nModeState            equ    
8

        .data
szMP3Tip                db        
" MP3_Function " , 0
szPlayState            db        
" playing " , 0
szPauseState        db        
" paused " , 0
szStopState            db        
" stopped " , 0
szMP3TimeFmt        db        
" %d:%02d " , 0

;MCI格式命令
szCmdOpenFmt        db        
" open  "" %s """ , 0
szCmdPlayFmt        db        
" play  "" %s """ , 0  
szCmdPlay2Fmt        db        
" play  "" %s ""  from %d to %d " , 0  ;play 文件名 from 开始时间 to 结束时间
szCmdPauseFmt        db        
" pause  "" %s """ , 0
szCmdStopFmt        db        
" stop  "" %s """ , 0
szCmdCloseFmt        db        
" Close  "" %s """ , 0
szCmdLengthFmt        db        
" status  "" %s ""  length " , 0       ;获取歌曲总长度
szCmdPositionFmt    db        
" status  "" %s ""  Position " , 0     ;获取当前播放位置
szCmdModeFmt        db        
" status  "" %s ""  mode " , 0         ;获取当前播放状态
        .data
?
szMP3FileName        db        MAX_PATH        dup    (
? )
szCommand            db        
1024         dup    ( ? )
szReturn                db        
1024             dup    ( ? )
szError                db        
1024             dup    ( ? )
        .code
_CtrlMP3        proc    _nState
        local        @nError
        
        invoke    RtlZeroMemory,addr szCommand,
sizeof  szCommand
        invoke    RtlZeroMemory,addr szReturn,
sizeof  szReturn
        invoke    RtlZeroMemory,addr szError,
sizeof  szError
        
        .
if     _nState  ==  nOpenState
            invoke    wsprintf,addr szCommand,addr szCmdOpenFmt,addr szMP3FileName
        .elseif    _nState 
==  nPlayState
            invoke    wsprintf,addr szCommand,addr szCmdPlayFmt,addr szMP3FileName
        .elseif    _nState 
==  nPauseState
            invoke    wsprintf,addr szCommand,addr szCmdPauseFmt,addr szMP3FileName
        .elseif    _nState 
==  nStopState
            invoke    wsprintf,addr szCommand,addr szCmdStopFmt,addr szMP3FileName
        .elseif    _nState 
==  nCloseState
            invoke    wsprintf,addr szCommand,addr szCmdCloseFmt,addr szMP3FileName
        .elseif    _nState 
==  nLengthState
            invoke    wsprintf,addr szCommand,addr szCmdLengthFmt,addr szMP3FileName
        .elseif    _nState 
==  nPositionState
            invoke    wsprintf,addr szCommand,addr szCmdPositionFmt,addr szMP3FileName
        .elseif    _nState 
==  nModeState
            invoke    wsprintf,addr szCommand,addr szCmdModeFmt,addr szMP3FileName
        .
else
            ;错误的控制状态常量
        .endif
        
        invoke    mciSendString,addr szCommand,addr szReturn,
sizeof  szReturn,NULL
        mov        @nError,eax
        invoke    mciGetErrorString,@nError,addr szError,
sizeof  szError
        ret
_CtrlMP3        endp

_OpenMP3        proc    _lpFileName
        local        @nError
        
        movzx    eax,BYTE ptr szMP3FileName
        .
if     eax
            invoke    _CtrlMP3,nCloseState
        .endif
        
        invoke    RtlMoveMemory,addr szMP3FileName,_lpFileName,MAX_PATH
        invoke    _CtrlMP3,nOpenState
        ret
_OpenMP3        endp

_GetLengthMP3    proc
        local        @szRet[
1024 ]:BYTE
        
        invoke    _CtrlMP3,nLengthState
        invoke    lstrcpy,addr @szRet,addr szReturn
        mov        @szRet[
8 ], 0
        invoke    atodw,addr @szRet
        ret
_GetLengthMP3    endp

_GetPositionMP3    proc
        local        @szRet[
1024 ]:BYTE
        
        invoke    _CtrlMP3,nPositionState
        invoke    lstrcpy,addr @szRet,addr szReturn
        mov        @szRet[
8 ], 0
        invoke    atodw,addr @szRet
        ret
_GetPositionMP3    endp

_GetModeMP3        proc
        local        @szRet[
1024 ]:BYTE
        local        @nRet
        
        mov        @nRet,
3
        
        invoke    _CtrlMP3,nModeState
        invoke    lstrcpy,addr @szRet,addr szReturn
        mov        @szRet[
8 ], 0
        
        invoke    lstrcmp,addr @szRet,addr szPlayState
        .
if     eax  ==   0
            mov    @nRet,
1     ;playing
        .endif
        
        invoke    lstrcmp,addr @szRet,addr szPauseState
        .
if     eax  ==   0
            mov    @nRet,
2     ;paused
        .endif
        
        invoke    lstrcmp,addr @szRet,addr szStopState
        .
if     eax  ==   0
            mov    @nRet,
3     ;stopped
        .endif
        
        mov    eax,@nRet
        ret
_GetModeMP3        endp

_Play2MP3    proc    _nFrom,_nTo
        local        @nError
        
        invoke    RtlZeroMemory,addr szCommand,
sizeof  szCommand
        invoke    RtlZeroMemory,addr szReturn,
sizeof  szReturn
        invoke    RtlZeroMemory,addr szError,
sizeof  szError
        
        invoke    wsprintf,addr szCommand,addr szCmdPlay2Fmt,addr szMP3FileName,_nFrom,_nTo
        invoke    mciSendString,addr szCommand,addr szReturn,
sizeof  szReturn,NULL
        mov        @nError,eax
        invoke    mciGetErrorString,@nError,addr szError,
sizeof  szError
        ret
_Play2MP3    endp

_PlayMP3        proc
        invoke    _CtrlMP3,nPlayState
        ret
_PlayMP3        endp

_PauseMP3    proc
        invoke    _CtrlMP3,nPauseState
        ret
_PauseMP3    endp

_StopMP3        proc
        invoke    _CtrlMP3,nStopState
        ret
_StopMP3        endp

_CloseMP3    proc
        invoke    _GetModeMP3
        .
if     eax  !=   3     ;stopped
            invoke    _StopMP3
        .endif
        invoke    _CtrlMP3,nCloseState
        
        invoke    RtlZeroMemory,addr szMP3FileName,
sizeof  szMP3FileName
        ret
_CloseMP3    endp

_GetErrorMP3    proc
        invoke    MessageBox,NULL,addr szError,addr szMP3Tip,MB_OK
        ret
_GetErrorMP3    endp

_GetReturnMP3    proc
        invoke    MessageBox,NULL,addr szReturn,addr szMP3Tip,MB_OK
        ret
_GetReturnMP3    endp

_GetCommandMP3        proc
        invoke    MessageBox,NULL,addr szCommand,addr szMP3Tip,MB_OK
        ret
_GetCommandMP3        endp

;向后跳跃(快退)
_BackMP3        proc    uses edx
        local        @nFrom,@nTo,@temp
        
        invoke    _GetPositionMP3
        mov        @nFrom,eax
        
        invoke    _GetLengthMP3
        mov        @nTo,eax
        
        mov        @temp,
10
        mov        eax,@nTo    
        xor        edx,edx     
        div        @temp       ;EDX:EAX
/ SRC = EAX余EDX
        
        .
if     @nFrom  <  eax
            mov @nFrom,
0
        .
else
            sub @nFrom,eax
        .endif
        
        invoke    _Play2MP3,@nFrom,@nTo
        ret
_BackMP3        endp

;向前跳跃(快进)
_PrewMP3        proc    uses edx
        local        @nFrom,@nTo,@temp
        
        invoke    _GetPositionMP3
        mov        @nFrom,eax
        
        invoke    _GetLengthMP3
        mov        @nTo,eax
        
        mov        @temp,
10     
        mov        eax,@nTo    
        xor        edx,edx     
        div        @temp       ;EDX:EAX
/ SRC = EAX余EDX
        
        add        @nFrom,eax
        
        mov        eax,@nFrom
        .
if     eax  >  @nTo
            push    @nTo
            pop    @nFrom
        .endif
        
        invoke    _Play2MP3,@nFrom,@nTo
        ret
_PrewMP3        endp

_Time2StrMP3    proc    _dwTime,_lpBuffer,_dwMaxBuffer
        local        @szBuf[
128 ]:BYTE
        local        @Min,@Sec
        
        mov        eax,_dwTime
        xor        edx,edx
        mov        ecx,
60 * 1000
        div        ecx    ;EDX:EAX
/ SRC = EAX余EDX
        mov        @Min,eax
        
        mov        eax,edx
        xor        edx,edx
        mov        ecx,
1000
        div        ecx    ;EDX:EAX
/ SRC = EAX余EDX
        mov        @Sec,eax
        
        invoke    wsprintf,addr @szBuf,addr szMP3TimeFmt,@Min,@Sec
        invoke    RtlMoveMemory,_lpBuffer,addr @szBuf,_dwMaxBuffer
        ret
_Time2StrMP3    endp

_GetLength2StrMp3        proc    _lpBuffer,_dwMaxBuffer
        invoke    _GetLengthMP3
        invoke    _Time2StrMP3,eax,_lpBuffer,_dwMaxBuffer
        ret
_GetLength2StrMp3        endp

_GetPosition2StrMP3        proc    _lpBuffer,_dwMaxBuffer
        invoke    _GetPositionMP3
        invoke    _Time2StrMP3,eax,_lpBuffer,_dwMaxBuffer
        ret
_GetPosition2StrMP3        endp

 

; >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .
386
        .model flat, stdcall
        option casemap :none
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
include        comctl32.inc
includelib    comctl32.lib
include     comdlg32.inc
includelib  comdlg32.lib
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .
const
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN                equ        
1   ;主窗口图标ID
DLG_MAIN                equ        
1   ;主窗口ID
IDC_SLIDER            equ        
1   ;
IDC_APPEND            equ        
2   ;添加按钮ID
IDC_PLAY                equ        
3   ;播放按钮ID
IDC_PAUSE            equ        
4   ;暂停按钮ID
IDC_STOP                equ        
5   ;停止按钮ID
IDC_AFTER            equ        
6   ;上一首按钮ID
IDC_NEXT                equ        
7   ;下一首按钮ID
IDC_BACK                equ        
8   ;快退按钮ID
IDC_PREV                equ        
9   ;快进按钮ID
IDC_LIST_SNL        equ        
10   ;歌曲列表框ID
IDC_LIST_SPL        equ        
11   ;歌曲列表框(全路径文件名)ID
IDC_PLAN                equ        
12   ;进度Group框ID
IDC_PROGRESS        equ        
13   ;进度条ID
ID_TIMER                equ        
1   ;时钟ID,500ms
OF_MAX_PATH            equ        MAX_PATH
* 50   ;设置打开文件对话框最多可以允许选择50个MAX_PATH长文件名的文件
        .data
szTmp_stOF_Filter                db            
" Mp3 Files(*.mp3) " , 0 , " *.mp3 " , 0 , " All Files(*.*) " , 0 , " *.* " , 0 , 0
szININame                        db            
" Player.ini " , 0
szSNL_Section                    db            
" Sound Name List " , 0
szSPL_Section                    db            
" Sound Path List " , 0
szKeyFmt                            db            
" No%02d " , 0
szTimeFmt                        db            
" 进度 %s[%s] " , 0
szTime1Fmt                        db            
" 进度 0:00[0:00] " , 0
szFileFmt                        db            
" %s%s " , 0
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data
?
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
hInstance                        dd            
?
hWinMain                            dd            
?
hList_SNL                        dd            
?
hList_SPL                        dd            
?
szFullININame                    db            MAX_PATH        dup    (
? )
szTmp_stOF_lpstrFile            db            OF_MAX_PATH        dup    (
? )
szTmp_stOF_lpstrFileTitle    db            MAX_PATH            dup    (
? )
bPlaying                            dd            
?   ;播放状态标志
dwListCount                        dd            
?   ;歌曲列表总数
dwCurrentIndex                    dd            
?     ;当前播放歌曲列表索引号
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code        
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        _MyFunc.asm
include        MP3Function.asm

_Play_Click        proc
        local        @szBuffer[MAX_PATH]:BYTE
        
        invoke    _GetModeMP3
        .
if     eax  ==   1   ;playing
            invoke    _StopMP3
        .elseif    eax 
==   2   ;paused
            invoke    _PlayMP3
            mov        bPlaying,TRUE
            ret
        .elseif    eax 
==   3   ;stopped
            
        .endif
        invoke    _CloseMP3
        invoke    SendMessage,hList_SNL,LB_GETCURSEL,
0 , 0
        mov        dwCurrentIndex,eax
        invoke    SendMessage,hList_SPL,LB_GETTEXT,dwCurrentIndex,addr @szBuffer
        invoke    _OpenMP3,addr @szBuffer
        ;设置跟踪条范围
        invoke    _GetLengthMP3
        invoke    SendDlgItemMessage,hWinMain,IDC_PROGRESS,PBM_SETRANGE32,
0 ,eax
        ;设置跟踪条起始位置
        invoke    _PlayMP3
        mov        bPlaying,TRUE
        ret
_Play_Click  endp

_Next_Click proc
        invoke SendMessage,hList_SPL,LB_GETCOUNT,
0 , 0
          dec eax
          .
if  dwCurrentIndex  >=  eax
              mov    dwCurrentIndex,
0
          .
else
               inc    dwCurrentIndex
          .endif
          invoke SendMessage,hList_SNL,LB_SETCURSEL,dwCurrentIndex,
0
          invoke _Play_Click
        ret
_Next_Click endp

_TimerProc    proc    uses ecx edx _hwnd,_uMsg,_idEvent,_dwTime
        local        @szBuf[
128 ]:BYTE
        local        @szBuf1[
128 ]:BYTE
        local        @szBuf2[
128 ]:BYTE
        local        @nLength,@nPosition
        
        .
if     bPlaying
            invoke    _GetLengthMP3
            mov        @nLength,eax
            invoke    _GetPositionMP3
            mov        @nPosition,eax
        
            ;设置状态条位置
            invoke    SendDlgItemMessage,hWinMain,IDC_PROGRESS,PBM_SETPOS,@nPosition,
0
            
            invoke    _GetLength2StrMp3,addr @szBuf1,
sizeof  @szBuf1
            invoke    _GetPosition2StrMP3,addr @szBuf2,
sizeof  @szBuf2
            invoke    wsprintf,addr @szBuf,addr szTimeFmt,addr @szBuf1,addr @szBuf2
            invoke    SendDlgItemMessage,hWinMain,IDC_PLAN,WM_SETTEXT,
0 ,addr @szBuf
            
            mov        eax,@nPosition
            .
if     eax  ==  @nLength
                invoke    _CloseMP3
                invoke    _Next_Click
            .endif
        .endif
        ret
_TimerProc    endp

_LoadList    proc    uses esi ecx
        local        @szBuf1[OF_MAX_PATH]:BYTE
        local        @szBuf2[MAX_PATH]:BYTE
        local        @Temp
        
        invoke    SendMessage,hList_SNL,LB_RESETCONTENT,
0 , 0   ;清空播放列表框
        invoke    SendMessage,hList_SPL,LB_RESETCONTENT,
0 , 0   ;清空播放列表框
        invoke    RtlZeroMemory,addr @szBuf1,
sizeof  @szBuf1
        invoke    GetPrivateProfileString,addr szSNL_Section,NULL,NULL,addr @szBuf1,
sizeof  @szBuf1,addr szFullININame
        lea        esi,@szBuf1
        .
while     BYTE ptr [esi]
            invoke    RtlZeroMemory,addr @szBuf2,MAX_PATH
            invoke    GetPrivateProfileString,addr szSNL_Section,esi,NULL,addr @szBuf2,MAX_PATH,addr szFullININame
            invoke    SendMessage,hList_SNL,LB_ADDSTRING,
0 ,addr @szBuf2
            invoke    lstrlen,esi
            add        esi,eax
            inc        esi
        .endw
        
        invoke    RtlZeroMemory,addr @szBuf1,
sizeof  @szBuf1
        invoke    GetPrivateProfileString,addr szSPL_Section,NULL,NULL,addr @szBuf1,
sizeof  @szBuf1,addr szFullININame
        mov        @Temp,
0
        lea        esi,@szBuf1
        .
while     BYTE ptr [esi]
            invoke    RtlZeroMemory,addr @szBuf2,MAX_PATH
            invoke    GetPrivateProfileString,addr szSPL_Section,esi,NULL,addr @szBuf2,MAX_PATH,addr szFullININame
            invoke    SendMessage,hList_SPL,LB_ADDSTRING,NULL,addr @szBuf2
            inc        @Temp
            invoke    lstrlen,esi
            add        esi,eax
            inc        esi
        .endw
            
        push        @Temp
        pop        dwListCount
        mov        dwCurrentIndex,
0
        invoke    SendMessage,hList_SNL,LB_SETCURSEL,dwCurrentIndex,
0
        ret
_LoadList    endp

_SaveList    proc    _lpstrFile,_lpstrFileTitle
        local        @szBuf[
128 ]:BYTE
        
        invoke    SendMessage,hList_SPL,LB_FINDSTRING,
0 ,_lpstrFile
        .
if     eax  !=  LB_ERR
            mov    dwCurrentIndex,eax
            ret
        .endif
        invoke    SendMessage,hList_SNL,LB_ADDSTRING,NULL,_lpstrFileTitle
        invoke    SendMessage,hList_SPL,LB_ADDSTRING,NULL,_lpstrFile
        
        invoke    SendMessage,hList_SPL,LB_GETCOUNT,
0 , 0           
        invoke    wsprintf,addr @szBuf,addr szKeyFmt,eax
        invoke    WritePrivateProfileString,addr szSNL_Section,addr @szBuf,_lpstrFileTitle,addr szFullININame
        invoke    WritePrivateProfileString,addr szSPL_Section,addr @szBuf,_lpstrFile,addr szFullININame
        ret
_SaveList    endp

_OpenFileDialog    proc    uses ecx edx
        local        @stOF:OPENFILENAME
        local        @szBuf[MAX_PATH]:BYTE
        local        @szTmp_Path[MAX_PATH]:BYTE
        local        @szTmp_File[MAX_PATH]:BYTE
        local        @dwTmp_MaxFile,@dwTmp_Length
        
        invoke    RtlZeroMemory,addr @stOF,
sizeof  @stOF
        mov        @stOF.lStructSize,
sizeof  @stOF
        push        hWinMain
        pop        @stOF.hwndOwner
        mov        @stOF.lpstrFilter,offset szTmp_stOF_Filter
        invoke    RtlZeroMemory,addr szTmp_stOF_lpstrFile,OF_MAX_PATH  ;OF_MAX_PATH
= MAX_PATH * 50
        mov        @stOF.lpstrFile,offset szTmp_stOF_lpstrFile
        mov        @stOF.nMaxFile,OF_MAX_PATH
        invoke    RtlZeroMemory,addr szTmp_stOF_lpstrFileTitle,MAX_PATH
        mov        @stOF.lpstrFileTitle,offset szTmp_stOF_lpstrFileTitle
        mov        @stOF.nMaxFileTitle,MAX_PATH
        mov        @stOF.Flags,OFN_EXPLORER or OFN_HIDEREADONLY or OFN_ALLOWMULTISELECT or OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES
        invoke    GetOpenFileName,addr @stOF
        .
if     eax
            lea        ebx,szTmp_stOF_lpstrFile  ;多选时用。
            invoke    lstrlen,ebx
            mov        @dwTmp_Length,eax        ;多选时用。
            mov        @dwTmp_MaxFile,eax    ;多选时用。统计szTmp_stOF_lpstrFile全路径文件名长度
            inc        @dwTmp_MaxFile
            movzx        edx,@stOF.nFileOffset
            .
if     eax  >  edx ;用户只选了一个文件
                invoke    MessageBox,NULL,addr szTmp_stOF_lpstrFile,addr szTmp_stOF_lpstrFile,
0
                invoke    MessageBox,NULL,addr szTmp_stOF_lpstrFileTitle,addr szTmp_stOF_lpstrFileTitle,
0
             invoke    _SaveList,addr szTmp_stOF_lpstrFile,addr szTmp_stOF_lpstrFileTitle
          .
else
                ;多选格式:
" F:mp3,0,1.mp3,0,2.mp3,0,0 "
                invoke    RtlZeroMemory,addr @szTmp_Path,MAX_PATH
                invoke    RtlMoveMemory,addr @szTmp_Path,ebx,@dwTmp_Length
                ;invoke    MessageBox,NULL,addr @szTmp_Path,addr @szTmp_Path,
0
                add        ebx,@dwTmp_MaxFile
                .
while     BYTE ptr [ebx]  !=   0
                    invoke    lstrlen,ebx
                    mov        @dwTmp_Length,eax
                    add        @dwTmp_MaxFile,eax
                    inc        @dwTmp_MaxFile
                    .
break  . if  @dwTmp_MaxFile  >=  OF_MAX_PATH
                    invoke    RtlZeroMemory,addr @szTmp_File,MAX_PATH
                    invoke    RtlMoveMemory,addr @szTmp_File,ebx,@dwTmp_Length
                    ;invoke    MessageBox,NULL,addr @szTmp_File,addr @szTmp_File,
0
                    invoke    RtlZeroMemory,addr @szBuf,MAX_PATH
                    invoke    wsprintf,addr @szBuf,addr szFileFmt,addr @szTmp_Path,addr @szTmp_File
                    invoke    _SaveList,addr @szBuf,addr @szTmp_File
                    add        ebx,@dwTmp_Length
                    inc        ebx
                .endw
            .endif
        .endif
        ret
_OpenFileDialog    endp

_ProcDlgMain    proc    uses ecx ebx edi esi _hWnd,_wMsg,_wParam,_lParam
        mov    eax,_wMsg
        .
if     eax  ==  WM_CLOSE
           invoke   _StopMP3
           invoke   _CloseMP3
           invoke   KillTimer,_hWnd,ID_TIMER
            invoke    EndDialog,_hWnd,NULL
        .elseif    eax 
==  WM_INITDIALOG
            push        _hWnd
            pop        hWinMain
            
            invoke    LoadIcon,hInstance,ICO_MAIN
            invoke    SendMessage,hWinMain,WM_SETICON,ICON_SMALL,eax
            
            invoke    GetDlgItem,hWinMain,IDC_LIST_SNL
            mov        hList_SNL,eax
            
            invoke    GetDlgItem,hWinMain,IDC_LIST_SPL
            mov        hList_SPL,eax
            
            invoke    ShowWindow,hList_SPL,SW_HIDE
            invoke    GetCurrentDirectory,MAX_PATH,addr szFullININame
            mov        esi,offset szFullININame
            invoke    lstrlen,esi
            mov        ecx,offset szININame
            .
if     BYTE ptr [esi + eax - 1 ==   ' '
                inc    ecx
            .endif
            invoke    lstrcat,esi,ecx
            
            invoke    _LoadList
            invoke    SetTimer,hWinMain,ID_TIMER,
500 ,offset _TimerProc
        .elseif    eax 
==  WM_COMMAND
            mov    eax,_wParam
            .
if     ax  ==  IDC_APPEND
                invoke    _OpenFileDialog
            .elseif  ax 
==  IDC_PLAY
                invoke _Play_Click
            .elseif  ax 
==  IDC_PAUSE
                invoke _PauseMP3
                mov    bPlaying,FALSE
                ;invoke SendDlgItemMessage,_hWnd,IDC_PLAN,WM_SETTEXT,
0 ,addr szTime1Fmt
                ;invoke SendDlgItemMessage,_hWnd,IDC_PROGRESS,PBM_SETPOS,
0 , 0
            .elseif  ax 
==  IDC_STOP
                invoke _StopMP3
                invoke _CloseMP3
                mov    bPlaying,FALSE
                invoke SendDlgItemMessage,_hWnd,IDC_PLAN,WM_SETTEXT,
0 ,addr szTime1Fmt
                invoke SendDlgItemMessage,_hWnd,IDC_PROGRESS,PBM_SETPOS,
0 , 0
            .elseif  ax 
==  IDC_AFTER  ;上一首按钮
                     .
if  dwCurrentIndex  <=   0
                         invoke SendMessage,hList_SPL,LB_GETCOUNT,
0 , 0
                         dec    eax
                         mov    dwCurrentIndex,eax
                     .
else
                         dec    dwCurrentIndex
                     .endif
                     invoke SendMessage,hList_SNL,LB_SETCURSEL,dwCurrentIndex,
0
                     invoke _Play_Click
            .elseif  ax 
==  IDC_NEXT  ;下一首按钮
                invoke _Next_Click
            .elseif  ax 
==  IDC_BACK  ;快退按钮
                invoke _BackMP3
            .elseif  ax 
==  IDC_PREV  ;快进按钮
                invoke _PrewMP3
            .elseif  ax 
==  IDC_LIST_SNL  ;歌曲列表框控件
                shr    eax,
16
                .
if   ax  ==  LBN_DBLCLK
                     invoke _Play_Click
                .endif
            .endif
        .
else
            mov    eax,FALSE
            ret
        .endif
        mov    eax,TRUE
        ret
_ProcDlgMain    endp
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
        invoke    InitCommonControls
        invoke    GetModuleHandle,NULL
        mov        hInstance,eax
        invoke    DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
        invoke    ExitProcess,NULL
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start
MP3Player.asm(主程序文件):
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值