⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.asm

📁 一个用WIN32编的班级管理系统
💻 ASM
字号:
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

;	Mp3 播放测试程序 Ver 1.0 - 2007/06/04


.386
.model flat, stdcall
option casemap :none   

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

include		windows.inc
include		user32.inc
include		kernel32.inc
include		comctl32.inc       ;InitCommonControls的头文件
include		comdlg32.inc       ;GetOpenFileName的头文件
include		winmm.inc          ;MCI头文件

includelib	user32.lib
includelib	kernel32.lib
includelib	comctl32.lib
includelib	comdlg32.lib
includelib	winmm.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	Equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDD_DIALOG1    equ                 101
IDC_PLAY       equ              1000
IDC_STOP       equ                 1001
IDC_RP         equ                 1002
IDC_PER        equ                 1003
IDC_NEXT       equ                 1004
IDC_EDIT1      equ                 1005
IDC_DEL        equ                 1006
IDC_OPEN       equ                 1007
IDC_BMIM       equ                 1008
IDC_EXIT       equ                 1009
IDC_SLIDER1    equ                 1010
IDC_STATIC     equ                 -1




;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

		.data?

dwFlag		dd	?
hWinMain	dd	?
hInstance	dd	?
hDevice		dd	?
m_flag		dd  	?
m_flag1		dd	?
m_flag2		dd	?
m_flag3		dd	?
szBuffer	db	256 dup	(?)
file		db	256 dup (256 dup(?))
stOpenFileName	OPENFILENAME	<?>     ;定义了一个公共对话框---OPENFILENAME结构体类型变量

		.data

Caption	db	"Error...",0
Error		db	"Error to play MP3 file!",0
Play		db	"&播放",0
Stop		db	"&停止",0
Tstop		dd	"&暂停",0
Rp              db      "&录音",0
Pre      	db	"&上一首",0
Next 		db	"&下一首",0
Open		db	"&打开",0
Del		db	"&删除",0
Bmim		db	"&托盘",0
Exit		db	"&退出",0
szDevice	db	"MPEGVideo",0
szTitleSave	db	"Open MP3 file...",0
szExt		db	'*.mp3',0
szFilter	db	'MP3 Files(*.mp3)',0,'*.mp3',0,'支持所有格式(*.*)',0,'*.*',0,0

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	子程序声明
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain	PROTO	:DWORD,:DWORD,:DWORD,:DWORD

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;	代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;********************************************************************
;	得到要播放的mp3文件名
;********************************************************************
xor  	ecx 	ecx 用于保存目录个数
_GetFile	proc

;               对结构体的成员进行初始化
		mov	stOpenFileName.Flags,OFN_P
ATHMUSTEXIST or OFN_FILEMUSTEXIST ;设置标志位
		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                     ;指向包含默认扩展名的缓冲
		mov	eax	stOpenFileName.lpstrDefExt
		mov 	file 	eax	
		inc 	ecx
		invoke	GetOpenFileName,addr stOpenFileName                         ;建立文件名对话框
		.if	eax == FALSE
			ret
		.endif
		invoke	SetDlgItemText,hWinMain,ID_FILE,addr szBuffer               ;设置对话框的编辑栏
		call	_StopPlayMP3                                                ;保证重新选择一个文件时,关闭原来已经在播放的mp3文件

		ret

_GetFile	endp
;********************************************************************
;	播放mp3文件
;********************************************************************
_PlayMP3	proc
		local	@stMCIOpen:MCI_OPEN_PARMS                                   ;打开设备的结构体
		local	@stMCIPlay:MCI_PLAY_PARMS                                   ;播放结构体
		.if aa==0
			call _GetFile
		.else
;               初始化MCI_OPEN_PARMS结构体
		mov	@stMCIOpen.lpstrDeviceType,offset szDevice                   ;mp3类设备
		mov	@stMCIOpen.lpstrElementName,offset szBuffer                  ;要打开的文件名
		invoke	mciSendCommand,0,MCI_OPEN,MCI_OPEN_TYPE or MCI_OPEN_ELEMENT,addr @stMCIOpen ;调用这个API函数打开设备
		mov	eax,@stMCIOpen.wDeviceID                                     ;接受消息的设备ID 
		mov	hDevice,eax
		mov	eax,hWinMain
		mov	@stMCIPlay.dwCallback,eax                                     ;它指向一个特定的CALLBACK函数,事件柄,窗口柄,或一个将在波形音频回放时以便处理与回放进度相关的消息的期间呼叫的线程ID,如果无须CALLBACK函数,可以将其设为0

		invoke	mciSendCommand,hDevice,MCI_PLAY,MCI_NOTIFY,addr @stMCIPlay    ;调用这个API函数播放文件
		.endif
		.if	eax == 0
			invoke	SetDlgItemText,hWinMain,ID_PLAY,addr Tstop              ;设置对话框play按钮上的字为stop
			mov	dwFlag,1
		.else
			invoke	MessageBox,hWinMain,addr szError,addr szCaption,MB_OK ;如果播放文件失败,就会调用这个消息框
		.endif
		ret
        
_PlayMP3	endp
;********************************************************************
;	停止播放
;********************************************************************
_StopPlayMP3	proc
		local	@stMCIStop:MCI_GENERIC_PARMS                                   ;用来关闭设备的结构体
		
		mov	eax,hWinMain
		mov	@stMCIStop.dwCallback,eax
		invoke	mciSendCommand,hDevice,MCI_STOP,MCI_NOTIFY,addr @stMCIStop     ;先停止播放
		invoke	mciSendCommand,hDevice,MCI_CLOSE,MCI_NOTIFY,addr @stMCIStop    ;再关闭设备
		invoke	SetDlgItemText,hWinMain,IDOK,addr szPlay                       ;设置对话框stop按钮上的字为play
		mov	dwFlag,0
		ret

_StopPlayMP3	endp
;********************************************************************
;	模式对话框的过程函数
;********************************************************************
_ProcDlgMain	proc	uses ebx edi esi, \
		hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD

		mov	eax,wMsg
		.if	eax == WM_CLOSE
			invoke	EndDialog,hWnd,NULL                                    ;关闭对话框
		.elseif	eax == WM_INITDIALOG                                           ;初始化对话框      
			mov	eax,hWnd
			mov	hWinMain,eax
			invoke	SendDlgItemMessage,hWinMain,ID_FILE,EM_SETREADONLY,TRUE,NULL  ;向编辑框发送消息
		.elseif	eax == WM_COMMAND
			mov	eax,wParam
			.if	eax == ID_BROWSE
				call	_GetFileName
			.elseif eax == IDOK
				.if	dwFlag == 0
					call	_PlayMP3
				.else
					call	_StopPlayMP3
				.endif
			.endif
		.else
;********************************************************************
;	注意:对话框的消息处理后,要返回 TRUE,对没有处理的消息
;	要返回 FALSE
;********************************************************************
			mov	eax,FALSE
			ret
		.endif		   
		mov	eax,TRUE
		ret
		
_ProcDlgMain	endp
;********************************************************************
;	主过程
;********************************************************************
start:
		invoke	GetModuleHandle,NULL
		mov	hInstance,eax
		invoke	DialogBoxParam,hInstance,DLG_MAIN,NULL,addr _ProcDlgMain,NULL
		invoke	ExitProcess,NULL
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -