В качестве альтернативы вы можете просто сохранить ручки ваших графических объектов и использовать их для получения значений в других функциях.
Например:
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 входа по умолчанию, вызывающего объекта и структуры данных о событии. Как объясняется в callback documentation, вы можете передавать дополнительные входы в ваш обратный вызов, завернув все в массив ячеек. Следует отметить, что значение переменной, передаваемой обратному вызову, является значением, которое существует при определении обратного вызова. Другими словами, если мы установим обратный вызов для наших слайдеров в то же самое время, мы их создадим, когда обратный вызов для Red будет уволен. h
будет содержать только дескриптор нашей фигуры, когда обратный вызов для Green включен. h
будет содержать дескриптор нашей фигуре и красном слайдере и так далее.
Из-за этого вы увидите, что я определил обратные вызовы после инициализации всех наших графических объектов. Использование фигурных скобок для задания свойств нескольких объектов объясняется в документации MATLAB для set
. Я использую repmat
, поэтому размер массива ячеек такого же размера, как и наш массив объектов слайдера.