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

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

Справочник свойств графических объектов

Фокус ввода, доступные и недоступные элементы интерфейса, всплывающие подсказки, обход клавишей Tab.

В этом разделе мы рассмотрим, как сделать интерфейс приложения дружественным и понятным пользователю. Рассмотрим простой пример приложения myplot с графическим интерфейсом пользователя, которое служит для построения графиков функций одной переменной. Окно приложения myplot (см. рис. 1a) содержит оси, область ввода Function для задания функции одной переменной, области ввода Left и Right для задания границ интервала для построения графика и две кнопки: Plot - для вывода графика очередной функции и Clear - для удаления графика.

Интерфейс приложения myplot организуем следующим образом.

1. В начале работы приложения myplot кнопки Plot и Clear недоступны (поскольку функция не задана).

2. После ввода формулы в Function и нажатия <Enter> фокус передается области ввода Left, затем Right.

3. После нажатия <Enter> в области ввода Right кнопка Plot становится доступной и находится в фокусе.

4. Если пользователь нажал на Plot, то на оси добавляется график, кнопка Clear становится доступной и фокус передается области ввода Function (см. рис. 1b).

5. Если пользователь нажал Clear, то все графики пропадают, области ввода Function, Left и Right очищаются, кнопки Plot и Clear становятся недоступными и фокус передается области ввода Function (см. рис. 1a).

Кнопки и области ввода снабдим всплывающими подсказками. Кроме того, установим порядок обхода элементов управления клавишей <Tab>.

Рис. 1. Приложение myplot

В среде GUIDE создайте заготовку для нового приложения и разместите на ней (см. рис. 2):

·  оси (при помощи инструмента Axes);

·  три области ввода (при помощи инструмента Edit Text);

·  три области статического текста (при помощи инструмента Static Text);

·  и две кнопки (при помощи инструмента Push Button).

Размещение элементов управления мы обсуждали выше в разделе "Создание приложения hello в среде GUIDE"). На рис. 2 эти элементы приведены со своими тегами. Часть тегов для статического текста оставлена такими, какие даются по умолчанию (text1, text2, text3), поскольку мы не будем обращаться к статическому тексту при программировании приложения. Остальные теги желательно задать в соответствии с рис. 2, поскольку они понадобятся при программировании событий.

Рис. 2. Размещение элементов управления в среде GUIDE

Задайте теги в инспекторе свойств, а так же установите значения другим свойствам объектов:

·  свойство осей NextPlot в add для того, чтобы линии графиков добавлялись на оси с сохранением предыдущих;

·  свойство Enable обеих кнопок в off для того, чтобы в начале работы приложения кнопки были недоступны;

·  свойство String областей статического текста в подходящие значения (Function, Left и Right);

·  цвет статического текста и надписи на кнопках (Plot, Clear) при помощи свойства ForegroundColor;

·  свойства шрифта статического текста при помощи свойств, названия которых начинаются со слова Font;

·  свойство String областей ввода - пустую строку.

 

Примечание

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

Примечание

В нашем случае область ввода является однострочной, такой она добавляется по умолчанию. Область ввода может допускать ввод нескольких строк, разделяемых нажатием на клавишу <Enter>. Для того, чтобы сделать область ввода многострочной, следует установить значения ее свойствам Max и Min так, чтобы их разность была больше единицы.

Примечание

Для завершения ввода многострочного текста используется сочетание клавиш <Ctrl>+<Enter>. В случае однострочного текста значением свойства String является строка, а в случае многострочного - массив строк.

Сохраните приложение с именем myplot. Далее требуется запрограммировать события Callback областей ввода и кнопок. Событие Callback области ввода, состоящей из одной строки, возникает, если пользователь нажал <Enter> или перешел к другому элементу управления (т.е. фокус был передан другому объекту), или щелкнул мышью по свободному месту в окне приложения.

Приступим к программированию событий в среде GUIDE, выбирая во всплывающем меню каждого элемента управления в пункте View Callbacks подпункт Callback для перехода к соответствующей подфункции в m-файле myplot.m, ассоциированном с приложением.

При возникновении события Callback области ввода Function требуется передать фокус области ввода Left. Для передачи фокуса объекту используется функция uicontrol, во входном аргументе которой задается указатель на объект (функция uicontrol служит также и для создания элементов управления Uicontrol с указанием их свойств). Как мы уже обсуждали, указатели на объекты содержатся в полях структуры handles, имена полей совпадают с тегами соответствующих объектов, например handles.edtLeft содержит указатель на область ввода Left. Поэтому, подфункция edtFunction_Callback должна иметь следующий вид.

  function edtFunction_Callback(hObject, eventdata, handles)
  % передаем фокус области ввода Left
  uicontrol(handles.edtLeft)

