convert函数-菜单背景

activex 控件 下载
2023年4月1日发(作者:隐藏文件夹无法显示)

BCB讲座第⼗九讲使⽤ActiveX控件

使⽤ActiveX控件

上⼀讲中我们学习编写和使⽤DLL的基本⽅法,DLL实际上是程序模块化和实现代码重⽤的⽅式之⼀,但是由于种种原

因,DLL的可重⽤性并不是最佳的,经常会出现版本冲突问题。为此,微软提出了⼀种新的Windows编程技术——ActiveX技

术,它可以⽐DLL更好地解决⼆进制级的代码重⽤问题。

●什么是ActiveX控件

ActiveX技术是从OLE技术发展⽽来的。OLE原意是对象链接和嵌⼊,后来被扩展成为了组件与分布式编程体系结构,并改称

为ActiveX。ActiveX技术包括有组件对象模型(COM)、进程间编组(Marshaling)、结构化存储(StructuredStorage)、

对象⼀致性(ObjectPersistence)、统⼀数据传输(UniformDataTransfer)、⾃动化(Automation)等等⼤量内容,其中

的核⼼是组件对象模型COM。COM定义了⼀种统⼀的接⼝调⽤⽅式,从⽽使得COM组件能够独⽴于编程语⾔和操作系统平

台,并解决了长期困扰软件开发的版本冲突问题。COM⾮常基础,ActiveX技术的其它内容都是在它的上⾯开发出来的。

ActiveX控件是ActiveX技术的⼀种,以前也叫做OLE控件,或者称为OCX控件,这是因为它⼀般都存放在扩展名为.OCX的⽂

件中。尽管整套ActiveX技术的理论相当庞⼤并且⾮常复杂,但ActiveX控件使⽤起来要简单得多,特别是有了在CBuilder中使

⽤VCL控件的经验和基础,我们会发现ActiveX控件使⽤起来与VCL控件⼗分类似。ActiveX控件也提供了属性、⽅法和事件,

⽤于对控件的操作和完成特定的功能,并且⼀旦将某个ActiveX控件安装到CBuilder中后,我们就可以在CBuilder集成开发环

境中⽅便地使⽤ActiveX控件了,元件⾯板、对象监视器等⼯具对ActiveX控件都有效。

由于ActiveX控件为代码提供了良好的封装特性,并且具有良好的对象⼀致性,使得程序易于升级和保持兼容性,因此不论是

商业软件还是共享软件中,ActiveX控件应⽤得都⼗分⼴泛。ActiveX控件还具有独⽴于语⾔、平台和机器的特点,因此它在

Internet上也得到了⼴泛的应⽤。

下⾯我们将对MP3Collect程序进⾏⼀番改造,⽤ActiveX控件WindowsMediaPlayer代替原来的VCL播放控件

TMediaPlayer,来学习使⽤ActiveX控件的⽅法。

●怎样安装ActiveX控件

我们准备在例⼦中使⽤的是微软提供的ActiveX控件WindowsMediaPlayer(后⾯简称为

WMediaPlayer),该控件集成在Win98第⼆版以上的系统

中。需要注意的是,不同版本的WMediaPlayer控件的功

能稍有不同,特别是最新的WMediaPlayer7.0与其它版本

在⽤户界⾯上有很⼤区别,为了便于对照讲座学习,⼼铃

建议⼤家使⽤版本。从媒体播放器程序的帮助菜单中

选择“关于”命令,就可以查看WMediaPlayer控件的版

本。

除了少数⼏个之外,⼤部分ActiveX控件对CBuilder

来说是属于第三⽅控件,不能在元件⾯板上直接找到,因

此在使⽤这些控件之前,必须先把它们安装到CBuilder

中。安装步骤如下:

⾸先,选择菜单命令Component->ImportActiveX

Control,启动导⼊ActiveX控件对话框(图19-1)。该对

话框上⽅的列表框中列出了系统内已注册的所有ActiveX图19-1:导⼊ActiveX控件

控件,在其中找到“WindowsMediaPlayer”控件并选中它,这时,控件的OCX⽂件名会⾃动显⽰在列表框下的⽂本框中,为

