播放MP3,AVI,等多媒体文件的源程序
; ######################################################################### .386 .model flat, stdcall ; 32 bit memory model option casemap :none ; case sensitive include Project.inc ; local includes for this file ; ######################################################################### .code start: invoke GetModuleHandle, NULL mov hInstance, eax invoke GetCommandLine mov CommandLine, eax invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT invoke ExitProcess,eax ; ######################################################################### WinMain proc hInst :DWORD, hPrevInst :DWORD, CmdLine :DWORD, CmdShow :DWORD ;==================== ; Put LOCALs on stack ;==================== LOCAL wc :WNDCLASSEX LOCAL msg :MSG ;================================================== ; Fill WNDCLASSEX structure with required variables ;================================================== invoke LoadIcon,hInst,500 ; icon ID mov hIcon, eax szText szClassName,"Project_Class" mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, CS_HREDRAW or CS_VREDRAW \ or CS_BYTEALIGNWINDOW mov wc.lpfnWndProc, offset WndProc;when the windows change,ok It wi ll call the winproc program mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL m2m wc.hInstance, hInst ;mov the hInst to wc.hInstance mov wc.hbrBackground, COLOR_BTNFACE+1 mov wc.lpszMenuName, NULL mov wc.lpszClassName, offset szClassName m2m wc.hIcon, hIcon invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor, eax m2m wc.hIconSm, hIcon invoke RegisterClassEx, ADDR wc invoke CreateWindowEx,WS_EX_LEFT, ADDR szClassName, ADDR szDisplayName, WS_OVERLAPPEDWINDOW, 200,200,200,100, NULL,NULL, hInst,NULL mov hWnd,eax invoke LoadMenu,hInst,600 ; menu ID invoke SetMenu,hWnd,eax invoke ShowWindow,hWnd,SW_SHOWNORMAL invoke UpdateWindow,hWnd ;=================================== ; Loop until PostQuitMessage is sent ;=================================== ;Message loop StartLoop: invoke GetMessage,ADDR msg,NULL,0,0 cmp eax, 0 je ExitLoop invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg jmp StartLoop ExitLoop: return msg.wParam WinMain endp ; ######################################################################### WndProc proc hWin :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD LOCAL var :DWORD LOCAL caW :DWORD LOCAL caH :DWORD LOCAL Rct :RECT LOCAL hDC :DWORD LOCAL Ps :PAINTSTRUCT LOCAL buffer1[128]:BYTE ; these are two spare buffers LOCAL buffer2[128]:BYTE ; for text manipulation etc.. .if uMsg == WM_COMMAND ;======== menu commands ======== .if wParam == 1010 invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL .elseif wParam==1000 call _GetFileName .elseif wParam==1020 ;play the mp3 file xor ebx,ebx mov ebx,MCI_PLAY call _OpenMciDevice call _Mp3 .elseif wParam==1030 ;pause the mp3 play xor ebx,ebx mov ebx,MCI_PAUSE call _Mp3 .elseif wParam==1040 ;resume the mp3 play xor ebx,ebx mov ebx,MCI_RESUME call _Mp3 .elseif wParam==1050 ;stop the mp3 play xor ebx,ebx mov ebx,MCI_STOP call _Mp3 .elseif wParam == 1910 szText AMsg,"Prostart Pure Assembler Template",13,10,\ "Copyright ?Prostart 1999" invoke ShellAbout,hWin,ADDR szDisplayName,ADDR AMsg,hIcon .endif ;====== end menu commands ====== .elseif uMsg == WM_CREATE invoke IconButton,hWin,10,0,150,26,900 ;mov hBtn1, eax .elseif uMsg == WM_SIZE .elseif uMsg == WM_PAINT invoke BeginPaint,hWin,ADDR Ps mov hDC, eax invoke Paint_Proc,hWin,hDC invoke EndPaint,hWin,ADDR Ps return 0 .elseif uMsg == WM_CLOSE .elseif uMsg == WM_DESTROY invoke PostQuitMessage,NULL return 0 .endif invoke DefWindowProc,hWin,uMsg,wParam,lParam ret WndProc endp ; ######################################################################## ; ######################################################################### Paint_Proc proc hWin:DWORD, hDC:DWORD LOCAL btn_hi :DWORD LOCAL btn_lo :DWORD LOCAL Rct :RECT invoke GetSysColor,COLOR_BTNHIGHLIGHT mov btn_hi, eax invoke GetSysColor,COLOR_BTNSHADOW mov btn_lo, eax return 0 Paint_Proc endp ;取得 _GetFileName proc mov stOpenFileName.Flags,OFN_PATHMUSTEXIST or OFN_FILEMUSTEX IST mov stOpenFileName.lStructSize,SIZEOF stOpenFileName mov eax,hWinMain mov stOpenFileName.hWndOwner,eax mov stOpenFileName.lpstrFilter,offset szFilter ;扩展名 mov stOpenFileName.lpstrFile,offset szBuffer ;文件名 缓冲 mov stOpenFileName.nMaxFile,255 ;文件名 缓冲长度 mov stOpenFileName.lpstrInitialDir,0 mov stOpenFileName.lpstrTitle,offset szTitleSave mov stOpenFileName.lpstrDefExt,offset szExt invoke GetOpenFileName,offset stOpenFileName .if eax == FALSE ret .endif invoke MessageBox,NULL,addr str1,addr str2,MB_OK ; invoke SetDlgItemText,hWinMain,ID_FILE,addr szBuffer ; call _StopPlayMP3 ret _GetFileName endp ; ######################################################################## _OpenMciDevice proc local @stMCIOpen:MCI_OPEN_PARMS ; mov @stMCIOpen.lpstrDeviceType,offset szDevice mov @stMCIOpen.lpstrElementName,offset szBuffer invoke mciSendCommand,0,MCI_OPEN,MCI_OPEN_TYPE or MCI_OPEN_ELEM ENT,addr @s tMCIOpen mov eax,@stMCIOpen.wDeviceID ret _OpenMciDevice endp ; ######################################################################## _Mp3 proc local @stMCIPlay:MCI_GENERIC_PARMS mov hDevice,eax mov eax,hWinMain mov @stMCIPlay.dwCallback,eax invoke mciSendCommand,hDevice,ebx,MCI_NOTIFY,addr @stMCIPlay ; EBX THE CONTROL MESSAGE .if eax == 0 ;invoke SetDlgItemText,hWinMain,IDOK,offset szStop mov dwFlag,1 .else invoke MessageBox,hWinMain,addr szError,addr szCaption, MB_OK .endif xor ebx,ebx ret _Mp3 endp ; ######################################################################## IconButton proc hParent :DWORD,a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD ; IconButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD ; invoke IconButton,hWnd,20,20,100,25,500 szText icoBtnCl,"COMBOBOX" szText blnk1,0 invoke CreateWindowEx,0, ADDR icoBtnCl,ADDR blnk1, WS_CHILD or WS_VISIBLE or CBS_DROPDOWNLIST or CBS_SIMPLE or WS_ SYSMENU, a,b,wd,ht,hParent,ID, hInstance,NULL ret IconButton endp ; end start --