友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言实例教程(PDF格式)-第35部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
m_iCurPos,这样的目的是便于使用MFC提供的对话框数据检验机制。
但有个不好的地方是,如果用户输入的数据有错,出现的报错消息是
英文的。如果我们需要的是一个完全中文化的软件,这不能不算是一
…………………………………………………………Page 394……………………………………………………………
个瑕疵,这时,我们应该编写自己的数据检验代码。但是在本示例程
序中,并不需要这样要求,这里使用MFC的对话框数据检验机制是很
有效的。回到程序代码中去,如果用户在编辑控件中输入的值有效的
话,使用这个值去更新滚动条的当前位置,这是通过类CScrollBar的
成员函数SetScrollPos来实现的。
其它的一些控件,如CSliderCtrl类所封装的滑块控件等,与滚动条
控件的使用有很大的共通之处,读者完全可以根据本章中所讲述的内
容通过举一反三来用于其它的场合。
l 注意:
l 由于篇幅有限,在本章中我们不打算介绍更多的Windows控件。事
实上,Windows控件的使用的有规律可寻的。只需要弄清楚几种控
件的用法,以及MFC在处理控件时的机制,就很容易借助Visual
C++所提供的丰富的联机文档来学 习其它控件的使用。本章中所介
绍的控件,还只是所有控件中很小的一个部分,而且,即使是对
所介绍的几种控件的讲述也不是面面俱到的。我们的目的不再于
详尽的罗列各种控件的使用方法,而在于起到一种 “抛砖 引玉”
的作用。
…………………………………………………………Page 395……………………………………………………………
第七章 使用ActiveX控件
Windows本身已经提供了很多的控件,我们已经在本书前面的章节中
对这些控件作了一些介绍。但是,应用程序用户的需求是各种各样
的,而且,程序员本身的创造力也不应该因此而受到制约。然而,经
历过的人都会深深的体会到,仅仅凭借自己的力量,要想完成一个完
善的功能强大的应用程序并非易事——不是不可以,只是非常之的艰
难。绝大多数的优秀的应用程序,都凝结了很多优秀的程序员的天才
的创造力和辛勤的劳动。因此,在很多时候,我们不得不对 自己能不
能够使用Visual C++写出一个既有强大的实用功能,又具有美观的用
户界面的应用程序表示怀疑。很不幸,坦率的说,要自己从底层写
起,一个这样的应用程序常常会埋葬无数的时间。但是,当我们从一
个更大的范围来观察这一情况的时候,我们发现,事实上,就很多编
程课题而言,无数的程序员在做的仅仅是一些重复的劳动。大量优秀
的人才浪费在为同一个 目的编写功能相同的软件上。这启发了我们,
如果能够制定一套规则,程序员们在此规则的基础上开发各种各样的
功能组件,这些功能组件可以方便的用于多个应用程序。ActiveX技
术就是这样的一种技术。基于ActiveX技术的为数众多的软件组件都
提供了满足某个规范的一系列编程接口,应用程序可以通过该编程接
口使用由软件组件提供的各种功能,而无需知道这些功能在具体的软
件组件里是如何实现的。这种方式也是我们早在本书一开始的时候所
提到的面向对象的程序设计的一个主要特点。
ActiveX技术本身是一种非常复杂的技术,尽管有很多的书籍在讲述
这一内容时故意淡化这一点。要想通过很短的篇幅以很通俗的语言阐
明这个技术本身几乎是一件不可能的事。从本书的写作意图和篇幅来
考虑,我们不打算深入的讨论ActiveX本身和如何创建基于ActiveX技
术的各种软件组件,而把关心的焦点放到如何应用ActiveX控件本身
上。
本章的焦点放到两个问题上:
l 什么是ActiveX控件
l 如何在应用程序中使用ActiveX控件
第一节 什么是ActiveX控件
什么是ActiveX控件?这个问题本身也并不容易说得清楚。在下面的
内容中,我们将侧重的于控件使用者,而不是控件开发者的角度来说
明这个问题。
…………………………………………………………Page 396……………………………………………………………
ActiveX控件过去被称作OLE控件,其开发基于通常对象模型 (mon
Object Model,),它可以嵌入对话框或其它的ActiveX控件容
器,如Internet Explorer和Visual Basic应用程序中使用。ActiveX
控件取代了过去的16位的Visual Basic控件 (VBX)。
更专业一点说,ActiveX控件是这样的一个基于的对象:它可以自
己的窗口内绘制自身,可以用户的如单击鼠标或按下键盘之类的操作
事件,此外是最重要的一点,使用ActiveX控件的应用程序可以通过
该控件所包括的一系列的属性和方法(合起来称作接口)来操作该控件
的行为。
不要为ActiveX控件本身这个名词所误导,ActiveX控件并不仅仅限用
于与用户的可视交互,它还可以用于其它用途,如访问数据库、监视
数据等。ActiveX控件所能提供的功能要远远超过自定义控件的能
力。这些能力包括很多新鲜而有趣的特性,比如将控件本身所提供的
菜单嵌入到容器的菜单中等。
ActiveX控件一般以。OCX文件的形式提供,并在系统中进行注册。
对于ActiveX控件这一复杂的课题,我们现在只打算给一个最简单的
概念。下一步我们将通过一个示例来说明ActiveX控件在编程中的使
用。事实上,使用实例来说话往往对初学者往往要更具效果。
第二节 使用ActiveXMovie控件的视频播放器
在下面的过程中,我们将通过使用ActiveMovie控件创建一个视频播
放器,该播放器支持多种文件格式。按下面的步骤来创建示例程序
VideoPlayer:
1。 使用AppWizard创建一个基于对话框的MFC工程。所有步骤均使用
AppWizard给出的默认设置。在这种情况下,应用程序自动提供了对
ActiveX控件的支持。紧接着删除应用应用程序主对话框中的所有控
件,包括 “确定”和 “取消”按钮。
2。 在主对话框中单击鼠标右键,选择Insert ActiveX Control命
令。随后弹出如图7。1所示的对话框。
…………………………………………………………Page 397……………………………………………………………
图7。 1 向对话框中插入ActiveX控件
3。 在图7。1的列表框中选择ActiveMovieControl Object,并单击OK
按钮。
l 注意:
l 如果在你在如 图7。1所示的列表框中找不到项
ActiveMovieControl,则说明你的计算机系统中没有安装
ActiveMovie控件,或者ActiveMovie控件没有在你的系统中进行
正确的注册。这时,你需要安装ActiveMovie控件才可以继续创建
示例程序VideoPlayer 。可以有多个途径得到ActiveMovie控件。
你可以从Internet Explorer 4。0软件包中获得该控件,也可以从
Microsoft获得该控件的单独发布版本。
4。 这时,回到应用程序VideoPlayer的主对话框,右击新添加的控
件,选择ClassWizard为新添加的控件映射一个成员变量 (下面的步骤
将说明这个成员变量的类型)。
5。 在添加成员变量映射的过程中,ClassWizard将会弹出如图7。2所
示的对话框,以询问是否为ActiveMovieControl Object创建一个类
以封装对该控件提供的接口的调用。在该对话框中单击确定。
图7。 2 询问是否创建一个C++类以封装ActiveMovieControl对象
…………………………………………………………Page 398……………………………………………………………
图7。 3 为ActiveMovie控件创建新类CActiveMovie
在如图7。3所示的对话框中为ActiveMovieControl创建新的类
CActiveMovie。
上面的步骤也可以使用其它的途径来完成。首先,在Project菜单的
Add To Project子菜单下选择ponents and Controls命令。该命
令打开如图7。4所示的对话框,在该对话框中双击Registered
ActiveX Controls,并从中选择ActiveMovieControl Object。单击
Insert按钮,也弹出如图7。3所示的对话框。按第五步中所讲述的内
容完成类CActiveMovie。这时,在Controls工具箱中将会多一个按钮
,单击该按钮,即可像添加一般的标准控件那样添加ActiveMovie
控件。
相比较而言,后一种方法要更为直观一些。但两种方法的最后结果都
是一致的,具体到每一个编程者来说,选择哪一种完成是任意的。但
很明显,如果需要一次向对话本事 添加多于一个的同一ActiveX控
件,使用后面的方法要省事得多。
…………………………………………………………Page 399……………………………………………………………
图7。 4 从ponents and Controls Gallery中向工程添加ActiveX控件
在完成这一步骤之后,为新添加的ActiveMovie控件 (我们设置其ID为
IDC_AMOVIE)映射类型为CActiveMovie的成员变量m_amovie 。
6。 现在我们来大致的浏览一下类CActiveMovie的定义。该定义保存
在头文件ActiveMovie。h中。
#if !defined(AFX_ACTIVEMOVIE_H__9B0F9FA0_1F04_11D2_9717_0000B4810A31__INCLUDED_)
#define AFX_ACTIVEMOVIE_H__9B0F9FA0_1F04_11D2_9717_0000B4810A31__INCLUDED_
#if _MSC_VER 》= 1000
#pragma once
#endif // _MSC_VER 》= 1000
// 注意:不要修改你在这里看到的文件的内容。如果该类是由 Visual C++ 所创建的话,
// 您在这里所作的修改将会被覆盖
/////////////////////////////////////////////////////////////////////////////
// CActiveMovie 封装类
class CActiveMovie : public CWnd
{
protected:
DECLARE_DYNCREATE(CActiveMovie)
public:
…………………………………………………………Page 400……………………………………………………………
CLSID const& GetClsid()
{
static CLSID const clsid
= { 0x5589fa1; 0xc356; 0x11ce; { 0xbf; 0x1; 0x0; 0xaa; 0x0; 0x55; 0x59; 0x5a } };
return clsid;
}
virtual BOOL Create(LPCTSTR lpszClassName;
LPCTSTR lpszWindowName; DWORD dwStyle;
const RECT& rect;
CWnd* pParentWnd; UINT nID;
CCreateContext* pContext = NULL)
{ return CreateControl(GetClsid(); lpszWindowName; dwStyle; rect; pParentWnd;
nID); }
BOOL Create(LPCTSTR lpszWindowName; DWORD dwStyle;
const RECT& rect; CWnd* pParentWnd; UINT nID;
CFile* pPersist = NULL; BOOL bStorage = FALSE;
BSTR bstrLicKey = NULL)
{ return CreateControl(GetClsid(); lpszWindowName; dwStyle; rect; pParentWnd;
nID;
pPersist; bStorage; bstrLicKey); }
// Attributes
public:
// Operations
public:
void AboutBox();
void Run();
void Pause();
…………………………………………………………Page 401……………………………………………………………
void Stop();
long GetImageSourceWidth();
long GetImageSourceHeight();
CString GetAuthor();
CString GetTitle();
CString GetCopyright();
CString GetDescription();
CString GetRating();
CString GetFileName();
void SetFileName(LPCTSTR lpszNewValue);
double GetDuration();
double GetCurrentPosition();
void SetCurrentPosition(double newValue);
long GetPlayCount();
void SetPlayCount(long nNewValue);
double GetSelectionStart();
void SetSelectionStart(double newValue);
double GetSelectionEnd();
void SetSelectionEnd(double newValue);
long GetCurrentState();
double GetRate();
void SetRate(double newValue);
long GetVolume();
void SetVolume(long nNewValue);
long GetBalance();
void SetBalance(long nNewValue);
…………………………………………………………Page 402……………………………………………………………
BOOL GetEnableContextMenu();
void SetEnableContextMenu(BOOL bNewValue);
BOOL GetShowDisplay();
void SetShowDisplay(BOOL bNewValue);
BOOL GetShowControls();
void SetShowControls(BOOL bNewValue);
BOOL GetShowPositionControls();
void SetShowPositionControls(BOOL bNewValue);
BOOL GetShowSelectionControls();
void SetShowSelectionControls(BOOL bNewValue);
BOOL GetShowTracker();
void SetShowTracker(BOOL bNewValue);
BOOL GetEnablePositionControls();
void SetEnablePositionControls(BOOL bNewValue);
BOOL GetEnableSelectionControls();
void SetEnableSelectionControls(BOOL bNewValue);
BOOL GetEnableTracker();
void SetEnableTracker(BOOL bNewValue);
BOOL GetAllowHideDisplay();
void SetAllowHideDisplay(BOOL bNewValue);
BOOL GetAllowHideControls();
void SetAllowHideControls(BOOL bNewValue);
long GetDisplayMode();
void SetDisplayMode(long nNewValue);
BOOL GetAllowChangeDisplayMode();
void SetAllowChangeDisplayMode(BOOL bNewValue);
…………………………………………………………Page 403……………………………………………………………
LPUNKNOWN GetFilterGraph();
void SetFilterGraph(LPUNKNOWN newValue);
LPDISPATCH GetFilterGraphDispatch();
unsigned long GetDisplayForeColor();
void SetDisplayForeColor(unsigned long newValue);
unsigned long GetDisplayBackColor();
void SetDisplayBackColor(unsigned long newValue);
long GetMovieWindowSize();
void SetMovieWindowSize(long nNewValue);
BOOL GetFullScreenMode();
void SetFullScreenMode(BOOL bNewValue);
BOOL GetAutoStart();
void SetAutoStart(BOOL bNewValue);
BOOL GetAutoRewind();
void SetAutoRewind(BOOL bNewValue);
long GetHWnd();
long GetAppearance();
void SetAppearance(long nNewValue);
long GetBorderStyle();
void SetBorderStyle(long nNewValue);
BOOL GetEnabled();
void SetEnabled(BOOL bNewValue);
BOOL IsSoundCardEnabled();
long GetReadyState();
};
//{{AFX_INSERT_LOCATION}}
…………………………………………………………Page 404……………………………………………………………
#endif // !defined
(AFX_ACTIVEMOVIE_H__9B0F9FA0_1F04_11D2_9717_0000B4810A31__INCLUDED_)
尽管我们可以由此得知由该ActiveX控件所提供的各个接口属性和方
法的参数和返回值,但是,这些信息并不足以正确的使用该ActiveX
控件。一般来说,由第三方开发商提供的ActiveX控件都附带了对所
提供的控件的各个接口属性和方法的说明及其与使用该控件进行程序
设计所需的信息。
7。 按表创建应用程序的菜单资源IDR_MENU。
接着使用属性对话框将应用程序主对话框的菜单资源设置为
IDR_MENU。
8。 设计用于音量调节的对话框,该对话框如图7。5所示,其资源ID为
IDD_VOLUME。设计完成之后使用ClassWizard为该对话框创建新的类
CVolumeDlg,并为滑块控件映射类型为CSliderCtrl的成员变量
m_sld。
根据下面的代码在完成类CVolumeDlg,该类提供了外部编程接口
SetVolume,该公有成员函数使用一个指向CActiveMovie对象的指针
作为其参数,所进行的音量调节作用于该控件。
这里需要注意的是,拖动或点击滑块控件时,向父窗口发送的消息是
WM_HSCROLL,该消息的处理函数OnHScroll,传递给该处理函数的第
二个参数的类型为CScrollBar*,我们需要使用强调类型转换将其转
换为CSliderCtrl*,以便能正确的调用由CSliderCtrl对象所提供的
各种成员函数。
表7。 1 应用程序VideoPlayer使用的菜单资源IDR_MENU
顶层菜单
子菜单项 资源ID
项
打开 (&O) ID_FILEOPEN
关闭(&C) ID_FILECLOSE
文件 (&F)
具有Separator样式的菜
单分隔符
退出 (&X) ID_FILEEXIT
开始 (&S) ID_PLAYSTART
…………………………………………………………Page 405……………………………………………………………
暂停 (&P) ID_PLAYPAUSE
播放 (&P)
停止 (&T) ID_PLAYSTOP
原始大小(&O) ID_VIDEO1X
视频 (&V)
原始大小的2倍 (&T) ID_VIDEO2X
调节音量 (&V) ID_AUDEOVOLUME
音频 (&A)
调节左右声道平衡 (&B) ID_AUDEOBALANCE
帮助 (&H) 关于 视频播放器 (&A) ID_HELPABOUT
图7。 5 用于调节音量的对话框:IDD_VOLUME
以下是类CVolumeDlg的代码清单。为了节省篇幅和便于读者阅读和理
解,我们删除了一些由AppWizard生成的代码和注释。
// VolumeDlg。h : 头文件
//
class CActiveMovie;
/////////////////////////////////////////////////////////////////////////////
// CVolumeDlg 对话框
class CVolumeDlg : public CDialog
{
// 构造
public:
void S
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!