MATLAB.Exponenta
–Û·Ë͇ Matlab&Toolboxes

Приложения с GUI и дескрипторная графика

Свойства элементов интерфейса, полезные при программировании GUI

В этом разделе мы рассмотрим те свойства элементов интерфейса, к которым обращаются чаще всего при программировании приложений с графическим интерфейсом пользователя.

Свойства, используемые для идентификации объектов

Тег объекта, свойство Tag

При создании приложений с графическим интерфейсом пользователя важно уметь обращаться к объектам для получения и установки значений их свойствам. Для этого каждому объекту приложения при создании можно задать тег, т.е. уникальное имя, которое выделяет его среди других объектов приложения. Затем в функциях обработки событий элементов интерфейса можно получать указатели на объекты приложения при помощи функции guihandles. Входным аргументом функции guihandles является указатель на любой из объектов окна приложения, а выходным аргументом - структура указателей на объекты окна приложения, причем имена полей этой структуры совпадают с тегами объектов и каждое поле содержит указатель на соответствующий объект окна приложения (краткие сведения о работе со структурами в MATLAB можно найти здесь).

При создании приложений с графическим интерфейсом пользователя в среде визуального программирования GUIDE тег используется, в частности, при формировании имен функций для обработки событий от элементов интерфейса (о создании приложений в среде GUIDE написано в разделах Приложения с GUI, Создание и программирование меню в среде GUIDE, Создание и программирование контекстного меню в среде GUIDE). Мы рассмотрим сейчас использование тегов при программировании элементов интерфейса без среды визуального программирования GUIDE, когда объекты приложения создаются в основной функции и для обработки событий программируются подфункции.

Итак, при создании объектов следует задать им тег, установив в качестве значения свойства Tag строку, желательно с подходящим по смыслу тегом. Например, для создания кнопки в основной функции приложения достаточно вызвать функцию uicontrol следующим образом:

uicontrol('Style', 'pushbutton',...
      'Tag',  'btnOpen',
       'String', 'Open',...
       'Callback', @btnOpen_Callback)

Примечание. Не следует путать тег btnOpen и надпись Open на кнопке. В окне приложения может быть несколько кнопок с одинаковыми надписями (хотя это редко всегда нужно), но у всех этих кнопок должны быть разные теги.

Далее, для получения указателя на кнопку Open в функции обработки события какого-либо другого объекта, например в функции btnCancel_Callback обработки нажатия на кнопку Cancel достаточно написать

function btnCancel_Callback(src, evt)
handles = guihandles(src);

Теперь в handles.btnOpen содержится указатель на кнопку Open.

Технику работы с тегами мы продемонстрируем на следующем простом примере приложения с графическим интерфейсом param, в окне которого есть полоса прокрутки и область ввода. И область ввода и полоса прокрутки предназначены для задания значения параметра в диапазоне от 1 до 100. Эти элементы управления ведут себя согласованно, т.е. изменение положения бегунка полосы прокрутки приводит к изменению числа в области ввода и наоборот.


Окно приложения param

Такие согласованные область ввода и полоса прокрутки часто применяются в приложениях с графическим интерфейсом пользователя для задания значения некоторому числовому параметру с большой точностью.