Аналогичным образом запрограммируем события Callback областей ввода Left и Right, но в случае области ввода Right не только передадим фокус кнопке Plot, но и сделаем ее доступной. Подфункции edtLeft_Callback и edtRight_Callback приведены ниже.

  function edtLeft_Callback(hObject, eventdata, handles)
  % передаем фокус области ввода Right
  uicontrol(handles.edtRight)
  
  function edtRight_Callback(hObject, eventdata, handles)
  % делаем кнопку Plot доступной
  set(handles.btnPlot, 'Enable', 'on')
  % передаем фокус кнопке Plot
  uicontrol(handles.btnPlot)

При возникновении события Callback кнопки Plot выведем график, сделаем доступной кнопку Clear и передадим фокус области ввода Function. Для визуализации функции воспользуемся fplot, которая строит график функции с адаптивным подбором шага, учитывающим поведение функции. В самом простом случае обращение к fplot выглядит так:

fplot(fun, [a b])

Здесь fun - строка или строковая переменная с записью выражения для функции в соответствии с правилами MatLab, a и b - границы изменения аргумента. Строку с выражением для функции мы получим, обратившись к свойству String области ввода Function (при помощи функции get), а для получения границ изменения аргумента придется не только считать строковые значения свойства String области ввода Left и Right, но и преобразовать их в числовые, обратившись к функции str2num. Подфункция btnPlot_Callback может выглядеть следующим образом.

  function btnPlot_Callback(hObject, eventdata, handles)
  % записываем строку с формулой в строковую переменную fun
  fun = get(handles.edtFunction, 'String');
  % получаем содержимое области ввода Left, преобразуем в число 
  % и заносим в переменную Left
  Left = str2num(get(handles.edtLeft, 'String'))
  % получаем содержимое области ввода Right, преобразуем в число 
  % и заносим в переменную Right
  Right = str2num(get(handles.edtRight, 'String'))
  % вызываем fplot для построения графика функции
  fplot(fun, [Left Right])
  % делаем доступной кнопку Clear
  set(handles.btnClear, 'Enable', 'on')
  % передаем фокус области ввода Function
  uicontrol(handles.edtFunction)

Примечание

В нашем случае график выведется на оси, размещенные в окне приложения. Так произойдет потому, что окно приложения становится текущим графическим окном при выполнении событий. Где устанавливаются подобного рода опции? В меню Tools среды GUIDE выберите пункт GUI Options. Появляется диалоговое окно GUI Options, раскрывающийся список которого Command-line accessibility содержит строку Callback (GUI becomes Current Figure within Callbacks). В этом диалоговом окне изменять ничего не нужно. Обсуждению этих опций мы посвятим отдельный раздел.

Для очистки осей проще всего применить команду cla, поскольку в нашем случае единственные оси, размещенные в окне приложения, являются текущими. Функция обработки события кнопки Clear должна также удалять содержимое областей ввода, делать кнопки Plot и Clear недоступными и передавать фокус области ввода Function.

  function btnClear_Callback(hObject, eventdata, handles)
  % очистка осей
  cla
  % удаление содержимого областей ввода
  set(handles.edtFunction, 'String', '')
  set(handles.edtLeft, 'String', '')
  set(handles.edtRight, 'String', '')
  % делаем кнопки Plot и Clear недоступными
  set(handles.btnClear, 'Enable', 'off')
  set(handles.btnPlot, 'Enable', 'off')
  % передаем фокус области ввода Function
  uicontrol(handles.edtFunction)

Запустите приложение myplot и убедитесь, что оно работает верно. Осталось снабдить элементы управления всплывающими подсказками и установить порядок их обхода клавишей Tab.

Для того, чтобы при наведении мыши на элемент управления появлялась всплывающая подсказка, требуется в инспекторе свойств установить его свойство TooltipString в подходящее значение, например:

·  для области ввода Function - Input formula;

·  для области ввода Left - Input left boundary of interval и т.д.

Для задания порядка обхода клавишей Tab служит редактор Tab Order Editor. Его окно появляется при выборе в меню Tools среды GUIDE пункта Tab Order Editor. Панель инструментов содержит всего две кнопки: Move Up и Move Down для перемещения текущей строки с элементом управления вверх или вниз списка, соответственно (см. рис. 3). Пользуясь ими можно задать любой порядок обхода.

Рис. 3. Редактор Tab Order Editor


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

Система Orphus

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