,⽽“Classname”中显⽰了要⽣成的控件类名称,因为缺省给出的类名称与VCL的TMediaPlayer控件相冲

突,因此我们将其改为TWMediaPlayer。“PalettePage”⽤于指定安装后的控件显⽰在元件⾯板的哪⼀个元件栏中,我们选

择其中的ActiveX元件栏。“Unitdirname”和“Searchpath”是安装控件时所需的路径设置,⼀般不需要改变,接受缺省值就可

以了。确认了上述设置后,按“Install...”按钮开始安装。

接着CBuilder会弹出⼀个对话框,要求我们选择安装新控件的包,我们可以从已有的包⼯程(.bpk⽂件)中选择⼀个,也可

以新建⼀个包⼯程。这⾥我们接受缺省设置,将TWMediaPlayer安装到(该⽂件是包⽂件的⼯程

⽂件,是⽤于包含⽤户元件的包⽂件)中,然后按下确定按钮,这时CBuilder提⽰需要重建⼯程,

确定后,CBuilder就开始编译连接⼯程,完成这⼀过程需要⼀点时间。如果重建成功,CBuilder会提

⽰“被重新⽣成,元件⾯板中的元件已经更新,TWMediaPlayer控件被成功注册”,确定之后,我们会发现

CBuilder当前打开的⼯程为,应先保存,然后再重新打开原来的MP3Collect⼯程,我们可以发现

元件⾯板的ActiveX元件页中新增了WMediaPlayer控件的图标。在某些情况下,新增ActiveX控件的图标可能没有显⽰出

来,此时我们可以在Component菜单中选择InstallPackage命令,并在弹出的对话框中把BorlandUserComponents(即

)选中到设计时包⽂件和运⾏时包⽂件中即可。

安装好了⼀个ActiveX控件之后,如果⽤了⼀段时间⼜

想将它删除应该怎么办呢?⼀种⽅法是通过

Component->ConfigurePalette菜单命令,调出元件⾯板属性

对话框并找到相应元件栏的相应控件,通过“Hide”按钮将

其隐藏起来,以后需要的时候还可以⽤同样的⽅法让它重新

显⽰在元件⾯板上。第⼆种⽅法较为彻底,需要修改当初安

装控件的包⼯程。以刚才添加的WMediaPlayer控件为例,打

开包⼯程,这时会显⽰包的⼯程属性(图19-2),

我们可以看出⽂件名中包含了控件名称,如

MediaPlayer_和MediaPlayer_封装了WMediaPlayer控件,我们只需把这两个⽂件从包⼯程中删除,然后

重新编译⽣成,就可以从包中彻底删除WMediaPlayer控件了。

⽤WindowsMediaPlayer控件改造MP3Collect

安装好WMediaPlayer控件之后,我们要⽤它代替原来程序中的VCL元件MediaPlayer,来实现播放MP3⾳乐的功能,修改

后的MP3Collect程序如图19-3所⽰。在进⾏改造之前,⼼铃建议⼤家先把原来的⼯程做⼀个备份,这样如果在修改过程中出

现了错误,容易进⾏⽐对查找。

我们先把MainForm上原有的

MediaPlayer1控件删除,并在空出来的位

置上新增加⼀个WMediaPlayer控件

WMediaPlayer1。由于WMediaPlayer控件

能够播放视频,因此控件上带有视频输出

区域,我们需要适当调整控件的⼤⼩,使

得视频区域隐藏起来。

前⾯说过,当ActiveX控件安装成功

后,可以象使⽤普通VCL控件⼀样使⽤

它。但是使⽤ActiveX控件时常会遇到帮

助⽂档不全的问题,特别是从⽹上下载的

⼀些共享ActiveX控件,由于帮助⽂档很

少,常常让⼈“望X兴叹”

。⼼铃在使⽤图19-2:包⼯程的组成

图19-3:使⽤WMediaPlayer控件的MP3Collect

WMediaPlayer控件时也遇到这个问题,该控件是由微软编写的,CBuilder中并没有相关的帮助,幸好经过多次搜索后,⼼铃

终于从微软的PlatformSDK中找到了⼀些帮助,根据这些帮助,⼼铃在下⾯的表格中对WMediaPlayer控件需要设置的主要属

