Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ № 5 Создание приложений с GUI без среды GU...doc
Скачиваний:
9
Добавлен:
24.11.2019
Размер:
470.53 Кб
Скачать

Задание размеров окна приложения и элементов интерфейса

Теперь обсудим задание размеров графического окна и элементов интерфейса. Лучше всего сразу выбрать один из подходов для задания положения и размеров осей в пределах графического окна приложения и для расположения кнопок и других элементов интерфейса. По умолчанию, положение осей задается вектором из четырех элементов [x y width height] (x, y - координаты левого нижнего угла осей, width - их ширина, а height - высота) в нормализованных единицах, т.е. считается, что левый нижний угол графического окна имеет координаты (0, 0), а ширина и высота окна принимаются за единицу. Часто для осей лучше устанавливать не свойство Position, а OuterPosition (появилось в MATLAB 7), которое задает положение и размеры осей вместе с разметкой осей, заголовком и подписями к осям. При использовании свойства OuterPosition гарантированно не будет перекрытия осей с другими элементами интерфейса приложения.

Размеры и положение элементов управления uicontrol (кнопок, списков, переключателей, флагов, областей ввода, полос скроллинга) по умолчанию задаются в пикселях. В нашем примере значением свойства Position кнопки Plot был вектор [20 20 120 30], т.е. координаты левого нижнего угла кнопки (20, 20) в окне приложения, ее ширина 120 пикселей, а высота 30 пикселей. В зависимости от того, как должно вести себя графическое окно при изменении размеров, можно выбрать один из следующих вариантов задания единиц измерения и расположения объектов (именно такой подход реализован в среде GUIDE).

1. Графическое окно приложения сразу создается заданного размера и не допускает изменения размеров пользователем. В этом случае в качестве единиц измерения для всех объектов: графического окна, осей, кнопок и т.д. выбираются символы (characters). При этом окно приложения отображается корректно вне зависимости от системных настроек. Для запрета изменения размеров следует установить свойство Resize графического окна в 'off'. Вот пример основной функции приложения myplotgui, рассмотренного выше, которая создает окно, кнопку и оси с размерами, заданными в символах (подфункция BtnPlotCallback остается без изменений):

function myplotgui

% Окно приложения не допускает изменения размеров

% Все единицы измерения - символы

% создание графического окна

hF = figure('Name', 'myplotgui', 'NumberTitle', 'off',...

'Resize', 'off', 'MenuBar', 'none', 'Units', 'characters');

set(hF, 'Position', [10 10 100 30]);

% создание осей

hA = axes('Units', 'characters', 'Position', [6 6 80 20]);

% создание кнопки и задание свойству Callback значения указателя на подфункцию

hBtnPlot = uicontrol('Style', 'pushbutton', 'Units', 'characters',...

'Position', [6 2 10 2],'String', 'Plot','Callback', @BtnPlotCallback);

2. Графическое окно приложения должно допускать изменение размеров пользователем и автоматически пропорционально изменять размеры всех объектов. Тогда размеры и положение осей и элементов управления приложения задаются в нормализованных единицах, а размеры и положение графического окна в символах. Для разрешения изменения размеров графического окна, его свойство Resize должно иметь значение 'on' (как по умолчанию). Основная функция приложения myplotgui, рассмотренного выше, может выглядеть таким образом (подфункция BtnPlotCallback остается без изменений):

function myplotgui

% Окно приложения допускает пропорциональное изменение размеров

% Элементы интерфейса заданны в нормализованных единицах измерения

% создание графического окна

hF = figure('Name', 'myplotgui', 'NumberTitle','off',...

'MenuBar', 'none', 'Units', 'characters');

set(hF, 'Position', [10 10 100 30]);

% создание осей

hA = axes('Units', 'normalized',...

'Position', [0.06 0.2 0.8 0.67]);

% создание кнопки и задание свойству Callback значения указателя на подфункцию

hBtnPlot = uicontrol('Style', 'pushbutton', 'Units','normalized',...

'Position', [0.06 0.07 0.1 0.07], 'String', 'Plot',...

'Callback', @BtnPlotCallback);

При таком способе иногда имеет смысл задавать нормализованные единицы измерения шрифта осей и элементов управления. Для этого их свойство FontUnits устанавливается в 'normalized':

hA = axes(...,'FontUnits', 'normalized',...);

hBtnPlot = uicontrol(..., 'FontUnits', ' normalized',...);

Тогда при изменении размеров окна приложения автоматически изменится размер надписей на элементах управления и размер подписей к осям.

3. Объекты изменяют размеры и положение по некоторому алгоритму. Для этого пишется функция обработки события ResizeFcn графического окна, которое возникает при изменении размеров окна приложения. В этой функции программируется способ изменения размеров и положения каждого объекта независимо, причем некоторые объекты могут не менять свои размеры. Этот подход мы рассмотрим отдельно.

В любом случае, перед выводом окна приложения на экран полезно узнать размеры экрана монитора. Размеры экрана монитора являются значением свойства ScreenSize корневого объекта Root, указатель на который всегда равен нулю. Для получения значения свойства графического объекта используется функция get:

s = get(0, 'ScreenSize')

В вектор s записываются координаты нижнего левого угла, ширина и высота экрана. По умолчанию, размеры экрана возвращаются в пикселях и левый нижний угол имеет координаты (1,1). Для получения размеров экрана в других единицах измерения необходимо предварительно изменить значение свойства Units корневого объекта и не забыть вернуть ему прежнее значение, т.к. многие функции предполагают, что его свойство Units имеет значение 'pixels' (как по умолчанию):

un = get(0, 'Units')

set(0, 'Units', 'characters')

s = get(0, 'ScreenSize')

set(0, 'Units', un)