В основной функции param (текст которой приведен ниже) создаются следующие объекты окна приложения.

  1. При помощи функции figure создается окно приложения размера 300 на 30 пикселей, его нижний левый угол имеет координаты (200, 200) пикселей относительно левого нижнего угла монитора. По умолчанию при задании размеров и положения в качестве единиц измерения используются пиксели, если надо задавать размеры и положение в других единицах, то следует присвоить свойству Units графического окна нужное значение (см. раздел Свойства графических окон). Окно создается без стандартного меню и панели инструментов, которые по умолчанию присутствуют в графических окнах MATLAB, т.к. свойство MenuBar установлено в 'none'. Для вывода заголовка окна param используется свойство Name. Для того, чтобы выводился только заголовок без слова Figure и номера, свойство NumberTitle установлено в 'off'. При создании графического окна в переменной hwin сохраняется указатель на него для получения указателей на полосу прокрутки и область ввода при инициализации значения параметра в конце основной функции.

  2. При помощи функции uicontrol создается область ввода с тегом edtParam размера 50 на 16 пикселей, ее нижний левый угол имеет координаты (5, 5) пикселей относительно левого нижнего угла графического окна (по умолчанию при задании размеров и положения в качестве единиц измерения используются пиксели, если надо задавать размеры и положение в других единицах, то следует присвоить свойству Units области ввода нужное значение). С событием Callback области ввода связывается функция edtParam_Callback.

  3. Аналогично, помощи функции uicontrol создается полоса прокрутки с тегом sldParam размера 235 на 16, ее нижний левый угол имеет координаты (60, 5) пикселей относительно левого нижнего угла графического окна. С событием Callback полосы прокрутки связывается функция sldParam_Callback. Для полосы прокрутки используются свойства Min и Max, которые являются границами значений ее свойства Value, изменяющегося при продвижении бегунка полосы прокрутки. При этом значение Min соответствует крайнему левому положению бегунка, а значение Max - крайнему правому. Для задания шагов изменения значения свойства Value полосы прокрутки при щелчке по кнопкам со стрелками на краях полосы прокрутки и при щелчке вне бегунка используется свойство SliderStep. Значением свойства SliderStep должен быть вектор из двух элементов [min_step max_step], каждый из которых может принимать значение от 0 до 1. Значение min_step отвечает за изменение значения свойства Value при щелчке по кнопкам со стрелками, а max_step - при щелчке вне бегунка. Связь между значениями свойств Value, Min, Max, min_step и max_step следующая. При щелчке по кнопкам со стрелкой значение Value изменяется на величину min_step * (Max - Min), а при щелчке вне бегунка значение Value изменяется на величину mах_step * (Max - Min). В нашем примере min_step = 1/9900, а max_step = 1/99 для того, чтобы при щелчке по кнопкам со стрелками значение параметра менялось на 0.01, а при щелчке вне бегунка на 1.

Далее в основной функции param происходит инициализация значения параметра, для чего вызывается функция initParam от указателя на графическое окно. В функции initParam в качестве начального значения параметра берется 35. Значение 35 должно появиться в области ввода и бегунок должен принять соответствующее этому значению положение. Для изменения содержимого строки ввода и положения бегунка в initParam нужны указатели на область ввода и полосу прокрутки. Для получения указателей на объекты приложения используется функция guihandles, во входном аргументе которой задается указатель на окно приложения. Функция guihandles возвращает структуру handles. Ее поля edtParam и sldParam содержат, соответственно, указатели на область ввода и полосу прокрутки. При помощи функции set свойству String области ввода (т.е. ее содержимому) присваивается строковое представление числа, полученное при помощи функции num2str, а свойству Value полосы прокрутки присваивается числовое значение (в принципе, инициализацию можно было делать и при создании элементов управления функцией uicontrol, но в случае большого количества параметров удобно запрограммировать отдельную функцию).

В двух функциях sldParam_Callback и edtParam_Callback обрабатываются события Callback, соответственно, полосы прокрутки и области ввода.

При обработке события Callback полосы прокрутки в функции sldParam_Callback вызывается функция guihandles для получения структуры указателей на объекты приложения. Ее входным аргументом является входной аргумент src функции sldParam_Callback, который содержит указатель на объект, событие Callback которого обрабатывается, т.е. указатель на полосу прокрутки. Выходным аргументом функции guihandles является структура с указателями на объекты приложения. Далее в переменную ParamVal записывается текущее положение бегунка (это и есть установленное пользователем значение параметра), которое затем преобразуется в строковое представление и при помощи функции set устанавливается в качестве значения свойства String области ввода. Указатель на область ввода записан в поле edtParam структуры handles.

