第10章媒体控制接口 10.1 MCI设备类型 10.2 MCI编程步骤 10.3使用MCIWnd窗口类.

Slides:



Advertisements
Similar presentations
软件开发技术基础 第 3 章 操作系统及程序设计 讲授教师:卫颜俊. 主 要 内 容 主 要 内 容 操作系统及其功能 进程管理应用程序设计 内存管理应用程序设计 设备与文件管理应用程序设计 人机接口管理应用程序设计.
Advertisements

我的未来不是梦 攀枝花市经贸旅游学校. 1. 文中案例王萍苦恼的原因是 什么? 2. 你有哪些办法可以帮助王萍? 导入 思考  谁来帮帮她?
第一章 C语言概述 计算机公共教学部.
目 錄 壹、緣由 貳、問題解析 參、問題歸納 肆、因應對策 伍、評鑑獎勵 陸、追蹤考核 1.
吉林大学远程教育课件 Windows A P I编 程 (第四十五讲) 主讲人 : 翟慧杰 学 时:48.
第7单元 面向过程编程—— 继承与多态.
第二十九章 DLL / LIB函式庫開發 當我們開發程式到一個階段之後,我們一定會希望各個Component的程式碼可以分開的越清楚越好。而這一章最主要就是要告訴各位讀者,我們常在Windows系統中看到的dll或是lib的檔案該怎麼實作?做出這樣的library我們又該如何運用?為什麼使用dll或是lib有利於我們開發程式?以上這些疑問都將會在這一章中得到解答。
第二章 C# 基础知识.
Chap 18 類別與物件 夫有土者,有大物也。有大物者,不可以物。 物而不物,故能物物。 明乎物物者之非物也,豈獨治天下百姓而已哉!
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
动态链接库 多线程 文件操作 注册表 多媒体编程 Winsock编程(网络编程) 数据库.
第十一章 面向对象设计 第十二章 面向对象实现
Screen Layout & Background Image
Visual C++ Windows Programming
第4讲 Windows编程基础 此为封面页,需列出课程编码、课程名称和课程开发室名称。
第七章 搜索结构 静态搜索结构 二叉搜索树 AVL树.
VC 程式設計 Base I 報告者:Jerry Chen TEL:
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计期末复习 黎金宁
第三章 C++中的C 面向对象程序设计(C++).
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
第5章 文本与字体 2018/12/3 面向对象与可视化 程序设计 --Visual C++ 编程 主讲教师: 唐 龙教授 (计算机科学与技术系) 黄维通博士 (计算机与信息管理中心) 清 华 大 学 2001年2月 2018/12/3 Huang Weitong.
简要回顾 了解课程体系、课程目的和主要内容 掌握Windows编程涉及的一些主要概念 DOS程序和Windows程序的主要区别 窗口和程序
第1章 Windows应用程序框架的 创建与消息处理
第3章 Windows 应用程序基础 2018/12/6 第2讲 Windows 应用程序基础 VC++面向对象与可视化程序设计.
第十一讲 MFC常用控件的使用(3) 严宣辉 数学与计算机科学学院
MFC WinSock类的编程 为简化套接字网络编程,更方便地利用Windows的消息驱动机制,微软的基础类库(Microsoft Foundation Class Libary,简称MFC),提供了两个套接字类,在不同的层次上对Windows Socket API函数进行了封装,为编写Windows.
网络游戏开发语言基础 ——Windows程序设计
VC++开发实例 张荣梅 2007年2月.
RWM600 (13.56MHz) Reader Antenna.
RWM600 (13.56MHz) Reader Antenna.
第四章 小技巧.
第4章 MFC编程 4.1 MFC概述 4.2 MFC和Win CObject类 4.4 消息映射的实现
第 10 章 Windows用户界面 10.1 Windows消息与命令 10.2 单文档与多文档程序 10.3 对话框与常用组件
Visual C++ Windows Programming
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
$10 可空类型.
Animation(動畫) 靜宜大學資工系 蔡奇偉 副教授
第三章 C# 基础知识.
第十五讲 MFC与消息处理 MFC简介 Windows编程机制 MFC应用程序框架原理 创建应用程序框架 消息及其分类 消息映射机制
版权所有 复制必究 第 6 章 MFC原理与方法.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
第十二讲 菜单、工具栏和状态栏 严宣辉 数学与计算机科学学院
《面向对象程序设计与Visual C++6.0教程》
Visual C++ Windows Programming
_05MessageMap的原理 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
MFC及其应用.
习题课
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第5章 文本与字体 2019/4/25 面向对象与可视化 程序设计 --Visual C++ 编程 主讲教师: 唐 龙教授 (计算机科学与技术系) 黄维通博士 (计算机与信息管理中心) 清 华 大 学 2001年2月 2019/4/25 Huang Weitong.
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
习题课 编译原理与技术 计算机科学与技术学院 李诚.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
第三章 世界文明的蛻變與互動 第一節 歐洲社會的蛻變 第二節 世界文明的交匯 第三節 亞洲大帝國的發展 1.
第 3 章 类的基础部分 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
本节内容 重定位表 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
1.4WIN32中的宽字符.
_01自己实现简单的消息处理框架模型 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司
手机淘宝“变形”产品—微淘 操作流程指南 (内测版).
第2章 Java语言基础.
Chapter 2 Entity-Relationship Model
本课内容 接下来的几节课,我们要利用C语言开发一些游戏 本节课开发一个俄罗斯方块游戏 游戏规则.
MFC的六大核心 机制3 动态创建 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang
本节内容 1.二叉排序树的定义 2.二叉排序树的查找操作 3.二叉排序树的插入操作 4.二叉排序树的删除操作 5.二叉排序树的总结
手工编写第一个 MFC程序 本节内容 视频提供:昆山爱达人信息技术有限公司 视频录制:yang 官网地址:
Presentation transcript:

第10章媒体控制接口 10.1 MCI设备类型 10.2 MCI编程步骤 10.3使用MCIWnd窗口类

10.1 MCI设备类型 媒体控制接口允许控制两类设备:第一类为简单设备,是指那些不需要文件的设备,如CD音频播放设备;第二类为复合设备,是那些需要文件的设备,如数字视频及波形音频设备等。表列出了目前已定义的设备的标识符。

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

10.2 MCI编程步骤 设置或获取设备信息 使用MCI_SET和MCI_STATUS命令可以用来设置和获取设备信息,在用函数mciSendCommand发送命令时,使用相应的MCI_SET_PARMS和MCI_STATUS_PARMS结构。原型: typedef struct { DWORD dwCallback; // 低字节用于MCI_NOTIFY的窗口句柄 DWORD dwTimeFormat; // 时间格式 DWORD dwAudio; // 输出声道 } MCI_SET_PARMS; { DWORD dwCallback; // 低字节用于MCI_NOTIFY的窗口句柄 DWORD dwReturn; // 要获取的设备信息 DWORD dwItem; // 需要获取的信息项 DWORD dwTrack; // 曲目的长度或曲目号 } MCI_STATUS_PARMS; 例如,下面的代码是将波形音频设备的时间格式设成毫秒: MCI_SET_PARMS setParms; setParms.dwTimeFormat=MCI_FORMAT_MILLISECONDS; if (mciSendCommand(wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &setParms)) return FALSE;

10.2 MCI编程步骤 播放设备 使用MCI_PLAY命令可以使设备播放多媒体文件,并在用函数mciSendCommand发送命令时,使用相应的MCI_PLAY_PARMS结构,其原型如下: typedef struct { DWORD dwCallback; // 低字节用于MCI_NOTIFY的窗口句柄 DWORD dwFrom; // 播放的起点位置 DWORD dwTo; // 播放的终点位置 } MCI_PLAY_PARMS; 例如,下面的代码是播放波形音频设备: MCI_PLAY_PARMS playParms; // 定位到开始位置 mciSendCommand (wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL); // 播放设备 if (mciSendCommand (wDeviceID, MCI_PLAY, NULL, (DWORD)(LPVOID) &playParms)) return FALSE; else return TRUE;

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

10.3使用MCIWnd窗口类 MCIWnd是一个控制多媒体设备的窗口类。若在应用程序中使用MCIWnd窗口类,必须在调用MCIWnd函数所在的源文件的前面添加vfw.h的头文件,以及编译时加入vfw32.lib库或在程序中加入下列语句: #pragma comment (lib,"vfw32.lib") 在MCIWnd窗口类中,虽然它所提供的函数并不多,但是它所提供的宏却非常多,并且基本上与MCI的底层功能相对应。 在应用程序中使用MCIWnd窗口类的一般步骤是: (1)在程序中调用MCIWndRegisterClass函数注册MCI窗口类,以便以后用CreateWindow或CreateWindowEx函数创建窗口,或者直接调用函数MCIWndCreate创建窗口。 (2)获得相应的窗口句柄后,就可调用MCIWndOpen宏来打开设备。 (3)由于MCIWnd窗口提供了相应的媒体控制按钮,因而不需要用户编写额外的代码。 (4)但作为技巧,用户还应该跟踪MCIWnd窗口的一些消息(如MCIWNDM_ NOTIFYSIZE)来调整MCIWnd窗口。

10.3使用MCIWnd窗口类 [例Ex_MCI] 利用MCIWnd窗口类在多文档应用程序中添加一个多媒体播放器。 (1)用MFC AppWizard(exe)创建一个多文档项目Ex_MCI,单击[Finish]。 (2)在StdAfx.h中放入包含文件使得应用程序能使用所有的多媒体代码。由于项目中的每一个文件已经包含了StdAfx.h,所以在其他地方就不必再包含这些多媒体文件。 ... #endif // _AFX_NO_AFXCMN_SUPPORT #include <vfw.h> #pragma comment (lib,"vfw32.lib") (3)在CEx_MCIApp::InitInstance函数,使用MCIWndRegisterClass函数注册MCI窗口类。虽然,后面的创建窗口是直接调用函数MCIWndCreate来进行的,但还应该保证应用程序的运行系统拥有并支持MCIWnd窗口类。 BOOL CEx_MCIApp::InitInstance() { if (!MCIWndRegisterClass()) return FALSE; AfxEnableControlContainer(); } (4)在Ex_MCIView类中添加一个公共成员变量用来标识嵌入的MCIWnd窗口句柄。 public: CEx_MCIDoc* GetDocument(); HWND m_hMyMCIWnd;

10.3使用MCIWnd窗口类 (5)用ClassWizard为Ex_MCIView类中添加OnInitialUpdate消息处理函数,增加代码: void CEx_MCIView::OnInitialUpdate() { CView::OnInitialUpdate(); m_hMyMCIWnd=MCIWndCreate(m_hWnd,AfxGetInstanceHandle(), MCIWNDF_NOTIFYSIZE |MCIWNDF_NOERRORDLG | WS_CHILD|WS_VISIBLE,NULL); if (m_hMyMCIWnd==NULL) return; const CString &filename=GetDocument()->GetPathName(); if (filename.GetLength()>0) MCIWndOpen(m_hMyMCIWnd,(LPCSTR)filename,0); } (6)在CEx_MCIView构造函数中将成员变量m_hMyMCIWnd初始化为NULL。 CEx_MCIView::CEx_MCIView() { m_hMyMCIWnd=NULL;

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

10.3使用MCIWnd窗口类 (9)为CEx_MCIView类添加该消息的处理函数OnNotifySize,代码: LONG CEx_MCIView::OnNotifySize(UINT wParam, LONG lParam) { CRect rc; CFrameWnd* pParent=GetParentFrame(); if (m_hMyMCIWnd) { ::GetWindowRect(m_hMyMCIWnd,rc); pParent->CalcWindowRect(rc,CWnd::adjustBorder); CSize size(rc.Width(),rc.Height()); if (GetExStyle()&WS_EX_CLIENTEDGE) { size.cx+=4; size.cy+=4; } pParent->SetWindowPos(NULL,0,0,size.cx,size.cy, SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE); else { pParent->SetWindowPos(NULL,0,0,200,160, return 1;

10.3使用MCIWnd窗口类 (10)编译并运行。载入一个AVI文件(或其他媒体文件)并单击[播放]()按钮,如图。 图10.1 Ex_MCI运行结果