性的⼤致含义进⾏了介绍,其中可能会有理解不是⼗分准确的地⽅,请朋友们注意这⼀点。

表19-1:WMediaPlayer1控件主要属性的设置

设置好控件的属性后,还要对代码进⾏修改,将原来由MediaPlayer1控件实现的功能改为由WMediaPlayer1实现。

⽤WMediaPlayer控件播放⼀个媒体⽂件的基本⽅法是:⾸先将⽂件名赋给WMediaPlayer1的FileName属性,再调⽤其Open

⽅法打开该⽂件。由于Open⽅法不等待打开成功就会返回,所以不能够马上进⾏下⼀步Play操作,⽽需要等待事件

OnOpenStateChange,在该事件的处理函数中判断⽂件是否打开正确,如果打开正确,则可以进⼀步调⽤其Play函数进⾏播

放。下⾯给出函数PlayTheSong和OnOpenStateChange事件处理函数的实现代码:

void__fastcallTMainForm::PlayTheSong(){

WMediaPlayer1->FileName=DBGrid1->DataSource->DataSet->FieldByName("FileName")->AsString;

WMediaPlayer1->Open(WMediaPlayer1->FileName);

m_bIsPlaying=true;//设置m_bIsPlaying标志,表⽰打开成功后进⾏播放操作

}

void__fastcallTMainForm::WMediaPlayer1OpenStateChange(TObject*Sender,longbytesSent,longbytesRemaining){

//OpenState为6表⽰打开正确,m_bIsPlaying为真表⽰下⼀步应该进⾏播放操作

if(WMediaPlayer1->OpenState==6&&m_bIsPlaying){//两个条件同时满⾜时开始播放。

m_bIsPlaying=false;

WMediaPlayer1->Play();

}

}

在播放过程中,我们还需要根据播放状态的变化将⼀些命令按钮设置成有效或⽆效。这⼀功能在OnPlayStateChange事件中

完成。播放到⽂件结尾处时,WMediaPlayer控件会产⽣OnEndOfStream事件,我们可以在这⼀事件中判断是否需要循环播

放,如果是则播放下⼀⾸。

void__fastcallTMainForm::WMediaPlayer1PlayStateChange(TObject*Sender,longbytesSent,longbytesRemaining){

if(bytesRemaining==2)//bytesRemaining为2表⽰播放开始

EnableButtons(false);//使记录操作按钮失效

elseif(bytesRemaining==0)//bytesRemaining为0表⽰播放结束

EnableButtons(true);//使记录操作按钮失效

}

void__fastcallTMainForm::WMediaPlayer1EndOfStream(TObject*Sender,longbytesTotal){TDataSet*pDS=DBGrid1-

>DataSource->DataSet;

if(chkLoop->Checked){

pDS->Next();

if(pDS->Eof)pDS->First();

PlayTheSong();

}

elseEnableButtons(true);

}

当Query1控件当前记录发⽣改变时,在WMediaPlayer1中打开相应⽂件的实现代码如下:void__fastcall

TMainForm::Query1AfterScroll(TDataSet*DataSet){

if(Query1->State==dsBrowse){

TDataSet*pDS=DBGrid1->DataSource->DataSet;

if(!pDS->IsEmpty()){

//定位Table1控件,并在编辑框中显⽰相应的记录信息

…//(此处同以前的代码,故省略)

m_bIsPlaying=false;//打开成功后不播放。

WMediaPlayer1->FileName=Query1->FieldByName("FileName")->AsString;

WMediaPlayer1->Open(WMediaPlayer1->FileName);//打开媒体⽂件

}

}

}

本讲我们学习ActiveX控件的基本使⽤⽅法,可以说,ActiveX控件使⽤起来并不复杂,但这项技术本⾝涉及到⾮常多的概念,

朋友们在使⽤ActiveX控件的过程中如果遇到问题,最好多查阅相关资料,特别是开发者提供的开发⽂档。

另外,由于中华⽹对个⼈主页服务器进⾏了调整,⼼铃原来告诉⼤家的讲座下载地址有⼀些变化,请需要电⼦⽂档的朋友使⽤

新地址去下载:/doc/

/。

更多推荐

activex 控件 下载