📄 chap07.html
字号:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb_2312-80">
<META NAME="Generator" CONTENT="Microsoft Word 97">
<TITLE>第五章 使用Windows标准控件</TITLE>
<META NAME="Template" CONTENT="E:\Office95\Template\Manuscripts\16 开图书模板.dot">
</HEAD>
<BODY>
<FONT FACE="黑体" LANG="ZH-CN" SIZE=5><P ALIGN="CENTER"><A NAME="_Toc425697761">第七章</FONT><FONT FACE="Arial" SIZE=5> </FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>使用</FONT><FONT FACE="Arial" SIZE=5>ActiveX</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=5>控件</A></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">Windows</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>本身已经提供了很多的控件,我们已经在本书前面的章节中对这些控件作了一些介绍。但是,应用程序用户的需求是各种各样的,而且,程序员本身的创造力也不应该因此而受到制约。然而,经历过的人都会深深的体会到,仅仅凭借自己的力量,要想完成一个完善的功能强大的应用程序并非易事</FONT><FONT SIZE=3>——</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>不是不可以,只是非常之的艰难。绝大多数的优秀的应用程序,都凝结了很多优秀的程序员的天才的创造力和辛勤的劳动。因此,在很多时候,我们不得不对自己能不能够使用</FONT><FONT SIZE=3>Visual C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>写出一个既有强大的实用功能,又具有美观的用户界面的应用程序表示怀疑。很不幸,坦率的说,要自己从底层写起,一个这样的应用程序常常会埋葬无数的时间。但是,当我们从一个更大的范围来观察这一情况的时候,我们发现,事实上,就很多编程课题而言,无数的程序员在做的仅仅是一些重复的劳动。大量优秀的人才浪费在为同一个目的编写功能相同的软件上。这启发了我们,如果能够制定一套规则,程序员们在此规则的基础上开发各种各样的功能组件,这些功能组件可以方便的用于多个应用程序。</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>技术就是这样的一种技术。基于</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>技术的为数众多的软件组件都提供了满足某个规范的一系列编程接口,应用程序可以通过该编程接口使用由软件组件提供的各种功能,而无需知道这些功能在具体的软件组件里是如何实现的。这种方式也是我们早在本书一开始的时候所提到的面向对象的程序设计的一个主要特点。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>技术本身是一种非常复杂的技术,尽管有很多的书籍在讲述这一内容时故意淡化这一点。要想通过很短的篇幅以很通俗的语言阐明这个技术本身几乎是一件不可能的事。从本书的写作意图和篇幅来考虑,我们不打算深入的讨论</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>本身和如何创建基于</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>技术的各种软件组件,而把关心的焦点放到如何应用</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件本身上。</P>
<P ALIGN="JUSTIFY">本章的焦点放到两个问题上:</P>
<UL>
<P ALIGN="JUSTIFY"><LI>什么是</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件</LI></P>
<P ALIGN="JUSTIFY"><LI>如何在应用程序中使用</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件</LI></P></UL>
</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425697762">第一节</FONT><FONT SIZE=4> </FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>什么是</FONT><FONT SIZE=4>ActiveX</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>控件</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">什么是</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件?这个问题本身也并不容易说得清楚。在下面的内容中,我们将侧重的于控件使用者,而不是控件开发者的角度来说明这个问题。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件过去被称作</FONT><FONT SIZE=3>OLE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件,其开发基于通常对象模型</FONT><FONT SIZE=3>(Common Object Model</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,</FONT><FONT SIZE=3>COM)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,它可以嵌入对话框或其它的</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件容器,如</FONT><FONT SIZE=3>Internet Explorer</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>Visual Basic</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>应用程序中使用。</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件取代了过去的</FONT><FONT SIZE=3>16</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>位的</FONT><FONT SIZE=3>Visual Basic</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件</FONT><FONT SIZE=3>(VBX)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY">更专业一点说,</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件是这样的一个基于</FONT><FONT SIZE=3>COM</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的对象:它可以自己的窗口内绘制自身,可以用户的如单击鼠标或按下键盘之类的操作事件,此外是最重要的一点,使用</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件的应用程序可以通过该控件所包括的一系列的属性和方法</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>合起来称作接口</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来操作该控件的行为。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">不要为</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件本身这个名词所误导,</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件并不仅仅限用于与用户的可视交互,它还可以用于其它用途,如访问数据库、监视数据等。</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件所能提供的功能要远远超过自定义控件的能力。这些能力包括很多新鲜而有趣的特性,比如将控件本身所提供的菜单嵌入到容器的菜单中等。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件一般以</FONT><FONT SIZE=3>.OCX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文件的形式提供,并在系统中进行注册。</P>
<P ALIGN="JUSTIFY">对于</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件这一复杂的课题,我们现在只打算给一个最简单的概念。下一步我们将通过一个示例来说明</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件在编程中的使用。事实上,使用实例来说话往往对初学者往往要更具效果。</P>
</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4><P ALIGN="CENTER"><A NAME="_Toc425697763">第二节</FONT><FONT SIZE=4> </FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>使用</FONT><FONT SIZE=4>ActiveXMovie</FONT><FONT FACE="仿宋_GB2312" LANG="ZH-CN" SIZE=4>控件的视频播放器</A></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在下面的过程中,我们将通过使用</FONT><FONT SIZE=3>ActiveMovie</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件创建一个视频播放器,该播放器支持多种文件格式。按下面的步骤来创建示例程序</FONT><FONT SIZE=3>VideoPlayer</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>:</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">1.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>使用</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>创建一个基于对话框的</FONT><FONT SIZE=3>MFC</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>工程。所有步骤均使用</FONT><FONT SIZE=3>AppWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>给出的默认设置。在这种情况下,应用程序自动提供了对</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件的支持。紧接着删除应用应用程序主对话框中的所有控件,包括“确定”和“取消”按钮。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在主对话框中单击鼠标右键,选择</FONT><FONT SIZE=3>Insert ActiveX Control</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>命令。随后弹出如图</FONT><FONT SIZE=3>7.1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的对话框。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image359.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image359.gif" WIDTH=280 HEIGHT=199></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>7. 1 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>向对话框中插入</FONT><FONT SIZE=1>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>控件</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">3.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在图</FONT><FONT SIZE=3>7.1</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的列表框中选择</FONT><FONT SIZE=3>ActiveMovieControl Object</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,并单击</FONT><FONT SIZE=3>OK</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>按钮。</P>
<UL>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>注意:</LI></P>
</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"><LI>如果在你在如图</FONT><FONT SIZE=3>7.1</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>所示的列表框中找不到项</FONT><FONT SIZE=3>ActiveMovieControl</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>,则说明你的计算机系统中没有安装</FONT><FONT SIZE=3>ActiveMovie</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>控件,或者</FONT><FONT SIZE=3>ActiveMovie</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>控件没有在你的系统中进行正确的注册。这时,你需要安装</FONT><FONT SIZE=3>ActiveMovie</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>控件才可以继续创建示例程序</FONT><FONT SIZE=3>VideoPlayer</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>。可以有多个途径得到</FONT><FONT SIZE=3>ActiveMovie</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>控件。你可以从</FONT><FONT SIZE=3>Internet Explorer 4.0</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>软件包中获得该控件,也可以从</FONT><FONT SIZE=3>Microsoft</FONT><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>获得该控件的单独发布版本。</LI></P></UL>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">4.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>这时,回到应用程序</FONT><FONT SIZE=3>VideoPlayer</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的主对话框,右击新添加的控件,选择</FONT><FONT SIZE=3>ClassWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为新添加的控件映射一个成员变量</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>下面的步骤将说明这个成员变量的类型</FONT><FONT SIZE=3>)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">5.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在添加成员变量映射的过程中,</FONT><FONT SIZE=3>ClassWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>将会弹出如图</FONT><FONT SIZE=3>7.2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的对话框,以询问是否为</FONT><FONT SIZE=3>ActiveMovieControl Object</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>创建一个类以封装对该控件提供的接口的调用。在该对话框中单击确定。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image360.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image360.gif" WIDTH=321 HEIGHT=80></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>7. 2 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>询问是否创建一个</FONT><FONT SIZE=1>C++</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>类以封装</FONT><FONT SIZE=1>ActiveMovieControl</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>对象</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image361.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image361.gif" WIDTH=288 HEIGHT=278></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>7. 3 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>为</FONT><FONT SIZE=1>ActiveMovie</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>控件创建新类</FONT><FONT SIZE=1>CActiveMovie</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在如图</FONT><FONT SIZE=3>7.3</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的对话框中为</FONT><FONT SIZE=3>ActiveMovieControl</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>创建新的类</FONT><FONT SIZE=3>CActiveMovie</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">上面的步骤也可以使用其它的途径来完成。首先,在</FONT><FONT SIZE=3>Project</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>菜单的</FONT><FONT SIZE=3>Add To Project</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>子菜单下选择</FONT><FONT SIZE=3>Components and Controls</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>命令。该命令打开如图</FONT><FONT SIZE=3>7.4</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的对话框,在该对话框中双击</FONT><FONT SIZE=3>Registered ActiveX Controls</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,并从中选择</FONT><FONT SIZE=3>ActiveMovieControl Object</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。单击</FONT><FONT SIZE=3>Insert</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>按钮,也弹出如图</FONT><FONT SIZE=3>7.3</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示的对话框。按第五步中所讲述的内容完成类</FONT><FONT SIZE=3>CActiveMovie</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。这时,在</FONT><FONT SIZE=3>Controls</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>工具箱中将会多一个按钮<IMG SRC="Image362.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image362.gif" WIDTH=24 HEIGHT=22>,单击该按钮,即可像添加一般的标准控件那样添加</FONT><FONT SIZE=3>ActiveMovie</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">相比较而言,后一种方法要更为直观一些。但两种方法的最后结果都是一致的,具体到每一个编程者来说,选择哪一种完成是任意的。但很明显,如果需要一次向对话本事</FONT><FONT SIZE=3> </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>添加多于一个的同一</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件,使用后面的方法要省事得多。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER"><IMG SRC="Image363.gif" tppabs="http://166.111.167.223/computer/cai/visual_c++_5.0_programming/Image363.gif" WIDTH=371 HEIGHT=278></P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">图</FONT><FONT SIZE=1>7. 4 </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>从</FONT><FONT SIZE=1>Components and Controls Gallery</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>中向工程添加</FONT><FONT SIZE=1>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>控件</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY">在完成这一步骤之后,为新添加的</FONT><FONT SIZE=3>ActiveMovie</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件</FONT><FONT SIZE=3>(</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>我们设置其</FONT><FONT SIZE=3>ID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为</FONT><FONT SIZE=3>IDC_AMOVIE)</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>映射类型为</FONT><FONT SIZE=3>CActiveMovie</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的成员变量</FONT><FONT SIZE=3>m_amovie</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">6.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>现在我们来大致的浏览一下类</FONT><FONT SIZE=3>CActiveMovie</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的定义。该定义保存在头文件</FONT><FONT SIZE=3>ActiveMovie.h</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>中。</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P>#if !defined(AFX_ACTIVEMOVIE_H__9B0F9FA0_1F04_11D2_9717_0000B4810A31__INCLUDED_)</P>
<P>#define AFX_ACTIVEMOVIE_H__9B0F9FA0_1F04_11D2_9717_0000B4810A31__INCLUDED_</P>
<P>#if _MSC_VER >= 1000</P>
<P>#pragma once</P>
<P>#endif // _MSC_VER >= 1000</P>
<P>// 注意:不要修改你在这里看到的文件的内容。如果该类是由 Visual C++ 所创建的话,</P>
<P>// 您在这里所作的修改将会被覆盖</P>
<P>/////////////////////////////////////////////////////////////////////////////</P>
<P>// CActiveMovie 封装类</P>
<P>class CActiveMovie : public CWnd</P>
<P>{</P>
<P>protected:</P>
<P>	DECLARE_DYNCREATE(CActiveMovie)</P>
<P>public:</P>
<P>	CLSID const& GetClsid()</P>
<P>	{</P>
<P>		static CLSID const clsid</P>
<P>			= { 0x5589fa1, 0xc356, 0x11ce, { 0xbf, 0x1, 0x0, 0xaa, 0x0, 0x55, 0x59, 0x5a } };</P>
<P>		return clsid;</P>
<P>	}</P>
<P>	virtual BOOL Create(LPCTSTR lpszClassName,</P>
<P>		LPCTSTR lpszWindowName, DWORD dwStyle,</P>
<P>		const RECT& rect,</P>
<P>		CWnd* pParentWnd, UINT nID,</P>
<P>		CCreateContext* pContext = NULL)</P>
<P>	{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); }</P>
<P> BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,</P>
<P>		const RECT& rect, CWnd* pParentWnd, UINT nID,</P>
<P>		CFile* pPersist = NULL, BOOL bStorage = FALSE,</P>
<P>		BSTR bstrLicKey = NULL)</P>
<P>	{ return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,</P>
<P>		pPersist, bStorage, bstrLicKey); }</P>
<P>// Attributes</P>
<P>public:</P>
<P>// Operations</P>
<P>public:</P>
<P>	void AboutBox();</P>
<P>	void Run();</P>
<P>	void Pause();</P>
<P>	void Stop();</P>
<P>	long GetImageSourceWidth();</P>
<P>	long GetImageSourceHeight();</P>
<P>	CString GetAuthor();</P>
<P>	CString GetTitle();</P>
<P>	CString GetCopyright();</P>
<P>	CString GetDescription();</P>
<P>	CString GetRating();</P>
<P>	CString GetFileName();</P>
<P>	void SetFileName(LPCTSTR lpszNewValue);</P>
<P>	double GetDuration();</P>
<P>	double GetCurrentPosition();</P>
<P>	void SetCurrentPosition(double newValue);</P>
<P>	long GetPlayCount();</P>
<P>	void SetPlayCount(long nNewValue);</P>
<P>	double GetSelectionStart();</P>
<P>	void SetSelectionStart(double newValue);</P>
<P>	double GetSelectionEnd();</P>
<P>	void SetSelectionEnd(double newValue);</P>
<P>	long GetCurrentState();</P>
<P>	double GetRate();</P>
<P>	void SetRate(double newValue);</P>
<P>	long GetVolume();</P>
<P>	void SetVolume(long nNewValue);</P>
<P>	long GetBalance();</P>
<P>	void SetBalance(long nNewValue);</P>
<P>	BOOL GetEnableContextMenu();</P>
<P>	void SetEnableContextMenu(BOOL bNewValue);</P>
<P>	BOOL GetShowDisplay();</P>
<P>	void SetShowDisplay(BOOL bNewValue);</P>
<P>	BOOL GetShowControls();</P>
<P>	void SetShowControls(BOOL bNewValue);</P>
<P>	BOOL GetShowPositionControls();</P>
<P>	void SetShowPositionControls(BOOL bNewValue);</P>
<P>	BOOL GetShowSelectionControls();</P>
<P>	void SetShowSelectionControls(BOOL bNewValue);</P>
<P>	BOOL GetShowTracker();</P>
<P>	void SetShowTracker(BOOL bNewValue);</P>
<P>	BOOL GetEnablePositionControls();</P>
<P>	void SetEnablePositionControls(BOOL bNewValue);</P>
<P>	BOOL GetEnableSelectionControls();</P>
<P>	void SetEnableSelectionControls(BOOL bNewValue);</P>
<P>	BOOL GetEnableTracker();</P>
<P>	void SetEnableTracker(BOOL bNewValue);</P>
<P>	BOOL GetAllowHideDisplay();</P>
<P>	void SetAllowHideDisplay(BOOL bNewValue);</P>
<P>	BOOL GetAllowHideControls();</P>
<P>	void SetAllowHideControls(BOOL bNewValue);</P>
<P>	long GetDisplayMode();</P>
<P>	void SetDisplayMode(long nNewValue);</P>
<P>	BOOL GetAllowChangeDisplayMode();</P>
<P>	void SetAllowChangeDisplayMode(BOOL bNewValue);</P>
<P>	LPUNKNOWN GetFilterGraph();</P>
<P>	void SetFilterGraph(LPUNKNOWN newValue);</P>
<P>	LPDISPATCH GetFilterGraphDispatch();</P>
<P>	unsigned long GetDisplayForeColor();</P>
<P>	void SetDisplayForeColor(unsigned long newValue);</P>
<P>	unsigned long GetDisplayBackColor();</P>
<P>	void SetDisplayBackColor(unsigned long newValue);</P>
<P>	long GetMovieWindowSize();</P>
<P>	void SetMovieWindowSize(long nNewValue);</P>
<P>	BOOL GetFullScreenMode();</P>
<P>	void SetFullScreenMode(BOOL bNewValue);</P>
<P>	BOOL GetAutoStart();</P>
<P>	void SetAutoStart(BOOL bNewValue);</P>
<P>	BOOL GetAutoRewind();</P>
<P>	void SetAutoRewind(BOOL bNewValue);</P>
<P>	long GetHWnd();</P>
<P>	long GetAppearance();</P>
<P>	void SetAppearance(long nNewValue);</P>
<P>	long GetBorderStyle();</P>
<P>	void SetBorderStyle(long nNewValue);</P>
<P>	BOOL GetEnabled();</P>
<P>	void SetEnabled(BOOL bNewValue);</P>
<P>	BOOL IsSoundCardEnabled();</P>
<P>	long GetReadyState();</P>
<P>};</P>
<P>//{{AFX_INSERT_LOCATION}}</P>
<P>#endif // !defined(AFX_ACTIVEMOVIE_H__9B0F9FA0_1F04_11D2_9717_0000B4810A31__INCLUDED_)</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">尽管我们可以由此得知由该</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件所提供的各个接口属性和方法的参数和返回值,但是,这些信息并不足以正确的使用该</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件。一般来说,由第三方开发商提供的</FONT><FONT SIZE=3>ActiveX</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控件都附带了对所提供的控件的各个接口属性和方法的说明及其与使用该控件进行程序设计所需的信息。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">7.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>按表创建应用程序的菜单资源</FONT><FONT SIZE=3>IDR_MENU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY">接着使用属性对话框将应用程序主对话框的菜单资源设置为</FONT><FONT SIZE=3>IDR_MENU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">8.	</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>设计用于音量调节的对话框,该对话框如图</FONT><FONT SIZE=3>7.5</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>所示,其资源</FONT><FONT SIZE=3>ID</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为</FONT><FONT SIZE=3>IDD_VOLUME</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。设计完成之后使用</FONT><FONT SIZE=3>ClassWizard</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>为该对话框创建新的类</FONT><FONT SIZE=3>CVolumeDlg</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,并为滑块控件映射类型为</FONT><FONT SIZE=3>CSliderCtrl</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的成员变量</FONT><FONT SIZE=3>m_sld</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>。</P>
<P ALIGN="JUSTIFY">根据下面的代码在完成类</FONT><FONT SIZE=3>CVolumeDlg</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,该类提供了外部编程接口</FONT><FONT SIZE=3>SetVolume</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,该公有成员函数使用一个指向</FONT><FONT SIZE=3>CActiveMovie</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象的指针作为其参数,所进行的音量调节作用于该控件。</P>
<P ALIGN="JUSTIFY"></P>
<P ALIGN="JUSTIFY">这里需要注意的是,拖动或点击滑块控件时,向父窗口发送的消息是</FONT><FONT SIZE=3>WM_HSCROLL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,该消息的处理函数</FONT><FONT SIZE=3>OnHScroll</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,传递给该处理函数的第二个参数的类型为</FONT><FONT SIZE=3>CScrollBar*</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,我们需要使用强调类型转换将其转换为</FONT><FONT SIZE=3>CSliderCtrl*</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,以便能正确的调用由</FONT><FONT SIZE=3>CSliderCtrl</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>对象所提供的各种成员函数。</P>
</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=1><P ALIGN="CENTER">表</FONT><FONT FACE="Arial" SIZE=1>7. 1 </FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=1>应用程序</FONT><FONT FACE="Arial" SIZE=1>VideoPlayer</FONT><FONT FACE="黑体" LANG="ZH-CN" SIZE=1>使用的菜单资源</FONT><FONT FACE="Arial" SIZE=1>IDR_MENU</P></FONT>
<P ALIGN="CENTER"><CENTER><TABLE BORDER CELLSPACING=2 BORDERCOLOR="#808080" CELLPADDING=7 WIDTH=430>
<TR><TD WIDTH="20%" VALIGN="MIDDLE">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">顶层菜单项</FONT></TD>
<TD WIDTH="46%" VALIGN="MIDDLE">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">子菜单项</FONT></TD>
<TD WIDTH="34%" VALIGN="MIDDLE">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">资源</FONT><FONT SIZE=1>ID</FONT></TD>
</TR>
<TR><TD WIDTH="20%" VALIGN="MIDDLE" ROWSPAN=4>
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">文件</FONT><FONT SIZE=1>(&F)</FONT></TD>
<TD WIDTH="46%" VALIGN="MIDDLE">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">打开</FONT><FONT SIZE=1>(&O)</FONT></TD>
<TD WIDTH="34%" VALIGN="MIDDLE">
<FONT SIZE=1><P ALIGN="JUSTIFY">ID_FILEOPEN</FONT></TD>
</TR>
<TR><TD WIDTH="46%" VALIGN="MIDDLE">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">关闭</FONT><FONT SIZE=1>(&C)</FONT></TD>
<TD WIDTH="34%" VALIGN="MIDDLE">
<FONT SIZE=1><P ALIGN="JUSTIFY">ID_FILECLOSE</FONT></TD>
</TR>
<TR><TD WIDTH="46%" VALIGN="MIDDLE">
<FONT FACE="宋体" LANG="ZH-CN" SIZE=1><P ALIGN="JUSTIFY">具有</FONT><FONT SIZE=1>Separator</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=1>样式的菜单分隔符</FONT></TD>
<TD WIDTH="34%" VALIGN="MIDDLE"> </TD>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -