📄 22. 声音与音乐.txt
字号:
EnableWindow (GetDlgItem (hwnd, IDC_NOTIFY_SUPERSEDED),
wParam & MCI_NOTIFY_SUPERSEDED) ;
EnableWindow (GetDlgItem (hwnd, IDC_NOTIFY_ABORTED),
wParam & MCI_NOTIFY_ABORTED) ;
EnableWindow (GetDlgItem (hwnd, IDC_NOTIFY_FAILURE),
wParam & MCI_NOTIFY_FAILURE) ;
SetTimer (hwnd, ID_TIMER, 5000, NULL) ;
return TRUE ;
case WM_TIMER:
KillTimer (hwnd, ID_TIMER) ;
EnableWindow (GetDlgItem (hwnd, IDC_NOTIFY_MESSAGE), FALSE) ;
EnableWindow (GetDlgItem (hwnd, IDC_NOTIFY_ID), FALSE) ;
EnableWindow (GetDlgItem (hwnd, IDC_NOTIFY_SUCCESSFUL), FALSE) ;
EnableWindow (GetDlgItem (hwnd, IDC_NOTIFY_SUPERSEDED), FALSE) ;
EnableWindow (GetDlgItem (hwnd, IDC_NOTIFY_ABORTED), FALSE) ;
EnableWindow (GetDlgItem (hwnd, IDC_NOTIFY_FAILURE), FALSE) ;
return TRUE ;
case WM_SYSCOMMAND:
switch (LOWORD (wParam))
{
case SC_CLOSE:
EndDialog (hwnd, 0) ;
return TRUE ;
}
break ;
}
return FALSE ;
}
TESTMCI.RC (摘录)
//Microsoft Developer Studio generated resource script.
#include "resource.h"
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
// Dialog
TESTMCI DIALOG DISCARDABLE 0, 0, 270, 276
STYLE WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "MCI Tester"
FONT 8, "MS Sans Serif"
BEGIN
EDITTEXT IDC_MAIN_EDIT,8,8,254,100,ES_MULTILINE | ES_AUTOHSCROLL |
WS_VSCROLL
LTEXT "Return String:",IDC_STATIC,8,114,60,8
EDITTEXT IDC_RETURN_STRING,8,126,120,50,ES_MULTILINE |
ES_AUTOVSCROLL | ES_READONLY | WS_GROUP | NOT WS_TABSTOP
LTEXT "Error String:",IDC_STATIC,142,114,60,8
EDITTEXT IDC_ERROR_STRING,142,126,120,50,ES_MULTILINE |
ES_AUTOVSCROLL | ES_READONLY | NOT WS_TABSTOP
GROUPBOX "MM_MCINOTIFY Message",IDC_STATIC,9,186,254,58
LTEXT "",IDC_NOTIFY_ID,26,198,100,8
LTEXT "MCI_NOTIFY_SUCCESSFUL",IDC_NOTIFY_SUCCESSFUL,26,212,100,
8,WS_DISABLED
LTEXT "MCI_NOTIFY_SUPERSEDED",IDC_NOTIFY_SUPERSEDED,26,226,100,
8,WS_DISABLED
LTEXT "MCI_NOTIFY_ABORTED",IDC_NOTIFY_ABORTED,144,212,100,8,
WS_DISABLED
LTEXT "MCI_NOTIFY_FAILURE",IDC_NOTIFY_FAILURE,144,226,100,8,
WS_DISABLED
DEFPUSHBUTTON "OK",IDOK,57,255,50,14
PUSHBUTTON "Close",IDCANCEL,162,255,50,14
END
RESOURCE.H (摘录)
// Microsoft Developer Studio generated include file.
// Used by TestMci.rc
#define IDC_MAIN_EDIT 1000
#define IDC_NOTIFY_MESSAGE 1005
#define IDC_NOTIFY_ID 1006
#define IDC_NOTIFY_SUCCESSFUL 1007
#define IDC_NOTIFY_SUPERSEDED 1008
#define IDC_NOTIFY_ABORTED 1009
#define IDC_NOTIFY_FAILURE 1010
#define IDC_SIGNAL_MESSAGE 1011
#define IDC_SIGNAL_ID 1012
#define IDC_SIGNAL_PARAM 1013
#define IDC_RETURN_STRING 1014
#define IDC_ERROR_STRING 1015
#define IDC_DEVICES 1016
#define IDC_STATIC -1
与本章的大多数程序一样,TESTMCI使用非模态对话框作为它的主窗口。与本章所有的程序一样,TESTMCI要求WINMM.LIB引用链接库在Microsoft Visual C++「Projects Settings」对话框的「Links」页列出。
此程序用到了两个最重要的多媒体函数:mciSendString和mciGetErrorText。在TESTMCI的主编辑窗口输入一些内容然后按下Enter键(或「OK」按钮)后,程序将输入的字符串作为第一个参数传递给mciSendString命令:
error = mciSendString (szCommand, szReturn,
sizeof (szReturn) / sizeof (TCHAR), hwnd) ;
如果在编辑窗口选择了不止一行,则程序将按顺序将它们发送给mciSendString函数。第二个参数是字符串地址,此字符串取得从函数传回的信息。程序将此信息显示在窗口的「Return String」区域。从mciSendString传回的错误代码传递给mciGetErrorString函数,以获得文字错误说明;此说明显示在TESTMCI窗口的「Error String」区域。
MCITEXT和CD声音
通过控制CD-ROM驱动器和播放声音CD,您会对MCI命令字符串留下很好的印象。因为这些命令字符串一般都非常简单,并且更重要的是您可以听到一些音乐,所以这是好的起点。您可以在/Platform SDK/Graphics and Multimedia Services/Multimedia Reference/Multimedia Command Strings中获得MCI命令字符串的参考,以方便本练习。
请确认CD-ROM驱动器的声音输出已连结到扩音器或耳机,然后放入一张声音CD,如Bruce Springsteen的「Born to Run」。Windows 98中,「CD播放程序」将启动并开始播放此唱片。如果是这样的话,终止「CD播放程序」,然后可以叫出TESTMCI并且键入命令:
open cdaudio
然后按Enter键。其中open是MCI命令,cdaudio是MCI认定的CD-ROM驱动器的设备名称(假定您的系统中只有一个CD-ROM驱动器。要获得多个CD-ROM驱动器名称需使用sysinfo命令)。
TESTMCI中的「Return String」区域显示mciSendString函数中系统传回给程序的字符串。如果执行了open命令,则此值是1。TESTMCI在「Error String」区域中显示mciGetErrorString依据mciSendString传回值所传回的信息。如果mciSendString没有传回错误代码,则「Error String」区域显示文字"The specified command was carried out"。
假定执行了open命令,现在就可以输入:
play cdaudio
CD将开始播放唱片上的第一首乐曲「Thunder Road」。输入下面的命令可以暂停播放:
pause cdaudio
或者
stop cdaudio
对于CD声音设备来说,这些叙述的功能相同。您可用下面的叙述重新播放:
play cdaudio
迄今为止,我们使用的全部字符串都由命令和设备名称组成。其中有些命令带有选项。例如,键入:
status cdaudio position
根据收听时间的长短,「Return String」区域将显示类似下面的一些字符:
01:15:25
这是些什么?很显然不是小时、分钟和秒,因为CD没有那么长。要找出时间格式,请键入:
status cdaudio time format
现在「Return String」区域显示下面的字符串:
msf
这代表「分-秒-格」。CD声音中,每秒有75格。时间格式的讯格部分可在0到74之间的范围内变化。
状态命令有一连串的选项。使用下面的命令,您可以确定msf格式的CD全部长度:
status cdaudio length
对于「Born to Run」,「Return String」区域将显示:
39:28:19
这指的是39分28秒19格。
现在试一下
status cdaudio number of tracks
「Return String」区域将显示:
8
我们从CD封面上知道「Born to Run」CD上第五首乐曲是主题曲。MCI命令中的乐曲从1开始编号。要想知道乐曲「Born to Run」的长度,可以键入下面的命令:
status cdaudio length track 5
「Return String」区域将显示:
04:30:22
我们还可确定此乐曲从盘上的哪个位置开始:
status cdaudio position track 5
「Return String」区域将显示:
17:36:35
根据这条信息,我们可以直接跳到乐曲标题:
play cdaudio from 17:36:35 to 22:06:57
此命令只播放一首乐曲,然后停止。最后的值是由4:30:22(乐曲长度)加17:36:35得到的。或者,也可以用下面的命令确定:
status cdaudio position track 6
或者,也可以将时间格式设定为乐曲-分-秒-格:
set cdaudio time format tmsf
然后
play cdaudio from 5:0:0:0 to 6:0:0:0
或者,更简单地
play cdaudio from 5 to 6
如果时间的尾部是0,那么您可去掉它们。还可以用毫秒设定时间格式。
每个MCI命令字符串都可以在字符串的后面包括选项wait和notify(但不是同时使用)。例如,假设您只想播放「Born to Run」的前10秒,而且播放后,您还想让程序完成其它工作。您可按下面的方法进行(假定您已经将时间格式设定为tmsf):
play cdaudio from 5:0:0 to 5:0:10 wait
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -