Qt编程进阶(103):在Windows上使用ActiveX

Microsoft的ActiveX技术允许应用程序与其他应用程序或者库提供的用户接口组件一起工作。它构建于Microsoft的COM基础上,为使用组件的应用程序定义了一套接口,并且为提供组件的应用程序和库提供了另外一套接口。

Qt/Windows桌面版(Qt/Windows Desktop Edition)提供了ActiveQt框架,用以为ActiveX和Qt提供完美结合。ActiveQt由两个模块组成:

  • QAxContainer模块允许我们使用COM对象并且可以在Qt应用程序中嵌入ActiveX控件。
  • QAxServer模块允许我们导出使用Qt编写的自定义的COM对象和ActiveX控件。

本文的例子将会在一个使用了QAxContainer模块的Qt应用程序中嵌入一个Windows Media Player(如下图所示)。这个Qt应用程序在Windows Media Player的ActiveX控件上添加了一个Open按钮、一个Play/Pause按钮、一个Stop按钮以及一个滑动条。

需要获取所调用ActiveX控件的常用参数和成员函数。可通过如下方法获取。

(1)获取控件的CLSID。比如调用WMP,首先需要知道WMP的CLSID,这里为:{22D6F312-B0F6-11D0-94AB-0080C74C7E95}。

(2)Qt提供了dumpdoc命令来自动生成对应CLSID控件的说明文档,打开编译器命令行,输入指令格式为:

(3)查看生成的.html文件,获取参数、信号和槽函数。

(1)新建项目,名称为“mediaplayer”。

(2)在项目文件.pro中添加如下语句:

(3)新建C++类,名称为“PlayerWindow”,基类为QWidget。

(4)在代码中添加如下头文件:

这个应用程序主窗口的类是PlayerWindow:

PlayerWindow类继承了QWidget。这里的Q_ENUMS()宏(就像下面的Q_OBJECT一样)是必需的,用来告诉moc:在onReadyStateChange()槽中使用的MPReadyStateConstants类型是一个枚举类型。在private段,我们声明了一个QAxWidget*的成员变量。

分段查看构造函数的代码:

在构造函数中,我们从创建一个QAxWidget对象封装Windows Media Player的ActiveX控件开始。QAxContainer模块由三个类组成:QAxObject封装一个COM对象,QAxWidget封装一个ActiveX控件,而QAxBase则为QAxObject和QAxWidget实现了COM的核心功能。这三个类之间的关系如下图所示。

我们使用Windows Media Player 6.4控件的类的ID作为参数,对QAxWidget调用setControl()。这样将会创建一个所需的实例。从那时起,这个ActiveX控件的所有属性,事件和方法都可以通过QAxWidget对象而作为Qt的属性、信号和槽来加以使用。

如下图中总结的那样,COM数据类型可以自动转换为相应的Qt类型。例如,一个类型为VARIANT_BOOL的输入参数可以转换成一个boo变量,并且一个类型为VARIANT_BOOL的输出参数也可以转换成一个bool &变量。如果结果类型是一个Qt类(比如像QString,QDateTime等),那么输入参数的类型将会是一个常量引用(例如,const QString &)。

我们继续查看PlayerWindow的构造函数:

在调用QAxWidget::setControl()之后,通过调用QObject::setProperty(),可以把这个Windows Media Player的ShowControls属件设置为false,因为我们自己提供了用来操作这个组件的按钮。函数QObject::setProperty()既可以用于COM属性又可以用于普通的Qt属性。它的第二个参数的类型是QVariant。

接下来调用setSizePolicy(),让这个ActiveX控件占有布局中所有可用的空间,并且把COM组件中的ActiveX事件连接到槽中。

除了把一些Qt信号和这个COM对象提供的槽[Play() ,Pause()和Stop()]连接起来以外,Playerwindow构造函数中的其余部分都与我们在平常模式下的情况一样。由于这些按钮的功能实现都有相似性,所以这里只给出了Stop按钮的实现代码。

让我们离开这个构造函数,来看一看timerEvent()函数:

当正在播放一个多媒体片断的时候,每隔一定时间就会调用函数一次。我们使用它推进滑动条的滑块。通过调用ActiveX控件上的property()获得CurrentPosition属性的QVariant类型的值,然后调用toDouble()把它转换成double值,就可以实现滑块的推进。然后,我们调用onPositionChange()来执行更新。

当拖动滑块时,视频当前位置通过下面的函数更新:

这里调用了setProperty()函数对属性进行设置。我们不再查看其余的代码了,因为它们中的绝大多数都不直接和ActiveX相关。

在处理多个COM对象时,经常需要能够直接调用一个COM方法(而不是把它连接到一个Qt信号上)。要做到这一点,最容易的方法就是使用这个方法的名字和签名作为调用QAxBase::dynamicCall()的第一个形式参数,并且把这个方法的实际参数作为额外参数。例如:

这个dynamicCall()函数最多可以带8个QVariant类型的参数,并且它可以返回—个QVariant。如果需要使用这种方法传递IDispatch *或者IUnkown *,就可以把这个组件封装到一个QAxObject中,并且对它调用asVariant(),以将其转换成一个QVariant()。如果需要调用能够返问Dispatch *或IUnkown *的COM方法,或者如果需要访问一个具有上述类型之一的COM属性,那么就可以使用querySubObject()来代替:

如果我们希望调用一些函数,而这些函数的参数列表中还有一些不支持的数据类型,那么就可以使用QAxBase::querylnterface()来取得COM的接口并且直接调用这个函数。就像往常使用COM一样,在我们已经完成了对COM接口的使用时,必须调用Release()。如果需要经常调用这样的函数,那么可以派生QAxObject或者QAxWidget,并且再提供一些封装这些COM接口调用的成员函数即可。需要注意的是,这些QAxObject和QAxWidget的子类不能定义它们自己的属性、信号或槽。

——————————————————

对于本文实例完整代码有需要的朋友,可关注并在评论区留言!

Win11 没了 IE 浏览器,教你如何在 Edge 中开启 IE 模式

IT之家 7 月 2 日消息 微软 Win11 于 6 月末正式发布,首个预览版 WinBuild.160101.0800 也已推出。此前的 Win10 21H1 内置 Chromium 内核的新版 Edge 浏览器,但 IE 依旧保留了下来,而 Win11 彻底将 IE 移除。为了解决这一问题,最新的 Edge 91.0.864.64 正式版内置了 IE 模式,在访问特定网站时,可以开启这一模式来保证兼容性。

根据IT之家网友投稿,在浏览器设置中点击左侧“默认浏览器”选项,然后在弹出的页面中打开“允许在 Internet Explorer 模式下重新加载网站”开关。随后重启浏览器,IE 模式即可开启。

在访问需要使用 IE 模式的页面时,单击 Edge 浏览器右上角的“・・・”按钮,在“更多工具”中即可看到在 Internet Explorer 模式下重新加载的选项。单击后,页面会自动刷新,并切换到 IE 模式。

IT之家打开了一家银行网站的登陆页面,可以看出页面顶部出现了提示栏,告知用户当前模式。不仅如此,IE 模式下还支持 ActiveX 控件,允许后顺利运行。

IT之家了解到,目前很多银行网页登陆时,均需要加载 ActiveX 控件。Edge 浏览器的 IE 模式,完美兼容网银登陆功能,因此用户不需要为这个问题而对于升级 Windows 11 有顾虑。除此之外,Win10 上的 Edge 浏览器与 Win11 版本相同,同样可以按照步骤开启 IE 模式。

由于IT之家仅仅测试了有限几家网银的 ActiveX 控件,Edge IE 模式对于其它网站控件的兼容性还需要用户自行测试。

学习VB编程第82天 ACTIVEX控件

今天学习的是ActiveX控件,ActiveX控件本质上是一段可重复使用的代码和数据。ActiveX控件是由Microsoft公司主导开发的一种新的编程技术,该技术的目的是让对象模型完全独立于编程语言。也就是说,通过任何一种编程语言编写的Activex控件,在其他编程语言中也可以方便地调用。例如,用Visual Basic编写的Activex控件在Visual C++中也可以调用。在一定程度上,用户可以将ActiveX技术看做是构建应用程序的组件,可以通过ActiveX控件给出的属性、方法及事件等接口来完成应用程序功能的设计。Activex控件在Visual Basic 6.0中可以很方便地加载,加载到工具箱中后即可如同使用内部控件一样使用ActiveX控件。

一、创建ActiveX控件的步骤

Visual Basic 6.0提供了用于创建ActiveX控件的向导。创建ActiveX控件的共有六个步骤:

第一步:创建一个“ActiveX控件”工程。

第二步:在窗体上设计ActiveX控件的外观。

第三步:为ActiveX控件编写代码。

第四步:定制ActiveX控件的属性、方法和事件。

第五步:生成ActiveX控件。

第六步:在系统中注册ActiveX控件。

案例:做一个activex数字时钟控件,以显示当前时间。

(一)第一步:启动Visual Basic 6.0,在弹出的“新建工程”对话框中选择Activex控件”。单击“确定”按钮,即可创建一个ActiveX控件工程。用户也可以通过选择“文件”→“新建工程”命令,来打开“新建工程”对话框。然后选择ActiveX控件,单击“确定”按钮完成ActiveX工程的创建。

(二)第二步:在创建完成ActiveX控件工程后,接下来应该根据需要来设计ActiveX控件的外观。此时,整个ActiveX控件工程中包含了以下三部分。一个名为“UserControl1”的UserControl对象、“工程窗口”及“UserControl1\”的属性页。

(三)第三步:为ActiveX控件添加代码。首先获取系统时间,然后通过label控件的caption值将时间值引入控件中。在定时器的Timer事件中每隔一秒刷新显示一次时间。

Private Sub Timer1_Timer()

label1.Caption = Timer()

End Sub

(四)第四步:为ActiveX控件添加属性、方法和事件。Visual Basic 6.0中为控件添加属性、方法和事件可以有如下两种方式。方法一:通过“工程”→“添加用户控件”命令,选择“VB Activex控件界面向导”选项,借助于向导来添加属性、方法和事件,如图所示。用户只需按照提示进行,根据自己需要选择属性、方法和事件,即可完成添加任务。

方法二:通过手工添加控件的属性、方法和事件。选择“工具”→“添加过程”命令,在弹出的“添加过程\”对话框中根据需要添加代码框架。然后通过手工编写代码的方式添加控件的属性、方法和事件。下面主要介绍手工为控件添加属性、方法和事件的方法。步骤如下。

(五)第五、六步:生成ActiveX控件。数字时钟的ActiveX控件设计后,选择“文件”一“生成工程1.oCx”命令,如图所示,即可生成“工程1.ocx”文件。在生成ocx格式文件的同时,VisualBasic 6.0会自动注册该控件。

二、使用ActiveX控件

(一)在控件工具栏中单击右键,选择部件,然后在浏览中添加我们刚刚创建的工程1.ocx。

(二)新建窗体中直接将控件拖动到窗体中即可应用。效果详见视频。

视频加载中…

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。