向模型编辑器菜单添加菜单项
您可以为 Simulink® 编辑器和 Stateflow® 编辑器的上下文菜单添加命令和子菜单。菜单栏自定义在以后的版本中将会删除。要自定义 Simulink 工具条,请使用自定义选项卡。有关自定义选项卡的详细信息,请参阅Create Custom Simulink Toolstrip Tabs。要将现有工具栏菜单转换为工具条选项卡,请使用 slConvertCustomMenus
。
要将一个菜单项添加到菜单中,请执行以下操作:
用于添加菜单项的代码
以下 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 | 用于指定此操作的状态的属性。有效值包括:
|
statustip | 字符向量,指定当用户选择触发此操作的菜单项时在编辑器状态栏中要显示的文本。 |
userdata | 您指定的数据,可以是任何类型。 |
accelerator | 字符向量,指定用于触发此操作的 Ctrl 组合键。您只能为菜单栏菜单上显示的自定义菜单项添加一个键盘快捷方式(将删除),并且不能重新定义 Simulink 编辑器自带的快捷键。例如,Ctrl+D 是 Simulink 编辑器中更新图的快捷键,因此您不能重新定义它。 要指定此值,请使用 |
callback | 字符向量,指定当用户选择触发此操作的菜单项时要计算的 MATLAB 表达式或要调用的函数的句柄。此函数必须接受一个参量:回调信息对象。 |
autoDisableWhen | 控制何时自动禁用菜单项的属性。
|
切换架构对象. 此对象指定有关用于打开或关闭某对象的菜单项的信息。使用函数 sl_toggle_schema
在架构函数中创建此对象的实例。其属性包括:
属性 | 描述 |
---|---|
tag | 可选字符向量,用于标识此切换操作以便过滤器函数可以引用它。 |
label | 字符向量,用于指定触发此切换操作的菜单项上显示的标签。 |
checked | 指定菜单项是否显示复选标记。有效值为 |
state | 用于指定此切换操作的状态的属性。有效值包括:
|
statustip | 字符向量,指定当用户选择触发此切换操作的菜单项时在编辑器状态栏中要显示的文本。 |
userdata | 您指定的数据,可以是任何类型。 |
accelerator | 字符向量,指定用于触发此操作的 Ctrl 组合键。您只能为菜单栏菜单上显示的自定义菜单项添加一个键盘快捷方式(将删除),并且不能重新定义 Simulink 编辑器自带的快捷键。例如,Ctrl+D 是 Simulink 编辑器中更新图的快捷键,因此您不能重新定义它。 要指定此值,请使用 |
callback | 字符向量,指定当用户选择触发此操作的菜单项时要计算的 MATLAB 表达式或要调用的函数的句柄。此函数必须接受一个参量:回调信息对象。 |
autoDisableWhen | 控制何时自动禁用菜单项的属性。
|
定义自定义子菜单
要定义子菜单,请创建一个架构函数,该函数接受回调信息对象并返回容器架构对象(请参阅容器架构对象),该对象指定定义子菜单上的菜单项的架构。例如,以下架构函数定义一个子菜单,该子菜单包含定义触发自定义命令的菜单项中示例定义的菜单项的三个实例。
function schema = getItem2( callbackInfo ) schema = sl_container_schema; schema.label = 'Item Two'; schema.childrenFcns = {@getItem1, @getItem1, @getItem1}; end
容器架构对象. 容器架构对象指定子菜单标签及其内容。使用函数 sl_container_schema
在架构函数中创建此对象的实例。该对象的属性包括:
属性 | 描述 |
---|---|
tag | 可选字符向量,用于标识此子菜单。 |
label | 字符向量,用于指定子菜单的标签。 |
state | 字符向量,用于指定此子菜单的状态。有效值为 |
statustip | 字符向量,用于指定当用户选择此子菜单时在编辑器状态栏中要显示的文本。 |
childrenFcns | 元胞数组,用于指定子菜单的内容。该元胞数组中的每个条目可以是: 例如,以下元胞数组指定两个子菜单条目: {@getItem1, 'separator', {@getItem2, 1}} 在此示例中,通过回调信息对象将 1 传递给 |
generateFcn | 指针,指向返回定义子菜单内容的元胞数组的函数。该元胞数组的格式必须与为容器架构对象
|
userdata | 传递给 |
autoDisableWhen | 控制何时自动禁用菜单项的属性。
|
注册菜单自定义项
您必须使用自定义管理器注册要包含在 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:PreContextMenu | Simulink 编辑器上下文菜单开头的项 |
Simulink:ContextMenu | Simulink 编辑器上下文菜单末尾的项 |
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:PreContextMenu | Stateflow 编辑器上下文菜单开头的项。 |
Stateflow:ContextMenu | Stateflow 编辑器上下文菜单末尾的项。 |
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 编辑器的帮助菜单末尾的项 |
Simulink 和 Stateflow 编辑器菜单自定义
Stateflow 编辑器菜单和 Simulink 编辑器菜单的自定义过程相同。将自定义菜单函数添加到顶层菜单的末尾取决于活动编辑器:
仅当 Simulink 编辑器处于活动状态时,才会显示绑定到
Simulink:FileMenu
的菜单。仅当 Stateflow 编辑器处于活动状态时,才会显示绑定到
Stateflow:FileMenu
的菜单。要使某菜单在这两个编辑器中都显示,请调用
addCustomMenuFcn
两次,即对每个标记调用一次。检查代码是否在这两个编辑器中都能正常工作。