Main Content

向模型编辑器菜单添加菜单项

您可以为 Simulink® 编辑器和 Stateflow® 编辑器的上下文菜单添加命令和子菜单。菜单栏自定义在以后的版本中将会删除。要自定义 Simulink 工具条,请使用自定义选项卡。有关自定义选项卡的详细信息,请参阅Create Custom Simulink Toolstrip Tabs。要将现有工具栏菜单转换为工具条选项卡,请使用 slConvertCustomMenus

要将一个菜单项添加到菜单中,请执行以下操作:

  1. 对于每个菜单项,创建一个名为架构函数的函数,用于定义该菜单项(请参阅定义菜单项)。

  2. 在启动时使用 Simulink 自定义管理器注册菜单自定义项,例如,在 MATLAB® 路径上的 sl_customization.m 文件中(请参阅注册菜单自定义项)。

  3. 创建回调函数,用于实现由添加到菜单的菜单项触发的命令。

用于添加菜单项的代码

以下 sl_customization.m 文件会在您右键点击 Simulink 编辑器画布时出现的上下文菜单底部添加菜单项目。

function sl_customization(cm)

  %% Register custom menu function.
  cm.addCustomMenuFcn('Simulink:ContextMenu', @getMyMenuItems);
end

%% Define the custom menu function.
function schemaFcns = getMyMenuItems(callbackInfo) 
  schemaFcns = {@getItem1, ...
               @getItem2, ...
               {@getItem3,3}, ... %% Pass 3 as user data to getItem3.
               @getItem4}; 
end

%% Define the schema function for first menu item.
function schema = getItem1(callbackInfo)
  schema = sl_action_schema;
  schema.label = 'Item One';
  schema.userdata = 'item one';	
  schema.callback = @myCallback1; 
end

function myCallback1(callbackInfo)
  disp(['Callback for item ' callbackInfo.userdata ' was called']);
end

function schema = getItem2(callbackInfo)
  % Make a submenu label 'Item Two' with     
  % the menu item above three times.      
  schema = sl_container_schema;
  schema.label = 'Item Two';     
	schema.childrenFcns = {@getItem1, @getItem1, @getItem1};
end 

function schema = getItem3(callbackInfo)
  % Create a menu item whose label is
  % 'Item Three: 3', with the 3 being passed
  % from getMyItems above.

  schema = sl_action_schema;
  schema.label = ['Item Three: ' num2str(callbackInfo.userdata)];
end

function myToggleCallback(callbackInfo)
    if strcmp(get_param(gcs, 'ScreenColor'), 'red') == 0
        set_param(gcs, 'ScreenColor', 'red');
    else
        set_param(gcs, 'ScreenColor', 'white');
    end
end

%% Define the schema function for a toggle menu item.
function schema = getItem4(callbackInfo)
  schema = sl_toggle_schema;
  schema.label = 'Red Screen';
  if strcmp(get_param(gcs, 'ScreenColor'), 'red') == 1
    schema.checked = 'checked';
  else
    schema.checked = 'unchecked';
  end
  schema.callback = @myToggleCallback; 
end

定义菜单项

您可以通过创建一个返回架构对象的函数来定义菜单项,该对象指定创建该菜单项所需的信息。您定义的菜单项可能会触发自定义操作或显示自定义子菜单。有关详细信息,请参阅以下各个部分:

定义触发自定义命令的菜单项

要定义触发自定义命令的菜单项,架构函数必须接受回调信息对象(请参阅回调信息对象)并创建和返回一个操作架构对象(请参阅操作架构对象),该对象指定菜单项的标签和一个函数(称为回调),在用户选择该菜单项时会调用该函数。例如,以下架构函数定义一个菜单项,在用户选择该菜单项时会显示消息。

function schema = getItem1(callbackInfo) 

  %% Create an instance of an action schema.
  schema = sl_action_schema;

  %% Specify the menu item label.
  schema.label = 'My Item 1';
  schema.userdata = 'item1';

  %% Specify the menu item callback function.
  schema.callback = @myCallback1;

end

function myCallback1(callbackInfo)
  disp(['Callback for item ' callbackInfo.userdata
        ' was called']); 
