10 2 MCI MCI MCIOPENPARMS typedef struct DWORD

  • Slides: 12
Download presentation

10. 2 MCI编程步骤 Ø 打开设备 MCI为不同的多媒体设备打开提供相应的数据结构类型。若不想使用设备中特定的参 数数据,则可使用统一的MCI_OPEN_PARMS结构,原型: typedef struct { DWORD dw. Callback; //

10. 2 MCI编程步骤 Ø 打开设备 MCI为不同的多媒体设备打开提供相应的数据结构类型。若不想使用设备中特定的参 数数据,则可使用统一的MCI_OPEN_PARMS结构,原型: typedef struct { DWORD dw. Callback; // 低字节用于MCI_NOTIFY的窗口句柄 MCIDEVICEID w. Device. ID; // 返回的设备标识符 LPCSTR lpstr. Device. Type; // MCI设备的类型 LPCSTR lpstr. Element. Name; // 设备元素 LPCSTR lpstr. Alias; // 可选的设备别名 } MCI_OPEN_PARMS; 打开多媒体设备的过程:定义一个MCI_OPEN_PARMS结构类型变量,给结构变量中 的相应参数赋值,调用mci. Send. Command向设备发送MCI_OPEN命令消息,成功调用 时,可获得相应的设备标识符。例如,下面的代码是打开波形音频设备: WORD w. Device. ID; // MCI设备ID CString file. Name; // 波形文件名. . . MCI_OPEN_PARMS open. Parms; // MCI设备打开参数 open. Parms. lpstr. Device. Type = "waveaudio"; // 波形音频设备 open. Parms. lpstr. Element. Name = file. Name; if (mci. Send. Command (NULL, MCI_OPEN_ELEMENT | MCI_OPEN_TYPE, (DWORD)(LPVOID) &open. Parms)) return FALSE; w. Device. ID = open. Parms. w. Device. ID; . . .

10. 2 MCI编程步骤 Ø 设置或获取设备信息 使用MCI_SET和MCI_STATUS命令可以用来设置和获取设备信息,在用函数 mci. Send. Command发送命令时,使用相应的MCI_SET_PARMS和 MCI_STATUS_PARMS结构。原型: typedef struct { DWORD

10. 2 MCI编程步骤 Ø 设置或获取设备信息 使用MCI_SET和MCI_STATUS命令可以用来设置和获取设备信息,在用函数 mci. Send. Command发送命令时,使用相应的MCI_SET_PARMS和 MCI_STATUS_PARMS结构。原型: typedef struct { DWORD dw. Callback; // 低字节用于MCI_NOTIFY的窗口句柄 DWORD dw. Time. Format; // 时间格式 DWORD dw. Audio; // 输出声道 } MCI_SET_PARMS; typedef struct { DWORD dw. Callback; // 低字节用于MCI_NOTIFY的窗口句柄 DWORD dw. Return; // 要获取的设备信息 DWORD dw. Item; // 需要获取的信息项 DWORD dw. Track; // 曲目的长度或曲目号 } MCI_STATUS_PARMS; 例如,下面的代码是将波形音频设备的时间格式设成毫秒: MCI_SET_PARMS set. Parms; set. Parms. dw. Time. Format=MCI_FORMAT_MILLISECONDS; if (mci. Send. Command(w. Device. ID, MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &set. Parms)) return FALSE;

10. 2 MCI编程步骤 Ø 播放设备 使用MCI_PLAY命令可以使设备播放多媒体文件,并在用函数 mci. Send. Command发送命令时,使用相应的MCI_PLAY_PARMS结构,其原 型如下: typedef struct { DWORD

10. 2 MCI编程步骤 Ø 播放设备 使用MCI_PLAY命令可以使设备播放多媒体文件,并在用函数 mci. Send. Command发送命令时,使用相应的MCI_PLAY_PARMS结构,其原 型如下: typedef struct { DWORD dw. Callback; // 低字节用于MCI_NOTIFY的窗口句柄 DWORD dw. From; // 播放的起点位置 DWORD dw. To; // 播放的终点位置 } MCI_PLAY_PARMS; 例如,下面的代码是播放波形音频设备: MCI_PLAY_PARMS play. Parms; // 定位到开始位置 mci. Send. Command (w. Device. ID, MCI_SEEK_TO_START, NULL); // 播放设备 if (mci. Send. Command (w. Device. ID, MCI_PLAY, NULL, (DWORD)(LPVOID) &play. Parms)) return FALSE; else return TRUE;

10. 2 MCI编程步骤 例如,若接收MM_MCINOTIFY消息的窗口是一个对话框CMy. Dlg,则添加消息处理的 过程如下: (1)切换到项目 作区窗口的Class. View页面,右击CMy. Dlg类,选择快捷菜单中的 “Add Member Function. .

10. 2 MCI编程步骤 例如,若接收MM_MCINOTIFY消息的窗口是一个对话框CMy. Dlg,则添加消息处理的 过程如下: (1)切换到项目 作区窗口的Class. View页面,右击CMy. Dlg类,选择快捷菜单中的 “Add Member Function. . . ”命令。为CMy. Dlg类添加保护型的成员函数,原型: protected: LRESULT On. MCINotify(WPARAM w. Param, LPARAM l. Param); (2)在类CMy. Dlg的消息入口处,添加下列消息宏指令: BEGIN_MESSAGE_MAP(CMy. Dlg, CDialog) //{{AFX_MSG_MAP(CMy. Dlg). . . //}}AFX_MSG_MAP ON_MESSAGE(MM_MCINOTIFY, On. MCINotify) END_MESSAGE_MAP() (3)编写CMy. Dlg: : On. MCINotify函数代码: LRESULT CMy. Dlg: : On. MCINotify(WPARAM w. Param, LPARAM l. Param) {. . . return FALSE; } (4)关闭设备 使用MCI_STOP和MCI_CLOSE命令可以分别用来停止播放和关闭设备。不需要设置或 返回附加的信息,因此不必考虑相应的MCI_GENERIC_PARMS结构。

10. 3使用MCIWnd窗口类 (5)用Class. Wizard为Ex_MCIView类中添加On. Initial. Update消息处理函数,增 加代码: void CEx_MCIView: : On. Initial. Update() {

10. 3使用MCIWnd窗口类 (5)用Class. Wizard为Ex_MCIView类中添加On. Initial. Update消息处理函数,增 加代码: void CEx_MCIView: : On. Initial. Update() { CView: : On. Initial. Update(); m_h. My. MCIWnd=MCIWnd. Create(m_h. Wnd, Afx. Get. Instance. Handle(), MCIWNDF_NOTIFYSIZE |MCIWNDF_NOERRORDLG | WS_CHILD|WS_VISIBLE, NULL); if (m_h. My. MCIWnd==NULL) return; const CString &filename=Get. Document()->Get. Path. Name(); if (filename. Get. Length()>0) MCIWnd. Open(m_h. My. MCIWnd, (LPCSTR)filename, 0); } (6)在CEx_MCIView构造函数中将成员变量m_h. My. MCIWnd初始化为NULL。 CEx_MCIView: : CEx_MCIView() { m_h. My. MCIWnd=NULL; }

10. 3使用MCIWnd窗口类 (7) 要添加处理该消息的代码来调整窗口的大小以便能及时更新显示。需要手动进行。 在Ex_MCIView. h文件中的消息声明处添加下列代码: // Generated message map functions protected: //{{AFX_MSG(CEx_MCIView). .

10. 3使用MCIWnd窗口类 (7) 要添加处理该消息的代码来调整窗口的大小以便能及时更新显示。需要手动进行。 在Ex_MCIView. h文件中的消息声明处添加下列代码: // Generated message map functions protected: //{{AFX_MSG(CEx_MCIView). . . //}}AFX_MSG afx_msg LONG On. Notify. Size(UINT w. Param, LONG l. Param); DECLARE_MESSAGE_MAP() (8)在Ex_MCIView. cpp的消息入口处添加下列代码: BEGIN_MESSAGE_MAP(CEx_MCIView, CView) //{{AFX_MSG_MAP(CEx_MCIView). . . ON_MESSAGE(MCIWNDM_NOTIFYSIZE, On. Notify. Size) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView: : On. File. Print) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView: : On. File. Print) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView: : On. File. Print. Preview) END_MESSAGE_MAP()

10. 3使用MCIWnd窗口类 (9)为CEx_MCIView类添加该消息的处理函数On. Notify. Size,代码: LONG CEx_MCIView: : On. Notify. Size(UINT w. Param, LONG

10. 3使用MCIWnd窗口类 (9)为CEx_MCIView类添加该消息的处理函数On. Notify. Size,代码: LONG CEx_MCIView: : On. Notify. Size(UINT w. Param, LONG l. Param) { CRect rc; CFrame. Wnd* p. Parent=Get. Parent. Frame(); if (m_h. My. MCIWnd) { : : Get. Window. Rect(m_h. My. MCIWnd, rc); p. Parent->Calc. Window. Rect(rc, CWnd: : adjust. Border); CSize size(rc. Width(), rc. Height()); if (Get. Ex. Style()&WS_EX_CLIENTEDGE) { size. cx+=4; size. cy+=4; } p. Parent->Set. Window. Pos(NULL, 0, 0, size. cx, size. cy, SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE); } else { p. Parent->Set. Window. Pos(NULL, 0, 0, 200, 160, SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE); } return 1; }