
- •Лабораторная работа № 5 тема:«Создание приложений с gui без среды guide»
- •Простой пример - приложение с кнопкой и осями
- •Задание размеров окна приложения и элементов интерфейса
- •Задание дополнительных параметров в функциях обработки событий
- •Скрытие указателей объектов приложения с gui
- •Получение указателей на объекты приложения в функциях обработки событий, функция guihandles.
- •Сохранение данных, полученных в функции обработки событий, функция guidata.
- •Обмен данными между функциями обработки событий. Обработка событий объектов, создаваемых приложением.
- •Сохранение объектов приложения для повторных запусков.
- •Рисование кривых мышью
- •Перемещение объектов на осях мышью
- •Приложение с панелью переключателей для zoom и pan
Приложение с панелью переключателей для zoom и pan
В данном разделе демонстрируется создание простого приложения с графическим интерфейсом пользователя panzoom, содержащее оси с графиком и панель переключателей для увеличения мышью масштаба просмотра как отдельно по каждой из осей, так и по обеим осям сразу, а также для прокрутки содержимого осей как по отдельным осям, так и в произвольном направлении. Окно приложения приведено ниже.
Для увеличения масштаба просмотра в MATLAB имеется команда zoom, которая может быть вызвана с дополнительными опциями:
zoom on — включает интерактивное увеличение масштаба просмотра при помощи щелчка мыши или выделения увеличиваемой области;
zoom off — выключает интерактивное увеличение масштаба просмотра;
zoom out — возвращает график к исходному масштабу;
zoom reset — запоминает текущее состояние как исходное, так что последующее выполнение zoom out установит именно этот запомненный масштаб;
zoom xon — включает интерактивное увеличение масштаба просмотра по оси x;
zoom yon — включает интерактивное увеличение масштаба просмотра по оси y;
zoom(factor) — увеличение масштаба в factor раз (если factor от 0 до 1, то, соответственно происходит уменьшение масштаба).
Если zoom вызвана без дополнительных опций, то происходит переключение между zoom on и zoom off. По умолчанию, zoom работает для текущего графического окна, однако, если использовать функциональную форму вызова zoom, то появляется возможность задать указатель fig на требуемое графическое окно, например:
zoom(fig, ‘on’)
Вместо ‘on’ можно указать перечисленные выше опции для командного способа вызова zoom.
Перемещение области просмотра производится при помощи команды pan, которая, так же как и zoom, может быть вызвана с дополнительными опциями.
pan on — включает интерактивное перемещение области просмотра захватом мышью; pan xon — включает интерактивное перемещение области просмотра только по горизонтали; pan yon — включает интерактивное перемещение области просмотра только по вертикали; pan off — выключает интерактивное перемещение области просмотра.
Аналогично zoom команда pan, вызываемая без дополнительных опций, производит переключение между pan on и pan off. Функциональный способ вызова pan позволяет задать указатель на графическое окно, к осям которого должно быть применено интерактивное перемещение области просмотра, например:
pan(fig, ‘on’)
Одновременно режимы pan и zoom не могут быть включены. Включение одного из них приводит к отмене другого.
В приложении panzoom предусмотрено шесть переключателей для включения pan, pan xon, pan yon, zoom, zoom xon и zoom yon. Переключатели размещены на панели переключателей, обладающей удобным свойством: она сама следит за тем, чтобы был включен только один переключатель, автоматически сбрасывая ранее включенный. При этом, для обработки переключения следует использовать событие панели SelectionChangeFcn (а не событие Callback переключателей) и в соответствующей функции обработки события отслеживать установленный переключатель, например при помощи if и значения Value каждого из них. Есть и второй способ, который состоит в обращении к свойству SelectedObject панели переключателей. Его значение содержит номер включенного переключателя, причем переключатели нумеруются в порядке создания.
Ниже приведен текст функции panzoom вместе с подфункцией btnGroupChange обработки события SelectionChangeFcn панели переключателей. В основной функции panzoom создаются графическое окно и оси, на которые выводится график функции sin1/x. Далее создается панель с указателем hbtngr, содержащая шесть переключателей. Для того, чтобы переключатели принадлежали панели переключателей, следует при их создании функцией uicontrol в качестве первого ее входного аргумента задать указатель на панель переключателей:
uicontrol(hbtngr, 'Style', 'radiobutton', ...
Для задания включенного переключателя используется свойство SelectedObject панели переключателей:
set(hbtngr, 'SelectedObject', rbtnZoom)
соответственно, сразу же включается режим интерактивного увеличения
zoom on
В подфункции btnGroupChange используется оператор if для включения нужного режима в зависимости от установленного переключателя
function panzoom
% создание окна приложения
figure('Resize', 'off', 'Menubar', 'none', ...
'Name', 'panzoom', 'NumberTitle', 'off')
% создание осей приложения
axes('Position', [0.1 0.1 0.6 0.8])
% вывод графика
x = linspace(0.01,6,100000);
y = sin(1./x);
plot(x,y)
% создание панели переключателей
hbtngr = uibuttongroup('Position', [0.725 0.1 0.25 0.35],...
'Title', 'Pan&Zoom','FontSize', 10, ...
'SelectionChangeFcn', @btnGroupChange);
% создание шести переключателей
uicontrol(hbtngr, 'Style', 'radiobutton', ...
'Units', 'normalized', 'Position', [0.05 0.8 0.8 0.1],...
'String', 'pan x and y', 'Tag', 'rbtnPanXY',...
'FontSize', 10)
uicontrol(hbtngr, 'Style', 'radiobutton', ...
'Units', 'normalized', 'Position', [0.05 0.7 0.8 0.1],...
'String', 'pan x only', 'Tag', 'rbtnPanX',...
'FontSize', 10)
uicontrol(hbtngr, 'Style', 'radiobutton', ...
'Units', 'normalized', 'Position', [0.05 0.6 0.8 0.1],...
'String', 'pan y only', 'Tag', 'rbtnPanY',...
'FontSize', 10)
rbtnZoom = uicontrol(hbtngr, 'Style', 'radiobutton', ...
'Units', 'normalized', 'Position', [0.05 0.4 0.8 0.1],...
'String', 'zoom x and y', 'Tag', 'rbtnZoomXY', ...
'FontSize', 10);
uicontrol(hbtngr, 'Style', 'radiobutton', ...
'Units', 'normalized', 'Position', [0.05 0.3 0.8 0.1],...
'String', 'zoom x only', 'Tag', 'rbtnZoomX',...
'FontSize', 10)
uicontrol(hbtngr, 'Style', 'radiobutton', ...
'Units', 'normalized', 'Position', [0.05 0.2 0.8 0.1],...
'String', 'zoom y only', 'Tag', 'rbtnZoomY',...
'FontSize', 10)
% включение переключателя 'zoom x and y'
set(hbtngr, 'SelectedObject', rbtnZoom)
% включение режима увеличения
zoom on
function btnGroupChange(src, evt)
% функция обработки события SelectionChangeFcn панели
% получение структуры указателей на объекты приложения
handles = guihandles(src);
% проверка включенного переключателя
if isequal(get(handles.rbtnPanXY, 'Value'), 1)
pan on
elseif isequal(get(handles.rbtnPanX, 'Value'), 1)
pan xon
elseif isequal(get(handles.rbtnPanY, 'Value'), 1)
pan yon
elseif isequal(get(handles.rbtnZoomXY, 'Value'), 1)
zoom on
elseif isequal(get(handles.rbtnZoomX, 'Value'), 1)
zoom xon
else
zoom yon
end