end

操作架构对象.  此对象指定有关触发您定义的命令的菜单项的信息,包括菜单项上显示的标签以及用户选择该菜单项时要调用的函数。使用函数 sl_action_schema 在架构函数中创建此对象的实例。其属性包括:

属性描述
tag

可选字符向量,用于标识此操作以便过滤器函数可以引用它。

label

字符向量,用于指定触发此操作的菜单项上显示的标签。

state

用于指定此操作的状态的属性。有效值包括:

  • 'Enabled'(默认值)- 该操作出现在菜单中且可被选择

  • 'Disabled' - 该操作出现在菜单中但无法被选择

  • 'Hidden' - 该操作不出现在菜单中

statustip

字符向量,指定当用户选择触发此操作的菜单项时在编辑器状态栏中要显示的文本。

userdata

您指定的数据,可以是任何类型。

accelerator

字符向量,指定用于触发此操作的 Ctrl 组合键。您只能为菜单栏菜单上显示的自定义菜单项添加一个键盘快捷方式(将删除),并且不能重新定义 Simulink 编辑器自带的快捷键。例如,Ctrl+D 是 Simulink 编辑器中更新图的快捷键,因此您不能重新定义它。

要指定此值,请使用 'Ctrl+K' 形式,其中 K 是快捷键。例如,对于通过按住 CtrlAlt 并按 T 调用的快捷键,使用 'Ctrl+Alt+T'

callback

字符向量,指定当用户选择触发此操作的菜单项时要计算的 MATLAB 表达式或要调用的函数的句柄。此函数必须接受一个参量:回调信息对象。

autoDisableWhen

控制何时自动禁用菜单项的属性。

  • 'Locked'(默认值)- 当活动编辑器被锁定或当模型繁忙时

  • 'Busy' - 仅当模型繁忙时

  • 'Never' - 从不

切换架构对象.  此对象指定有关用于打开或关闭某对象的菜单项的信息。使用函数 sl_toggle_schema 在架构函数中创建此对象的实例。其属性包括:

属性描述
tag

可选字符向量,用于标识此切换操作以便过滤器函数可以引用它。

label

字符向量,用于指定触发此切换操作的菜单项上显示的标签。

checked

指定菜单项是否显示复选标记。有效值为 'unchecked'(默认值)和 'checked'

state

用于指定此切换操作的状态的属性。有效值包括:

  • 'Enabled'(默认值)- 该操作出现在菜单中且可被选择

  • 'Disabled' - 该操作出现在菜单中但无法被选择

  • 'Hidden' - 该操作不出现在菜单中

statustip

字符向量,指定当用户选择触发此切换操作的菜单项时在编辑器状态栏中要显示的文本。

userdata

您指定的数据,可以是任何类型。

accelerator

字符向量,指定用于触发此操作的 Ctrl 组合键。您只能为菜单栏菜单上显示的自定义菜单项添加一个键盘快捷方式(将删除),并且不能重新定义 Simulink 编辑器自带的快捷键。例如,Ctrl+D 是 Simulink 编辑器中更新图的快捷键,因此您不能重新定义它。

要指定此值,请使用 'Ctrl+K' 形式,其中 K 是快捷键。例如,对于通过按住 CtrlAlt 并按 T 调用的快捷键,使用 'Ctrl+Alt+T'

callback

字符向量,指定当用户选择触发此操作的菜单项时要计算的 MATLAB 表达式或要调用的函数的句柄。此函数必须接受一个参量:回调信息对象。

autoDisableWhen

控制何时自动禁用菜单项的属性。

  • 'Locked'(默认值)- 当活动编辑器被锁定或当模型繁忙时

  • 'Busy' - 仅当模型繁忙时

  • 'Never' - 从不

定义自定义子菜单

要定义子菜单,请创建一个架构函数,该函数接受回调信息对象并返回容器架构对象(请参阅容器架构对象),该对象指定定义子菜单上的菜单项的架构。例如,以下架构函数定义一个子菜单,该子菜单包含定义触发自定义命令的菜单项中示例定义的菜单项的三个实例。

