在 MATLAB 中使用 ActiveX 控件






4.71/5 (16投票s)
2004 年 1 月 14 日
6分钟阅读

184036
利用 MATLAB 的 COM 功能来托管 ActiveX 控件。
引言
继我关于 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 的 get
和 set
命令。如果您单独使用 get 命令,MATLAB 将向您提供所有属性及其值。get
和 set
命令的语法如下:
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
命令来触发控件的内置属性编辑器。
以下是 inspect
和 propedit
命令的语法。
inspect(h) propedit(h)
h
是 ActiveX 控件的句柄。
步骤 3:调用方法
现在,是时候调用方法了。invoke
命令可以为您做到这一点。
v = invoke(h, ['methodname' [, arg1, arg2, ...]])
methodname
是要调用的方法的名称字符串。arg1
, ..., argn
是调用方法所需的参数(如果有)。
例如,要播放 Media Player 中的电影,我们应该这样做:
invoke(h, 'play')
如果您不记得方法名称,只需调用 methods
或 methodview
命令即可。例如,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”!
尽情享用!