
- •Лабораторная работа № 5 тема:«Создание приложений с gui без среды guide»
- •Простой пример - приложение с кнопкой и осями
- •Задание размеров окна приложения и элементов интерфейса
- •Задание дополнительных параметров в функциях обработки событий
- •Скрытие указателей объектов приложения с gui
- •Получение указателей на объекты приложения в функциях обработки событий, функция guihandles.
- •Сохранение данных, полученных в функции обработки событий, функция guidata.
- •Обмен данными между функциями обработки событий. Обработка событий объектов, создаваемых приложением.
- •Сохранение объектов приложения для повторных запусков.
- •Рисование кривых мышью
- •Перемещение объектов на осях мышью
- •Приложение с панелью переключателей для zoom и pan
Сохранение данных, полученных в функции обработки событий, функция guidata.
Если приложение с графическим интерфейсом программируется в файл-функции, в которой основная функция создает окно приложения и элементы управления, а подфункции предназначены для обработки событий элементов управления и объектов приложения, то часто возникает следующий вопрос. Как сохранить некоторые данные, полученные в ходе выполнения одной функции обработки события, и передать их в другую функцию? Запись данных в переменную ничего не дает, поскольку переменные подфункции являются локальными и по завершении работы подфункции они удаляются из памяти.
Один из возможных подходов к решению этой проблемы состоит в создании структуры, поля которой содержат некоторые общие данные. Назовем эту структуру handles, как и в предыдущем разделе. Для сохранения этой структуры служит функция guidata, которая часто используется в сочетании с функцией guihandles, предназначенной для получения указателей на объекты приложения. Для получения структуры handles в функции обработки события достаточно вызвать функцию guidata со входным аргументом - указателем на тот объект, событие которого выполняется (он и будет потомком графического окна приложения). После этого в структуре handles можно создать новое поле, например data, записать в него необходимые данные и сохранить обновленную структуру handles при помощи функции guidata
function ObjectCallback(src,evt)
....
% имеются некоторые данные, записанные в массив A
% получаем структуру handles
handles = guidata(src);
% добавляем в нее поле data
handles.data = A;
% сохраняем структуру
guidata(handles, src)
...
Полученную структуру handles можно использовать в других функциях обработки событий объектов и элементов управления приложения с графическим интерфейсом.
В качестве простого примера приведем приложение presscount, содержащее всего одну кнопку, надпись на которой содержит число нажатий на кнопку (см. рис. 4).
Рис.
4. Окно приложения presscount
В основной функции приложения presscount создается графическое окно и кнопка с надписью "You have not press me yet". Затем создается структура handles с одним полем times, которому присваивается 0 (пока кнопка ни разу не нажималась). Структура handles сохраняется при помощи функции guidata.
При каждом нажатии на кнопку в функции BtnCallback обработки события Callback кнопки вызывается функция guidata для получения структуры handles, значение ее поля times увеличивается на единицу и структура handles сохраняется. Остается изменить надпись на кнопке, прибегнув к функции num2str для преобразования числа в строку и сцеплению строк при помощи квадратных скобок.
function presscount
% создаем графическое окно
hF = figure('Name', 'presscount', 'NumberTitle','off',...
'MenuBar', 'none', 'Units', 'characters', 'Position', [10 10 100 5]);
% создаем кнопку
uicontrol('Style', 'pushbutton', 'Units','normalized',...
'Position', [0.1 0.1 0.8 0.8],...
'String', 'You have not press me yet',...
'FontSize', 16, 'Callback', @BtnCallback);
% создаем структуру handles с полем times, в которое записываем 0
% (кнопка нажималась 0 раз)
handles.times = 0;
% сохраняем структуру handles
guidata(hF, handles)
% скрываем указатели на объекты приложения
set(hF, 'HandleVisibility', 'callback');
function BtnCallback(src, evt)
% подфункция обработки нажатия на кнопку
% получаем структуру handles
handles = guidata(src);
% увеличиваем значение ее поля times на единицу
handles.times = handles.times + 1;
% сохраняем структуру handles
guidata(src, handles);
% изменяем надпись на кнопке
str = ['You pressed me ' num2str(handles.times) ' times'];
set(src, 'String', str)
Примечание. В принципе, не обязательно было использовать структуру handles с полем times. Вместо этого можно было использовать переменную, например times. Но если предполагается обмен несколькими данными между функциями обработки событий (включая указатели на элементы управления и объекты приложения), то удобно использовать структуру (см. следующий раздел).