При обработке события Callback области ввода в функции edtParam_Callback все аналогично, только после получения строкового представления значения параметра, введенного пользователем в область ввода, происходит его преобразование в число при помощи функции str2num и проверка, не выходит ли его значение за допустимые границы от 1 до 100. Проверка выполняется при помощи функций min и max, которые возвращают, соответственно, минимальный и максимальный элементы вектора, заданного во входном аргументе. Если пользователь ввел число, меньшее 1, то значению параметра ParamVal присваивается 1. Если пользователь ввел число, большее 100, то значению параметра ParamVal присваивается 100. Затем бегунок полосы прокрутки устанавливается в положение, соответствующее значению ParamVal. Само значение ParamVal выводится в область ввода, поскольку могло быть изменено из-за неверного ввода пользователем. Можно было также обработать не только ввод неверного значения, но и ввод не числа, или ввод массива, использовав функции isnumeric и size и условный оператор if.

function param
% основная функция, создающая окно приложения и элементы интерфейса

% создание окна приложения и запись указателя на него в переменную hwin
hwin = figure('Position', [200 200 300 30],...
    'MenuBar', 'none',...
    'NumberTitle', 'off',...
    'Name', 'param')
% создание области ввода с тегом edtParam и функцией edtParam_Callback  
% для обработки события Callback
uicontrol('Style', 'edit',...
    'Tag', 'edtParam',...
    'Callback', @edtCallback,...
    'Position', [5 5 50 16])
% создание полосы прокрутки с тегом sldParam и функцией sldParam_Callback  
% для обработки события Callback, крайнее левое положение бегунка соответствует 1,
% крайнее правое соответствует 100
uicontrol('Style', 'slider',...
    'Tag', 'sldParam',...
    'Callback', @sldCallback,...    
    'Position', [60 5 235 16],...
    'Min', 1, 'Max', 100,...
    'SliderStep', [1/9900 1/99])

% инициализация значений элементов управления
initParam(hwin)

function initParam(src)
% функция для инициализации значения параметра

% получение указателей на объекты окна приложения
handles = guihandles(src);
% задание начального значения параметра
ParamInitVal = 35;
% запись начального значения в область ввода
set(handles.edtParam, 'String', num2str(ParamInitVal))
% установка бегунка полосы прокрутки в соответствующее положение
set(handles.sldParam, 'Value', ParamInitVal)

function sldParam_Callback(src, evt)
% обработка события Callback полосы прокрутки

% получение структуры указателей на объекты приложения
handles = guihandles(src);
% получение установленного положения бегунка полосы прокрутки
ParamVal = get(src, 'Value');
% задание соответствующего значения в области ввода
set(handles.edtParam, 'String', num2str(ParamVal))

function edtParam_Callback(src, evt)
% обработка события Callback области ввода

% получение структуры указателей на объекты приложения
handles = guihandles(src);
% получение строкового значения, заданного в области ввода
strParamVal = get(src, 'String');
% преобразование строкового представления в числовое
ParamVal = str2num(strParamVal);
% проверка на выход за границы допустимых значений от 1  до 100
ParamVal = max([1 ParamVal]);
ParamVal = min([100 ParamVal]);
% установка положения бегунка полосы прокрутки
set(handles.sldParam, 'Value', ParamVal)
% установка значения в область ввода
set(src, 'String', num2str(ParamVal))

Этот пример демонстрировал задание числового параметра, который будет использоваться в приложении. Если требуется написать функцию, которая создает графическое окно для задания параметров, и возвращает их после закрытия диалогового окна, то можно обратиться к разделу Использование вложенных функций в приложениях GUI. Файл-функция для окна, возвращающая введенные в него параметры. В простых случаях можно использовать стандартную функцию inputdlg, описанную в разделе Диалоговое окно для ввода информации (функция inputdlg).

Свойства Parent и Children

Объекты окна приложения выстроены в иерархическую структуру. На верху иерархии находится графическое окно, которому могут принадлежать

  • оси;
  • элементы управления (кнопки, кнопки-переключатели, строки ввода, статический текст, полосы прокрутки, флаги, переключатели, списки, выпадающие списки);
  • группы переключателей, содержащие переключатели или кнопки-переключатели;
  • панели, содержащие элементы управления;
  • панели инструментов с кнопками и кнопками-переключателями;
  • меню с подменю и пунктами (о создании меню написано в разделах Создание и программирование меню в среде GUIDE и Создание и программирование меню при помощи функций).

Схема объектов приведена в разделе Новшества для создания приложений с графическим интерфейсом пользователя в 7-ой версии MATLAB.