function schema = getItem2( callbackInfo )
    schema = sl_container_schema;
    schema.label = 'Item Two';
    schema.childrenFcns = {@getItem1, @getItem1, @getItem1};
end

容器架构对象.  容器架构对象指定子菜单标签及其内容。使用函数 sl_container_schema 在架构函数中创建此对象的实例。该对象的属性包括:

属性描述
tag

可选字符向量,用于标识此子菜单。

label

字符向量,用于指定子菜单的标签。

state

字符向量,用于指定此子菜单的状态。有效值为 'Enabled' (默认值)、'Disabled''Hidden'

statustip

字符向量,用于指定当用户选择此子菜单时在编辑器状态栏中要显示的文本。

childrenFcns

元胞数组,用于指定子菜单的内容。该元胞数组中的每个条目可以是:

  • 指向定义子菜单上的菜单项的架构函数的指针(请参阅定义菜单项)。

  • 二元素元胞数组,其第一个元素是指向定义菜单项条目的架构函数的指针,其第二个元素是作为用户数据在回调信息对象中插入的数据(请参阅回调信息对象),这些数据将被传递给架构函数。

  • 'separator',用于在元胞数组中上一个条目定义的菜单项和下一个条目中定义的菜单项之间插入一个分隔符。此输入项不区分大小写(例如,'SEPARATOR''Separator' 均为有效输入项)。如果分隔符出现在子菜单的开头或结尾,则不显示该分隔符;连续出现的分隔符会合并为单一分隔符(例如,菜单项被隐藏时会出现多个连续分隔符)。

例如,以下元胞数组指定两个子菜单条目:

{@getItem1, 'separator', {@getItem2, 1}}

在此示例中,通过回调信息对象将 1 传递给 getItem2

generateFcn

指针,指向返回定义子菜单内容的元胞数组的函数。该元胞数组的格式必须与为容器架构对象 childrenFcns 属性指定的格式相同。

generateFcn 属性优先于 childrenFcns 属性。如果同时设置了两者,则忽略 childrenFcns 属性,并使用 generateFcn 返回的元胞数组来创建子菜单。

userdata

传递给 generateFcn 的任何类型的数据。

autoDisableWhen

控制何时自动禁用菜单项的属性。

  • 'Locked'(默认值)- 当活动编辑器被锁定或当模型繁忙时

  • 'Busy' - 仅当模型繁忙时

  • 'Never' - 从不

注册菜单自定义项

您必须使用自定义管理器注册要包含在 Simulink 菜单中的自定义菜单项。使用 Simulink 的 sl_customization.m 文件(请参阅向 Simulink 注册自定义项)来执行此任务。特别是,对于要自定义的每个菜单,系统 sl_customization 函数必须调用自定义管理器 addCustomMenuFcn 方法。每次调用都应该传递要自定义的菜单的标记(请参阅菜单标记)和自定义菜单函数,该函数指定要添加到菜单中的项(请参阅创建自定义菜单函数)。例如,以下 sl_customization 函数将自定义项添加到 Simulink 的“工具”菜单。

function sl_customization(cm)
  %% Register custom menu function.
  cm.addCustomMenuFcn('Simulink:ToolsMenu', @getMyItems);

创建自定义菜单函数

自定义菜单函数返回架构函数的元胞数组,这些架构函数定义要在模型编辑器菜单上显示的自定义项(请参阅定义菜单项)。自定义菜单函数返回一个元胞数组,它类似于 generateFcn 函数返回的元胞数组。

您的自定义菜单函数应接受回调信息对象(请参阅回调信息对象)并返回列出架构函数的元胞数组。该元胞数组的每个元素可以是架构函数的句柄,也可以是二元素元胞数组,其第一个元素是某架构函数的句柄,第二个元素是要传递给该架构函数的用户定义的数据。例如,以下自定义菜单函数返回一个列出三个架构函数的元胞数组。

function schemas = getMyItems(callbackInfo)
  schemas = {@getItem1, ...
            @getItem2, ...
            {@getItem3,3} }; % Pass 3 as userdata to getItem3.
end

回调信息对象

