或者,您可以只存储图形对象的句柄并使用这些句柄来获取其他函数中的值。
例如:
function testcode
% Initialize sample GUI
h.fig = figure( 'MenuBar', 'none', 'ToolBar', 'none');
h.sld(1) = uicontrol( ...
'Parent', h.fig, ...
'Style', 'slider',...
'Min', 0, 'Max', 255, 'Value', 0, ...
'Units', 'Normalized', 'Position', [0.1 0.65 0.4 0.1], ...
'Tag', 'Red' ...
);
h.sld(2) = uicontrol( ...
'Parent', h.fig, ...
'Style', 'slider', ...
'Min', 0, 'Max', 255, 'Value', 0, ...
'Units', 'Normalized', 'Position', [0.1 0.45 0.4 0.1], ...
'Tag', 'Green' ...
);
h.sld(3) = uicontrol( ...
'Parent', h.fig, ...
'Style', 'slider', ...
'Min', 0, 'Max', 255, 'Value', 255, ...
'Units', 'Normalized', 'Position', [0.1 0.25 0.4 0.1], ...
'Tag', 'Blue' ...
);
% Use an axes object as a color display box
% Get starting RGB values for the color display, normalized so 0 <= x <= 1
startRGB = [get(h.sld(1), 'Value'), get(h.sld(2), 'Value'), get(h.sld(3), 'Value')]/255;
h.ax = axes( ...
'Parent', h.fig, ...
'Units', 'Normalized', 'Position', [0.6 0.36 0.3 0.3], ...
'XTickLabels', '', 'YTickLabels', '', ...
'Color', startRGB ...
);
% Need to set callback after all our elements are initialized
nsliders = length(h.sld);
set(h.sld, {'Callback'}, repmat({{@slidercallback, h}}, nsliders, 1));
end
function slidercallback(~, ~, h)
% Update background color of our axes object every time the slider is updated
RGB = [get(h.sld(1), 'Value'), get(h.sld(2), 'Value'), get(h.sld(3), 'Value')]/255;
set(h.ax, 'Color', RGB');
end
当回调执行时,默认情况下会传递 2 个输入,即调用对象和事件数据结构。正如回调文档中所解释的,您可以通过将所有内容包装到一个元胞数组中来将其他输入传递给您的回调。需要注意的一点是,传递给回调的变量的值是它在定义回调时存在的值。换句话说,如果我们在创建滑块的同时为滑块设置回调,当 Red 的回调被触发h
时将只包含我们的图形的句柄,当 Green 的回调被触发h
时将包含我们的图形的句柄和红色滑块,依此类推。
正因为如此,一旦我们初始化了所有的图形对象,你就会看到我已经定义了回调。MATLAB 的文档中解释了使用大括号设置多个对象的属性set
。我使用repmat
的单元格数组的大小与我们的滑块对象数组的大小相同。