Каждый объект имеет свойства Parent и Children. Значением свойства Parent некоторого объекта является указатель на предка объекта в иерархии объектов. Значением свойства Children объекта является указатель или вектор указателей на его потомков.

Примеры использования свойств Parent и Children для изменения порядка кнопок на панели инструментов и переноса их с одной панели инструментов на другую приведены в разделе Панель инструментов.

Свойство Children может быть использовано для задания порядка обхода элементов управления в окне приложения при помощи клавиши Tab и для организации правильного перекрытия объектов, расположенных в окне приложения. Например, предположим, что при создании графического окна, панели и четырех флагов paramA, paramB, paramC и paramD была выбрана следующая последовательность операторов

% создание графического окна
figure('Position', [200 200 200 70],...
    'MenuBar', 'none',...
    'NumberTitle', 'off',...
    'Name', 'taborder')
% создание панели 
hpanel = uipanel('Units','pixels',...
    'Position', [10 10 180 50],...
    'Title', 'Options');
% создание флагов, принадлежащих панели
hparamA = uicontrol('Style', 'checkbox',...
    'Parent', hpanel,...
    'String', 'paramA',...
    'Position', [5 20 60 12]);
hparamB = uicontrol('Style', 'checkbox',...
    'Parent', hpanel,...
    'String', 'paramB',...
    'Position', [100 20 60 12]);
hparamC = uicontrol('Style', 'checkbox',...
    'Parent', hpanel,...
    'String', 'paramC',...
    'Position', [5 5 60 12]);
hparamD = uicontrol('Style', 'checkbox',...
    'Parent', hpanel,...
    'String', 'paramD',...
    'Position', [100 5 60 12]);

Тогда в работающем приложении последовательность обходов флагов при нажатии на клавишу Tab будет такой, как на рисунке ниже


Первоначальная последовательность обхода флагов клавишей Tab

Так получается потому, что при добавлении флагов на панель их указатели в векторе, который является значением свойства Children панели, расположились в порядке, обратном созданию флагов

hparamD,    hparamC,     hparamB,    hparamA

В этом несложно убедиться при помощи команд

get(hpanel, 'Children')
[hparamD hparamC hparamB hparamA]'

Однако, если после создания последнего флага изменить свойство Children панели, задав новый порядок указателей:

set(hpanel, 'Children', [hparamD hparamB hparamC hparamA])

то тогда последовательность обхода клавишей Tab изменится (см. рисунок ниже)


Измененная последовательность обхода флагов клавишей Tab

Свойства, используемые для получения и установки состояния объектов

Элементы управления могут быть:

  • доступны или нет (недоступные элементы управления отображаются серым цветом), например, недоступный флаг не может быть установлен или сброшен;
  • активны или нет (например, если кнопка неактивна, то нажатие на нее не приводит к вызову функции, обрабатывающей ее событие Callback);
  • видимы или нет.

Свойство Enable, согласованное поведение кнопок

Свойство Enable отвечает за то, доступен объект или нет и активен он или нет. Свойство Enable может принимать значения 'on', 'inactive' или 'off'.

Разберем установку значений свойству Enable на простом примере приложения PlotClear, содержащего строку ввода, две кнопки Plot и Clear и оси.


Окно приложения PlotClear

Сначала кнопка Clear недоступна, а Plot доступна. При вводе выражения для некоторой функции, например x^2+2*x+3 в строку ввода и нажатии на кнопку Plot график функции на отрезке [0, 1] добавляется на оси и кнопка Clear становится доступной. Если ее нажать, то все графики пропадают и кнопка Clear снова становится недоступной. Итак, кнопка Clear доступна только тогда, когда на оси выведен хотя бы один график.

