65.9K
CodeProject 正在变化。 阅读更多。
Home

在 MATLAB 中使用 ActiveX 控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (16投票s)

2004 年 1 月 14 日

6分钟阅读

viewsIcon

184036

利用 MATLAB 的 COM 功能来托管 ActiveX 控件。

Sample Image - MatlabActivex.jpg

引言

继我关于 MATLAB 的文章系列之后,我决定写一篇关于 MATLAB 托管 ActiveX 控件能力的新文章。正如我在之前的文章中所描述的,MATLAB 拥有许多开发人员可以受益的有用功能。以下是有关在 MATLAB 环境中使用 ActiveX 控件的步骤的介绍。

我更希望我们的 ActiveX 控件已准备就绪。您可以创建自己的 ActiveX 控件而不进行任何修改,然后将其导入 MATLAB。没有任何限制。只需按照您想要的方式创建您的控件。无论是创建图形 ActiveX 控件还是非可见控件。在这两种情况下,MATLAB 都可以处理您的 ActiveX。

通过以下 MATLAB 命令,您可以将任何 ActiveX 控件托管在所需的图形窗口中,并设置/获取任何属性、调用任何方法和处理事件。

步骤 1:创建控件

在第一步中,您必须在图形窗口中创建一个 ActiveX 控件。actxcontrol 接受 ActiveX 的 PROGID、位置和图形窗口句柄来在图形窗口上创建控件。语法如下:

h = actxcontrol (progid [, position [, fig_handle [, callback | 
{event1 eventhandler1; event2 eventhandler2; ...} [, filename]]]])

progid 是一个字符串,即要创建的控件的名称。控件供应商提供此字符串。position 是一个位置向量,包含控件的 x 和 y 位置以及宽度和高度,以像素为单位表示,格式为 [x y width height]。默认值为 [20 20 60 60]。fig_handle 是要在其中创建控件的图形窗口的句柄。callback 是一个 M 函数的名称,该函数接受可变数量的参数。event 由数字或名称指定。eventhandler 是一个 M 函数的名称,该函数接受可变数量的参数。每当控件触发与其关联的事件时,都会调用此函数。filename 是一个文件的名称,其中已保存了先前创建的控件。当您指定 filename 时,MATLAB 会使用 position、handle 和 event/eventhandler 参数创建一个新控件,然后从指定文件中初始化该控件。actxcontrol 中的 progid 参数必须与保存的控件的 PROGID 匹配。

例如,要创建图形窗口中的 Media Player ActiveX 控件,您必须如下调用 actxcontrol

m=figure;
h=actxcontrol('MediaPlayer.MediaPlayer.1', [0 0 300 300], m);

'MediaPlayer.MediaPlayer.1' 是 Windows Media Player ActiveX 的 PROGID。控件将显示在指定的位置。

步骤 2:设置属性

现在,我们必须设置控件的一些属性。要设置属性或获取属性值,我们可以使用 MATLAB 的 getset 命令。如果您单独使用 get 命令,MATLAB 将向您提供所有属性及其值。getset 命令的语法如下:

v = get(h[, 'propertyname'])
set(h, 'propertyname', value[, 'propertyname2', value2, ...])

h 是从 actxcontrol 之前返回的 ActiveX 控件的句柄。propertyname 是一个字符串,即要检索的属性值的名称。value 是设置接口属性的值。

例如,要设置 Media Player 的 FileName 属性,我们必须这样做:

set(h, 'filename', 'F:\movies\Aryan.mpg');

如果您想在不编写任何代码的情况下更改某些值的属性,最好使用图形用户界面命令:inspect。通过使用 inspect 命令,MATLAB 将显示属性检查器,并允许您轻松更改属性。下图显示了属性检查器。

此外,您还可以使用 propedit 命令来触发控件的内置属性编辑器。

以下是 inspectpropedit 命令的语法。

inspect(h)
propedit(h)

h 是 ActiveX 控件的句柄。

步骤 3:调用方法

现在,是时候调用方法了。invoke 命令可以为您做到这一点。

v = invoke(h, ['methodname' [, arg1, arg2, ...]])

methodname 是要调用的方法的名称字符串。arg1, ..., argn 是调用方法所需的参数(如果有)。

例如,要播放 Media Player 中的电影,我们应该这样做:

invoke(h, 'play')

如果您不记得方法名称,只需调用 methodsmethodview 命令即可。例如,methods(h) 显示 ActiveX 控件支持的所有方法。methodsview 显示方法及其参数。

步骤 4:处理事件

events 命令显示 ActiveX 控件支持的所有事件。eventlisteners 列出已注册到控件的任何事件以及它们的事件处理程序或回调例程。该函数返回一个字符串单元格数组,其中每一行包含一个已注册事件的名称以及该事件的处理例程。如果控件没有已注册的事件,则 eventlisteners 返回一个空单元格数组。必须注册事件及其回调或事件处理例程,控件才能响应它们。您可以在创建控件时(使用 actxcontrol)或之后任何时间(使用 registerevent)注册事件。

events(h)
eventlisteners(h)

当控件想要通知其容器发生了感兴趣的事件时,就会触发该事件。例如,许多控件会在用户单击控件时触发事件。在 MATLAB 中,您可以创建和注册自己的 M 文件函数,以便它们在事件发生时做出响应。这些函数充当事件处理程序。您可以创建一个处理程序函数来处理所有事件,也可以为每种类型的事件创建一个单独的处理程序。

传递给事件处理程序的参数

当触发已注册的事件时,MATLAB 会将事件信息作为此表所示传递给其处理程序函数。

参数编号

目录

格式

1 对象名称 MATLAB COM 类
2 事件 ID double
3 事件参数列表开始 控件传递的
结束 - 2 事件参数列表结束 (Arg. N) 控件传递的
结束 - 1 事件结构 结构
end 事件名称 字符数组

在编写事件处理程序函数时,请使用事件名称参数来标识事件的来源。从事件参数列表(参数 3 到结束 - 2)中获取控件传递的参数。所有事件处理程序都必须接受可变数量的参数。

function event (varargin)
if (varargin{end}) == 'MouseDown')       % Check the event name 
     x_pos = varargin{5};     % Read 5th Event Argument
     y_pos = varargin{6};     % Read 6th Event Argument
end

注意:传递的值因所使用的具体事件和控件而异。

事件结构

MATLAB 传递的倒数第二个参数是事件结构,它具有以下字段。

字段名 描述 格式
类型 事件名称 字符数组
来源 控件名称 MATLAB COM 类
事件 ID 事件标识符 double
事件参数名 1 事件参数值 1 控件传递的
事件参数名 2 事件参数值 2 控件传递的
等等。    

例如,当 Media Player 控件的 MouseDown 事件触发时,MATLAB 会将此事件结构传递给已注册的事件处理程序。

Type: 'MouseDown'
Source: [1x1 COM.mwsamp.mwsampctrl.2]
EventID: -605
Button: 1
Shift: 0
x: 27
y: 24

这是一个例子。

m=figure
h=actxcontrol('MediaPlayer.MediaPlayer.1', [0 0 300 300], 
               m, {'PlayStateChange', 'myPlayStateChange'});
set(h, 'filename', 'F:\movies\Aryan.DAT')

现在,PlayStateChange 事件已注册,当媒体状态更改时,将调用 myPlayStateChange 函数。创建一个新的 M 文件并将其保存为 _myPlayStateChange.m_。然后键入以下命令:

function myPlayStateChange(varargin)
disp('Play State Change By User')

当媒体状态改变时,MATLAB 将显示“Play State Change By User”!

尽情享用!

© . All rights reserved.