这些对象的实例将传递给菜单自定义函数。这些对象的方法和属性包括:

方法或属性描述
uiObject

获取菜单所有者句柄的方法,该方法是菜单的回调。所有者可以是 Simulink 编辑器或 Stateflow 编辑器。

model

获取编辑器窗口中显示的模型的句柄的方法。

userdata

用户数据属性。此属性的值可以是任何类型的数据。

调试自定义菜单回调

在使用 Microsoft® Windows® 操作系统的系统上,如果选择其回调包含断点的自定义菜单项,可能导致鼠标无响应或菜单保持打开状态且显示在其他窗口的前端。要解决这些问题,请使用 MATLAB 代码调试器键盘命令继续执行回调。

菜单标记

菜单标记用于标识 Simulink 编辑器菜单、Stateflow 编辑器菜单或上下文菜单。您需要知道菜单的标记,以便向其中添加自定义项(请参阅注册菜单自定义项)。

标记添加的项
Simulink 标记
Simulink:MenuBar(将删除)Simulink 编辑器菜单栏的菜单
Simulink:PreContextMenuSimulink 编辑器上下文菜单开头的项
Simulink:ContextMenuSimulink 编辑器上下文菜单末尾的项
Simulink:FileMenu(将删除)Simulink 编辑器的文件菜单末尾的项
Simulink:EditMenu(将删除)Simulink 编辑器的编辑菜单末尾的项
Simulink:ViewMenu(将删除)Simulink 编辑器的视图菜单末尾的项
Simulink:DisplayMenu(将删除)Simulink 编辑器的显示菜单末尾的项
Simulink:DiagramMenu(将删除)Simulink 编辑器的菜单末尾的项
Simulink:SimulationMenu(将删除)Simulink 编辑器的仿真菜单末尾的项
Simulink:AnalysisMenu(将删除)Simulink 编辑器的分析菜单末尾的项
Simulink:CodeMenu(将删除)Simulink 编辑器的代码菜单末尾的项
Simulink:ToolsMenu(将删除)Simulink 编辑器的工具菜单末尾的项
Simulink:HelpMenu(将删除)Simulink 编辑器的帮助菜单末尾的项
Stateflow 标记
Stateflow:MenuBar(将删除)Stateflow 编辑器菜单栏的菜单
Stateflow:PreContextMenuStateflow 编辑器上下文菜单开头的项。
Stateflow:ContextMenuStateflow 编辑器上下文菜单末尾的项。
Stateflow:FileMenu(将删除)Stateflow 编辑器的文件菜单末尾的项
Stateflow:EditMenu(将删除)Stateflow 编辑器的编辑菜单末尾的项
Stateflow:ViewMenu(将删除)Stateflow 编辑器的视图菜单末尾的项
Stateflow:DisplayMenu(将删除)Stateflow 编辑器的显示菜单末尾的项
Stateflow:ChartMenu(将删除)Stateflow 编辑器的菜单末尾的项
Stateflow:SimulationMenu(将删除)Stateflow 编辑器的仿真菜单末尾的项
Stateflow:AnalysisMenu(将删除)Stateflow 编辑器的分析菜单末尾的项
Stateflow:CodeMenu(将删除)Stateflow 编辑器的代码菜单末尾的项
Stateflow:ToolsMenu(将删除)Stateflow 编辑器的工具菜单末尾的项
Stateflow:HelpMenu(将删除)Stateflow 编辑器的帮助菜单末尾的项

SimulinkStateflow 编辑器菜单自定义

Stateflow 编辑器菜单和 Simulink 编辑器菜单的自定义过程相同。将自定义菜单函数添加到顶层菜单的末尾取决于活动编辑器:

  • 仅当 Simulink 编辑器处于活动状态时,才会显示绑定到 Simulink:FileMenu 的菜单。

  • 仅当 Stateflow 编辑器处于活动状态时,才会显示绑定到 Stateflow:FileMenu 的菜单。

  • 要使某菜单在这两个编辑器中都显示,请调用 addCustomMenuFcn 两次,即对每个标记调用一次。检查代码是否在这两个编辑器中都能正常工作。

相关主题