В основной функции PlotClear выполняются следующие действия.

  1. Создается окно приложения с заголовком PlotClear, не допускающее изменение размеров, т.к. свойству Resize окна установлено значение 'off'.
  2. Создается кнопка Plot и с ее событием Callback связывается функция btnPlot_Callback.
  3. Создается кнопка Clear и с ее событием Callback связывается функция btnClear_Callback. При создании кнопки ей дается тег btnClear, который понадобится для получения указателя на нее при установке ее свойству Visible значения 'on' в функции btnPlot_Callback обработки события Callback кнопки Plot.
  4. Создается область ввода с тегом edtFun.
  5. Создаются оси с тегом axMain, который понадобится для получения указателя на них в функциях btnPlot_Callback и btnClear_Callback обработки событий Callback кнопок Plot и Clear. Свойству NextPlot осей присваивается значение 'add' для того, чтобы при выводе очередного графика предыдущий бы не пропадал.

Далее запрограммированы функции btnPlot_Callback и btnClear_Callback обработки событий Callback кнопок Plot и Clear.

В функции btnPlot_Callback в структуру handles заносятся указатели на объекты приложения, из которых понадобятся handles.edtFun (указатель на область ввода) и handles.btnClear (указатель на кнопку Clear). Далее в переменную fun заносится содержимое строки ввода, т.е выражение для функции, введенное пользователем.

Поскольку введенное пользователем выражение может содержать ошибку, то график функции строится с обработкой исключительных ситуаций при помощи конструкции try...catch. В ветви try оси делаются текущими, далее при помощи функции fplot строится таблица значений функции на отрезке [0, 1] и она записывается в массивы x и y. Эта таблица значений визуализируется при помощи функции plot линией случайного цвета и толщиной в 3пт. Функция fplot в данном случае использована для построения таблицы значений функции с учетом поведения функции. Значения аргумента, в которых вычисляется функция выбираются автоматически, сгущаясь на участках резкого изменения поведения функции. После построения графика свойство Enable кнопки Clear устанавливается в значение 'on'.

Если при вычислении таблицы значений функции произошла какая-то ошибка (из-за того, что пользователь неверно ввел выражение для функции), то выполняется блок, идущий после catch. В нашем примере при помощи функции errordlg выводится стандартное диалоговое окно с сообщением об ошибке (стандартные диалоговые окна описаны в разделе Справка по функциям для создания диалоговых окон).

В функции btnClear_Callback указатели на объекты приложения записываются в структуру handles. Далее оси делаются текущими и очищаются при помощи функции cla. Кнопка Clear делается недоступной установкой ее свойству Enable значения 'off' (указатель на кнопку Clear содержится в первом входном аргументе src функции btnClear_Callback).

 
function PlotClear
% основная функция приложения

% создание графического окна 
figure('MenuBar', 'none',...
    'NumberTitle', 'off',...
    'Name', 'PlotClear',...
    'Units', 'pixels',...
    'Position', [100 100 420 400],...
    'Resize', 'off');
% создание кнопки Plot и связывание с ее событием Callback функции btnPlot
uicontrol('Style','pushbutton',...
    'String','Plot',...
    'Units','pixels',...
    'Position',[320 10 40 20],...
    'Callback',@btnPlot_Callback);
% создание кнопки Clear с тегом  btnClear 
% и связывание с ее событием Callback функции btnClear
uicontrol('Style','pushbutton',...
    'String','Clear',...
    'Units','pixels',...
    'Position',[370 10 40 20],...
    'Enable','off',...
    'Tag','btnClear',...
    'Callback',@btnClear_Callback);
% создание области ввода с тегом edtFun
uicontrol('Style','edit','Units','pixels',...
    'Position',[10 10 300 20],...
    'Tag','edtFun');
% создание осей с тегом axMain
axes('Units','pixels',...
    'Position',[40 50 350 330],...
    'Box','on',...   
    'NextPlot', 'add',...
    'Tag','axMain');

function btnPlot_Callback (src, evt)
% функция обработки события Callback кнопки Plot

% получение структуры указателей на объекты приложения
handles = guihandles(src);
% получение содержимого строки ввода
fun = get(handles.edtFun, 'String');
% построение графика с обработкой исключительных ситуаций 
try
    % делаем оси текущими
    axes(handles.axMain)
    % получаем таблицу значений функции
    [x,y] = fplot(fun, [0 1]);
    % строим график линией случайного цвета и толщины 3пт. 
    plot(x,y, 'Color', rand(1,3), 'LineWidth', 3)
    % делаем доступной кнопку Clear
    set(handles.btnClear, 'Enable' ,'on')
catch
    % при построении графика произошла ошибка, выводим сообщение об 
    % ошибке в функции
    errordlg('Error in function')  
end


function btnClear_Callback (src, evt)
% функция обработки события Callback кнопки Clear

% получение структуры указателей на объекты приложения
handles = guihandles(src);
% делаем оси текущими
axes(handles.axMain)
% очищаем оси
cla
% делаем кнопку Clear недоступной
set(src, 'Enable' ,'off')

Свойство Visible, настройка панели инструментов

Видимостью объекта управляет свойство Visible, которое может принимать значения 'on' или 'off'. Важно понимать, что невидимые объекты существуют и их свойства можно изменять.

В качестве примера использования свойства Visible приведем приложения changebuttons, в котором есть панель инструментов с тремя кнопками и меню View, при помощи которого можно добавлять или удалять кнопки, т.е. настраивать панель инструментов (см. три рисунка ниже, демонстрирующие удаление кнопки).


Исходное состояние панели инструментов


Выбор удаляемой кнопки


Измененная панель инструментов

В основной функции приложения changebuttons создаются следующие объекты.

  1. Графическое окно с указателем hwin и с заголовком changebuttons без стандартных меню и панели инструментов графических окон MATLAB.
  2. Панель инструментов с указателем htbar, для создания которой используется функция uitoolbar.
  3. Три кнопки на панели инструментов с указателями hbtnRed, hbtnGreen, hbtnBlue и с пиктограммами, содержащими, соответственно, красный, зеленый и синий квадраты. Для создания пиктограмм генерируются три трехмерных массива, задающих изображение (для помещения пиктограммы из графического файла следует предварительно считать его содержимое в трехмерный массив при помощи функции imread). Кнопки создаются при помощи функции uipushtool, первым входным аргументом которой является указатель на панель инструментов, а далее задаются пары с названием свойств и их значениями. В данном случае использовано только свойство CData для размещения на кнопке пиктограммы.
  4. Меню View окна приложения создается при помощи функции uimenu. Свойство Parent меню получает значение указателя на окно приложения hwin. Для задания названия меню используется свойство Label. Указатель на созданное меню записывается в переменную hmnView.
  5. Подменю Set toolbar в меню View создается так же при помощи функции uimenu. Свойство Parent пункта получает значение указателя hmnView на меню View. Для задания названия подменю так же, как и для задания названия меню, используется свойство Label. Указатель на созданный пункт меню записывается в переменную hmnSetToolbar.
  6. В пункте Set toolbar меню View снова при помощи функции uimenu создаются подпункты Red Button, Green Button и Blue Button. Свойство Parent каждого пункта получает значение указателя hmnSetToolbar на подменю Set toolbar меню View. Для задания названия пункту снова используется свойство Label. Слева от названия пункта помещается флаг, для чего свойство Checked пункта меню устанавливается в 'on'. Если пользователь снимает флаг выбором пункта меню, то соответствующая кнопка удалится с панели инструментов. Напротив, если пользователь устанавливает флаг выбором пункта меню, то соответствующая кнопка добавится на панель инструментов.

С каждым из пунктов Red Button, Green Button и Blue Button связывается одна и та же функция hide_show_Button обработки события Callback, которое возникает при выборе пользователем пункта меню. Но при выборе каждого из пунктов меню в функцию hide_show_Button кроме стандартных двух аргументов будет передаваться еще и третий, содержащий указатель на соответствующую кнопку. Например, для пункта Red Button свойство Callback получает значение {@hide_show_Button, hbtnRed}. Тогда при выборе этого пункта пользователем вызывается описанная ниже функция hide_show_Button, у которой есть три входных аргумента. Третий входной аргумент получает значение указателя hbtnRed на красную кнопку и функция hide_show_Button удалит или добавит (в зависимости от того, снимает пользователь флаг рядом с названием пункта меню, или устанавливает его) именно эту кнопку. Таким образом, можно обойтись одной функцией для программирования обработки событий Callback каждого из пунктов Red Button, Green Button и Blue Button.

После основной функции changebuttons запрограммирована подфункция hide_show_Button, вызываемая при выборе пользователем одного из пунктов меню. Ее первый входной аргумент src содержит указатель на пункт меню Red Button, Green Button или Blue Button, выбранный пользователем. Второй аргумент в данном примере не используется (но нужен по правилу написания функций обработки событий в MATLAB), а смысл третьего входного аргумента объяснен выше.

Подфункция hide_show_Button определяет состояние флага рядом с названием выбранного пользователем пункта меню. Если флаг не был установлен, то он устанавливается и соответствующая кнопка делается видимой при помощи ее свойства Visible. Если же флаг был установлен, то он сбрасывается и соответствующая кнопка делается невидимой. При этом кнопки на панели инструментов автоматически меняют положение так, чтобы между ними не было промежутков.

function changebuttons
% основная функция приложения changebuttons

% создание графического окна
hwin = figure('Position', [200 200 200 70],...
    'MenuBar', 'none',...
    'NumberTitle', 'off',...
    'Name', 'changebuttons');
% создание панели инструментов
htbar = uitoolbar;
% Заполнение трехмерного массива для красной пиктограммы
R(1:20,1:20,1) = ones(20); 
R(1:20,1:20,2) = zeros(20); 
R(1:20,1:20,3) = zeros(20);
% Заполнение трехмерного массива для зеленой пиктограммы
G(1:20,1:20,1) = zeros(20); 
G(1:20,1:20,2) = ones(20); 
G(1:20,1:20,3) = zeros(20);
% Заполнение трехмерного массива для синей пиктограммы
B(1:20,1:20,1) = zeros(20); 
B(1:20,1:20,2) = ones(20); 
B(1:20,1:20,3) = ones(20);
% Создание трех кнопок на панели инструментов
% кнопки имеют указатели btnRed, btnGreen, btnBlue
hbtnRed = uipushtool(htbar, 'CData', R)
hbtnGreen = uipushtool(htbar, 'CData', G)
hbtnBlue = uipushtool(htbar, 'CData', B)
% создание меню View
hmnView = uimenu('Parent', hwin,...
    'Label', 'View')
% создание пункта Set toolbar в меню View
hmnSetToolbar = uimenu('Parent', hmnView,...
    'Label', 'Set toolbar')
% создание подпункта Red Button  с флагом в пункте Set toolbar в меню View
% и связывание с его событием Callback функции hide_show_Button с дополнительным 
% входным аргументом - указателем на красную кнопку 
uimenu(hmnSetToolbar, 'Label', 'Red Button',...
    'Checked', 'on',...
    'Callback', {@hide_show_Button, hbtnRed})
% создание подпункта Green Button с флагом  в пункте Set toolbar в меню View
% и связывание с его событием Callback функции hide_show_Button с дополнительным 
% входным аргументом - указателем на зеленую кнопку 
uimenu(hmnSetToolbar, 'Label', 'Green Button',...
    'Checked', 'on',...
    'Callback', {@hide_show_Button, hbtnGreen})
% создание подпункта Blue Button с флагом  в пункте Set toolbar в меню View
% и связывание с его событием Callback функции hide_show_Button с дополнительным 
% входным аргументом - указателем на синюю кнопку 
uimenu(hmnSetToolbar, 'Label', 'Blue Buton',...
    'Checked', 'on',...
    'Callback', {@hide_show_Button, hbtnBlue})

function hide_show_Button(src, evt, hbtn)
% функция для обработки события Callback пунктов Red Button, Green Button и Blue Button
% пункта Set toolbar в меню View

% получение состояния выбранного пункта 
state = get(src, 'Checked');
% проверка, был установлен  флаг рядом с названием пункта
if isequal(state, 'off')
    % флаг не был установлен
    % ставим его 
    set(src, 'Checked', 'on')
    % и делаем соответствующую кнопку видимой
    set(hbtn, 'Visible', 'on')
else
    % флаг был установлен
    % снимаем его
    set(src, 'Checked', 'off')
    % и делаем соответствующую кнопку невидимой
    set(hbtn, 'Visible', 'off')
end


Поиск по сайту:

Система Orphus

Яндекс.Метрика