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

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

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

Стандартные диалоговые окна.

Функции для создания диалоговых окон

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

Диалоговые окна сообщений:

errordlg - создание диалогового окна с сообщением об ошибке;

helpdlg - создание диалогового окна для вывода информации;

warndlg - создание диалогового окна предупреждения;

msgbox - создание диалогового окна для вывода сообщения.

Диалоговое окно подтверждения (функция questdlg)

Диалоговое окно для ввода информации (функция inputdlg)

Диалоговое окно для выбора из списка (функция listdlg)

Диалоговые окна для заданий опций печати

pagesetupdlg - вывод многостраничного диалогового окна для установки параметров листа и способа печати содержимого графического окна;

printdlg - отображение диалогового окна для выбора опций печати и настройки принтера.

Диалоговые окна открытия и сохранения файла

uigetfile - отображение диалогового окна открытия файла

uiputfile - отображение диалогового окна сохранения файла

Диалоговое окно выбора каталога (функция uigetdir)

Диалоговое окно выбора шрифта (функция uisetfont)

Диалоговое окно выбора цвета (функция uisetcolor)

Окно с полосой прогресса (функция waitbar)

Кроме перечисленных функций имеется функция dialog, предназначенная для создания пустого графического окна. Свойства этого графического окна могут быть установлены при помощи входных аргументов функции dialog.

Рассмотрим использование стандартных диалоговых окон на примере окна открытия файла.

Пример приложения myview с диалоговым окном открытия файла

Создадим приложение myview с графическим интерфейсом пользователя, которое позволяет просматривать графические файлы. Окно работающего приложения приведено на рис. 1. Нажатие на кнопку Open Image приводит к появлению стандартного диалогового окна открытия файла Select File to Open. Выбранный в нем графический файл отображается в окне приложения. Нажатие на кнопку Close Image очищает окно приложения myview.

Рис. 1. Окно приложения myview.

В среде GUIDE на заготовке окна приложения разместите оси и две кнопки так, как показано на рис.2. В инспекторе свойств задайте левой кнопке тег btnOpen и установите ее свойство String в Open Image. Аналогично для правой кнопки: тег - btnClose и String - Close Image.

Оси понадобятся для вывода изображения при помощи функции image. Мы будем использовать низкоуровневое обращение к функции image, которое предполагает обратное направление оси y для того, чтобы рисунок не был перевернут. Поэтому в инспекторе свойств измените направление оси y, установив свойство осей YDir в reverse. Для того, чтобы скрыть координатную разметку и линии осей, сделайте оси невидимыми, установив их свойство Visible в off.

Рис. 2. Заготовка окна приложения в среде GUIDE.

Сохраните приложение с именем myview и запрограммируйте события Callback кнопок Open Image и Close Image.

При нажатии пользователем на Open Image должен появляться диалог открытия файла и после выбора файла рисунок должен отображаться на осях. Воспользуемся стандартным диалоговым окном открытия файла, которое создает функция uigetfile. Самое простое обращение к ней выглядит следующим образом:

[FileName, PathName] = uigetfile

Если пользователь выбрал файл и закрыл окно, нажав в нем кнопку Open, то в первом выходном аргументе FileName возвращается имя файла (с расширением), а во втором PathName - путь к файлу. Если же пользователь не выбрал файл (нажал Cancel, или закрыл окно кнопкой с крестиком на заголовке окна, или нажал <Esc>), то переменная FileName будет равна нулю. Поэтому дальнейшие действия зависят от значения FileName.

Если файл был выбран, то следует

1) сформировать полное имя файла;

2) считать изображение из файла в переменную при помощи функции imread;

3) вывести изображение на оси, воспользовавшись функцией image.

Если файл не был выбран, то и делать ничего не надо.

Событие Callback кнопки Close Image может состоять всего из одного оператора - обращения к функции cla для очистки осей.

Запрограммируйте подфункции обработки события Callback кнопок Open Image и Close Image следующим образом.

function btnOpen_Callback(hObject, eventdata, handles)
% Обработка события Callback кнопки Open Image

% Получение имени и пути к файлу
[FileName, PathName] = uigetfile;
% Проверка, был ли выбран файл
if FileName~=0
    % Формирование полного пути к файлу
    FullName = [PathName FileName];
    % Считывание изображения из графического файла 
    Pict = imread(FullName);
    % Вывод изображения на оси
    image('CData', Pict)
end

function btnClose_Callback(hObject, eventdata, handles)
% Обработка события Callback кнопки Close Image

% Очистка осей
cla

Запустите приложение myview. При нажатии на кнопку Open Image появляется диалоговое окно открытия файла Select File to Open. Однако, в поле, в котором отображается содержимое текущей папки не видно графических файлов. Так происходит потому, что по умолчанию фильтр файлов (раскрывающийся список Files of type) содержит строку "All MATLAB Files" и видны файлы только с теми расширениями, которые приняты в MATLAB. Разумеется, можно каждый раз при открытии графического файла выбирать в раскрывающемся списке Files of type строку "All Files (*.*)" для отображения всех файлов текущей папки. Но гораздо лучше сразу создавать диалоговое окно открытия файла, настроенное на определенные расширения. Например, для отображения файлов с расширениями bmp и jpg следует обратиться к функции uigetfile со входным аргументом - строкой, в которой через точку с запятой записаны шаблоны с нужным расширением *.bmp и *.jpg:

[FileName, PathName] = uigetfile('*.bmp;*.jpg');

Измените в подфункции btnOpen_Callback обращение к uigetfile на вышеприведенное и убедитесь, раскрывающийся список Files of type диалогового окна открытия файлов содержит всего две строки: "*.bmp;*.jpg" (по умолчанию) и "All Files (*.*)".

Функция uigetfile допускает более гибкое управление настройками фильтра файлов. Мы их рассмотрим в разделе, посвященном описанию функций для создания стандартных диалоговых окон. Обсудим теперь, как реализовать возможность выбора сразу нескольких файлов в стандартном диалоговом окне открытия файла.

Выбор нескольких файлов в диалоговом окне открытия файла. Обмен данными между подфункциями приложения с GUI.

В этом разделе мы рассмотрим два вопроса:

1) как организовать выбор нескольких файлов в стандартном окне открытия файла и считать их содержимое в подходящий массив;

2) что делать дальше - как в подфункциях обработки событий обратиться к данным, которые были получены в других подфункциях.

Ответ на первый вопрос простой. Надо вызвать функцию uigetfile с дополнительной парой входных аргументов 'MultiSelect' и 'on':

[FileName, PathName] = uigetfile(..., 'MultiSelect', 'on')

В зависимости от выбора пользователя выходные аргументы будут следующих типов.

  • Если в диалоговом окне открытия файла пользователь выбрал несколько файлов (выделением мышью или щелчком мыши с удержанием <Ctrl> или <Shift>), то FileName станет массивом ячеек, каждая ячейка которого содержит строку с именем файла (и расширением), а PathName будет строкой, в которой записан путь к этим файлам (путь ко всем файлам один и тот же, поэтому PathName не должен быть массивом ячеек).
  • Если в диалоговом окне открытия файла пользователь выбрал один файл, то FileName будет строкой с именем файла (с расширением), а PathName - строкой с путем к файлу (см. предыдущий раздел).
  • Если выбор не был сделан, то FileName равно нулю.

Второй вопрос (обмен данными между подфункциями обработки событий) часто возникает при программировании приложений с графическим интерфейсом. Он решается следующим образом. Данные, которые требуется сохранить при выполнении некоторой подфункции, записываются в поля структуры handles. Затем в этой же подфункции структура handles сохраняется при помощи функции guidata:

guidata(gcbo, handles)

Для получения данных в другой подфункции следует обратиться к соответствующему полю структуры handles. Например, в приложении есть две подфункции btnA_Callback и btnB_Callback. При выполнении подфункции btnA_Callback был создан числовой массив, который понадобится в подфункции btnB_Callback. Тогда эти подфункции должны иметь следующий вид.

function btnA_Callback(hObject, eventdata, handles)
. . .
handles.data = [1 2 3 4];
guidata(gcbo, handles)
. . .
function btnB_Callback(hObject, eventdata, handles)
. . .
bar(handles.data)
. . .

Обратимся к приложению myview, созданному в предыдущем разделе, и расширим его возможности. Модернизированное приложение должно позволять открытие сразу нескольких графических файлов и их поочередный просмотр. После выбора нескольких графических файлов в окне приложения отображается только один, а нажатие на кнопку (назовем ее Next) приводит к появлению следующего изображения.

В среде GUIDE на заготовку окна приложения myview (см. рис.2 предыдущего раздела) добавьте кнопку c тегом btnNext и надписью Next (см. рис. 1). В инспекторе свойств сделайте ее недоступной, установив свойство Enable в off. Она будет доступной в ходе работы приложения, если пользователь выбрал для просмотра несколько графических файлов.

Рис. 1. Окно приложения myview с кнопкой Next

Теперь надо изменить подфункцию btnOpen_Callback обработки события Callback кнопки Open Image и запрограммировать событие Callback кнопки Next. При обработке выбора файлов (или файла) пользователем в диалоговом окне открытия файла следует учесть все возможности: выбрано несколько файлов, выбран только один файл, файлы не выбраны.

Если выбрано несколько графических файлов (т.е. массив FileName является массивом ячеек), то считаем изображения в массив ячеек и сохраним его в поле Pict структуры handles. Число открытых графических файлов (т.е. длину массива FileName) сохраним в поле ImageNum структуры handles. Кроме того, нам понадобится номер текущего изображения, для запоминания которого создадим поле CurImage структуры handles.

После открытия файлов отобразим содержимое первого из них в окне приложения. Если было открыто несколько файлов, то сделаем доступной кнопку Next, а если только один, то сделаем Next недоступной.

При обработке события Callback кнопки Next очистим оси и отобразим на них следующее изображение. Если текущее изображение является последним, то отобразим первое.

Ниже приведен текст подфункций btnOpen_Callback и btnNext_Callback. Подфункция btnClose_Callback остается без изменений.

function btnOpen_Callback(hObject, eventdata, handles)
% Обработка события Callback кнопки Open Image

% Получение имен файлов и пути к ним (или имени одного файла и пути к нему)
[FileName, PathName] = uigetfile('*.bmp;*.jpg', 'MultiSelect', 'on');
% Узнаем, сколько выбрано файлов
if iscell(FileName)
    % FileName - массив ячеек, значит выбрано несколько файлов
    % записываем в поле ImageNum структуры handles число выбранных файлов
    handles.ImageNum = length(FileName);
    % Для каждого файла в цикле формируем полное имя 
    % и считываем его содержимое в k-ую ячейку массива ячеек,
    % который хранится в поле Pict структуры handles
    handles.Pict = [];  % сначала делаем массив пустым
    for k=1:handles.ImageNum
        FullName = [PathName FileName{k}];
        handles.Pict{k} = imread(FullName);
    end
    % Первая картинка является текущей
    handles.CurImage = 1;
    % Отображаем ее на осях
    image('CData', handles.Pict{handles.CurImage})
    % Сохраняем структуру handles для доступа к ней в подфункции btnNext_Callback
    guidata(gcbo, handles)  
    % Делаем доступной кнопку Next
    set(handles.btnNext, 'Enable', 'on')
else
    % Был выбран только один файл или ни одного
    if FileName~=0
        % Выбран один файл, формируем полный путь к нему
        FullName = [PathName FileName];
        % Считываем изображение в переменную Pict (структура handles не нужна)  
        Pict = imread(FullName);
        % Выводим картинку на оси
        image('CData', Pict)   
        % Делаем кнопку Next недоступной
        set(handles.btnNext, 'Enable', 'off')
    end
end

function btnNext_Callback(hObject, eventdata, handles)
% Обработка события Callback кнопки Open Image

% Проверяем, какая картинка является текущей
if handles.CurImage<handles.ImageNum
    % Текущая картинка не последняя, увеличиваем номер текущей картинки на 1
    handles.CurImage = handles.CurImage + 1;
else
    % Текущая картинка последняя, переходим к превой
    handles.CurImage = 1;
end
% Очищаем оси
cla
% Отображаем текущую картинку на осях
image('CData', handles.Pict{handles.CurImage})
% Сохраняем структуру handles
guidata(gcbo, handles)  

Примечание

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

Справка по функциям для создания диалоговых окон.

Создание диалогового окна с сообщением об ошибке - errordlg

Для создания стандартного диалогового окна с сообщением об ошибке служит функция errordlg. Самый распространенный вариант вызова

h = errordlg('Текст сообщения', 'Заголовок окна').

В h записывается указатель на созданное графическое окно с сообщением об ошибке. Например

h = errordlg('Division by zero', 'Calculator');

Приводит к такому окну с указателем h:



Окно остается на экране до тех пор, пока его не закроют кнопкой OK, клавишей , кнопкой с крестиком на заголовке или при помощи контекстного меню заголовка.

Окно с сообщением об ошибке не является модальным (оно позволяет переходить к другим окнам приложений MATLAB). Для того, чтобы сделать его модальным, следует после создания окна функцией errordlg установить свойство WindowStyle графического окна в 'modal': set(h, 'WindowStyle', 'modal')

Другой способ создания модального окна с сообщением об ошибке состоит в использовании функции msgbox, которая описана ниже.

Размер окна подбирается автоматически в зависимости от длины текстовых строк, очень длинные строки переносятся. Для получения многострочного сообщения, разбитого на строки заданным образом, следует указать массив ячеек строк:

h = errordlg({'Wrong data format';'or'; 'unmatched data'}, 'dlgname')

Последовательное создание окон с сообщениями об ошибке с одним и тем же заголовком:

h = errordlg('Division by zero', 'Calculator');
...
h = errordlg('Incorrect operation', 'Calculator');

приводит к созданию разных окон с сообщениями об ошибке. Для активизации окна (расположения поверх остальных окон) и вывода в него нового сообщения, вместо создания нового окна, предусмотрен вызов errordlg с третьим аргументом 'on':

h = errordlg('Division by zero', 'Calculator');
...
h = errordlg(' Incorrect operation ', 'Calculator', 'on'); % активизация старого окна

Разумеется, если старое окно было закрыто, то h = errordlg(..., 'on') просто создает новое.

После вывода диалогового окна с сообщением об ошибке выполнение приложения продолжается. Часто возникает вопрос: как приостановить выполнение до тех пор, пока диалоговое окно не будет закрыто. Это делается при помощи функции waitfor, которая приостанавливает выполнение приложения, пока не будет удален определенный графический объект. Указатель на этот объект (в нашем случае - окно с сообщением об ошибке) указывается в качестве входного аргумента функции waitfor:

h = errordlg('Division by zero', 'Calculator');
set(h, 'WindowStyle', 'modal')
waitfor(h)
a=1;
....

Создание диалогового окна с предупреждением - warndlg

Функция warndlg работает практически так же, как и errordlg (см. выше), но не предусмотрен вариант вызова с третьим входным аргументом 'on'. Например,

h = warndlg('File is out of date', 'Preprocessor')

приводит к такому окну с указателем h



Окно с предупреждение отличается от окна с сообщением об ошибке только пиктограммой:

Повторный вызов warndlg с теми же самыми входными аргументами приводит к созданию нового окна, даже если старое еще не было закрыто.

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

Создание диалогового окна со справочной информацией - helpdlg



Функция helpdlg работает в основном так же, как и warndlg (см. выше). Например,

h = warndlg('File is out of date', 'Preprocessor')

приводит к такому окну с указателем h:



которое отличается от окна с предупреждением только пиктограммой:

Повторный вызов helpdlg с тем же самым заголовком окна приводит к активизации старого окна, если оно не было закрыто. Если оно было закрыто, то создается новое.

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

Создание окна с сообщением - универсальная функция msgbox

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

h = msgbox('Very serious error!', 'Program', 'error') - создает окно с сообщением об ошибке и стандартной пиктограммой (аналогично errordlg).

c = {'Very serious error!'; 'Don''t tell anyone'};
h = msgbox(c, 'Program', 'error') - аналогично предыдущему, но сообщение состоит из двух строк.

h = msgbox('The last warning!', 'Program', 'warn') - создает окно с предупреждением и стандартной пиктограммой (аналогично warndlg).

h = msgbox('Help yourself...', 'Program', 'help') - создает окно со справочной информацией и стандартной пиктограммой (аналогично helpdlg).

h = msgbox('Here is no picture', 'Program', 'none') - создает окно с текстовой информацией без пиктограммы.

h = msgbox('Текст сообщения', 'Заголовок окна', 'custom', рисунок, карта цветов) - создает окно с пиктограммой пользователя, например:

[pic, map] = imread('phone.gif'); % считывание рисунка и карты цветов из файла
h = msgbox('Someone is calling you', 'Phone', 'custom', pic, map)

приводит к такому окну



Последний входной аргумент ('modal', 'non-modal' или 'replace') управляет видом окна и способом вывода нового окна с тем же заголовком. Если способ вывода нового окна не указан, то всегда создается новое окно.

Примеры:

h = msgbox('Very serious error!', 'Program', 'modal') - выводит модальное стандартное окно с сообщением об ошибке

h = msgbox('Someone is calling you', 'Phone', 'custom', pic, map, 'modal') - выводит модальное окно с заданным рисунком для пиктограммы и картой цветов.

h = msgbox('Very serious error!', 'Program', 'error', 'replace') - заменяет предыдущее окно с заголовком Program, если такого нет, то создает новое. При выполнении команд

h = msgbox('Very serious error!', 'Program', 'error')
h = msgbox('Something is strange', 'Program', 'warn', 'replace')

второе окно заменит первое.

Диалоговое окно подтверждения - функция questdlg

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

Примеры:

button = questdlg('Are you sure?') - создание стандартного окна подтверждения с кнопками Yes, No, Cancel. Кнопка Yes в фокусе (по умолчанию).

button = questdlg('Are you sure?', 'Program') - создание стандартного окна подтверждения с заголовком и с кнопками Yes, No, Cancel.

button = questdlg('Are you sure?', 'Program', 'No') - создание стандартного окна подтверждения с заголовком и с кнопками Yes, No, Cancel. В фокусе кнопка No.

button = questdlg('Are you sure?', 'Program', 'Yes', 'Maybe', 'Maybe') - создание стандартного окна подтверждения с заголовком и с двумя кнопками Yes и Maybe. В фокусе кнопка Maybe.

button = questdlg('Are you sure?', 'Program', 'Yes', 'No', 'I don''t know', 'No') - создание стандартного окна подтверждения с заголовком и с тремя кнопками Yes, No и I don't know. В фокусе кнопка No.

Диалоговое окно для ввода информации (функция inputdlg)

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

Примеры:

M = inputdlg({'TIME' 'VALUES'}) - создает диалоговое окно



Если, к примеру, в строке TIME пользователь ввел 0.1 0.3 0.55 4.5, а в строке VALUES - 2.3 9.55 2.1 0.7 и нажал OK, то массив ячеек M будет иметь следующие значения.

M =
'0.1 0.3 0.55 4.5'
'-2.3 9.55 2.1 0.7'

Для преобразования их в числовые векторы можно воспользоваться str2num:

time = str2num(M{1})
val = str2num(M{2})

M=inputdlg({'TIME' 'VALUES'}, 'Input Data')
- создает диалоговое окно с заголовком Input Data.

Для того, чтобы можно было вводить многострочный текст, следует указать третий входной аргумент - число строк в каждой области ввода:

M = inputdlg({'matrix A' 'Matrix B'}, 'Input Data', 3) - если третий аргумент является числом большим единицы, то все области ввода имеют одинаковую высоту и снабжены полосами прокрутки.



Если ввод завершен нажатием на кнопку OK, то каждая ячейка массива M содержит массив символов. В массиве символов столько строк, сколько было введено в соответствующую область ввода.

M = inputdlg({'vector A' 'Matrix B'}, 'Input Data', [1; 4]) - для задания высоты областей ввода по отдельности следует указывать число строк каждой области ввода в вектор-столбце в качестве третьего входного аргумента:



M = inputdlg({'vector A' 'Matrix B'}, 'Input Data',[1 100;4 100]) - для задания длины областей ввода в символах (в данном случае, 100 символов) третьим входным аргументом должна быть матрица:



M = inputdlg({'Name' 'Year'}, 'Info', [2; 1], {char('John','Smith') '1990'}) - для получения окна с заполненными полями (для подсказки формата ввода пользователю) указывается четвертый входной аргумент. Он должен быть массивом ячеек того же размера, что и первый входной аргумент:



M = inputdlg({'Name' 'Year'}, 'Info', [2; 1], {char('John','Smith') '1990'}, 'on') - последний пятый входной аргумент 'on' означает, что пользователь может изменять размеры диалогового окна.

Диалоговое окно для выбора из списка - функция listdlg

Функция listdlg создает диалоговое окно со списком из заданных строк и кнопками для выбора и отмены. Строки списка задаются массивом ячеек. Поддерживается выбор нескольких элементов списка. В выходных аргументах возвращаются: Selection - номер или вектор с номерами выбранных строк и ok - информация о том, был ли выбор завершен нажатием кнопки OK (ok = 1), или окно было закрыто другим способом (ok = 0). Если ok = 0, то Selection - пустой массив. По умолчанию допускается выбор нескольких элементов списка (щелчком мыши с удержанием Ctrl) и присутствует кнопка Select All для выбора всех элементов.

[Selection,ok] = listdlg('ListString', {'Linear'; 'Quadratic'; 'Cubic'}) - создает диалоговое окно выбора со списком из трех строк: Linear, Quadratic, Cubic. Если пользователь выбрал, к примеру Quadratic и нажал кнопку OK, то Selection = 2 и ok = 1. Если пользователь выбрал Linear и Cubic и нажал кнопку OK, то Selection = [1 3] и ok = 1 и т. д.

Функция listdlg допускает обращение к ней в общей форме:

[Selection, ok] = listdlg('ListString', массив ячеек строк, парам1, знач1, парам2, знач2, ...)

Параметры и их возможные значения такие:
  • 'SelectionMode' - режим выбора строк в списке, значения: 'single' (для выбора только одной строки) или 'multiple' (по умолчанию, для выбора нескольких строк);
  • 'ListSize' - размер области списка в пикселях, значение задается вектором [ширина высота] (по умолчанию [160 300]);
  • 'InitialValue' - начальное выделение строк, значением является вектор с номерами строк, которые будут выделены при отображении окна со списком (по умолчанию 1);
  • 'Name' - заголовок окна, значение задается строкой (по умолчанию пустая строка);
  • 'PromptString' - текст над списком, значения: строка или массив строк или ячеек из строк (для многострочного текста). По умолчанию пустой массив ячеек.
  • 'OKString' - надпись на кнопке для выбора и закрытия окна, значением является строка (по умолчанию 'OK');
  • 'CancelString' - надпись на кнопке для закрытия окна без выбора, значением является строка (по умолчанию 'Cancel');
  • 'uh' - высота кнопок окна, значение задается в пикселях (18 по умолчанию);
  • 'fus' - расстояние между кнопками и списком, значение задается в пикселях (18 по умолчанию);
  • 'ffs' - расстояние от границы окна до списка, значение задается в пикселях (8 по умолчанию).
Например, команда

[Selection,ok] = listdlg('ListString', {'Linear'; 'Quadratic'; 'Cubic'},...
'Name', 'Approximation', 'ListSize', [100 50], 'PromptString', 'Select method', 'fus', 5)

приводит к созданию следующего диалогового окна со списком:



Диалоговое окно для установки параметров листа и способа печати содержимого графического окна - функция pagesetupdlg

pagesetupdlg - вызов диалогового окна Page Setup для текущего графического окна (если нет ни одного окна, то создается новое).

pagesetupdlg(hF) - вызов диалогового окна Page Setup для графического окна с указателем hF.

Настройки, сделанные в диалоговом окне Page Setup, влияют на соответствующие свойства графического окна: PaperSize, PaperType, PaperPozition и т. д.

Функция pagesetupdlg позволяет настроить параметры только одного графического окна, т.е. hF не может быть вектором указателей. Для одновременной настройки основных параметров нескольких графических окон следует использовать функцию pagedlg, входным аргументом которой может быть вектор указателей на графические окна.

Окно Page Setup является модальным, выполнение приложения приостанавливается до тех пор, пока окно не будет закрыто.

Диалоговое окно для выбора опций печати и настройки принтера - функция printdlg

printdlg - вызов стандартного диалогового окна Windows для печати текущего графического окна (если нет ни одного окна, то создается новое).

printdlg(hF) - вызов стандартного диалогового окна Windows для печати графического окна с указателем hF.

printdlg('-crossplatform', hF) - вызов диалогового окна Print MATLAB для печати графического окна с указателем hF.

Диалоговое окно печати является модальным, выполнение приложения приостанавливается до тех пор, пока окно не будет закрыто.

Диалоговое окно открытия файла - функция uigetfile

[FName, PName] = uigetfile - выводит диалоговое окно открытия файла с содержимым текущего каталога. Фильтр файлов установлен в ALL MATLAB files, что приводит к отображению только тех файлов, расширения которых поддерживаются MATLAB. В раскрывающемся списке Files of type можно выбрать только M-файлы, или только графические окна и т. д., или все файлы.

Если пользователь выбрал файл (щелчком мыши по значку с файлом и нажал кнопку Open, либо двойным щелчком мыши по значку с файлом, либо набрал имя файла в строке File Name и нажал кнопку Open), то FName содержит строку с именем файла и расширением, а PName - путь к файлу. Если пользователь не выбрал файл и закрыл окно, то FName = 0 и PName = 0. После обращения к функции uigetfile следует проверить, был ли выбран файл. Если да, то для получения полного имени файла следует сцепить эти строки:

[FName, PName] = uigetfile;
if ~ isequal(FName, 0)
FullName = strcat(PName, FName);
% дальше считываем данные из файла
end

Фильтр файлов указывается в первом входном аргументе функции uigetfile, например

[FName, PName] = uigetfile('*.txt');

создает диалоговое окно открытия файлов, список Files of Type которого содержит две строки: "*.txt" и "All Files (*.*)". Можно указывать больше одного расширения, но тогда надо использовать массив ячеек из строк:

[FName, PName] = uigetfile({'*.txt'; '*.dat'});

Для размещения описания типов файлов в списке Files of Type следует указывать массив ячеек из двух столбцов. В каждой его строке задается расширение файла и его описание (при этом строка "All Files (*.*)" не добавляется в список Files of Type диалогового окна открытия файла):

Filter={'*.txt', 'Text files (*.txt)'; '*.dat', 'Data files (*.dat)'; '*.res', 'Results (*.res)'};
[FName, PName] = uigetfile(Filter);

В качестве фильтра может быть и строка с именем файла, тогда оно находится в строке File name при появлении диалогового окна открытия файла, а его расширение принимается за расширение по умолчанию и появляется в списке Files of Type вместе с "All Files (*.*)".

Если необходимо узнать, какой по счету тип файлов пользователь выбрал в списке Files of Type, то следует обратиться к uigetfile с тремя выходными аргументами:

[FName, PName, FilterIndex] = uigetfile(Filter);

В FilterIndex записывается номер типа файлов.

Для задания собственного заголовка окна открытия файла (вместо Select File to Open) функция uigetfile вызывается со вторым входным аргументом:

[FName, PName] = uigetfile(Filter, 'Open File');

А для помещения заданного имени файла в строку File Name при создании окна открытия файлов, необходимо указать его в третьем входном аргументе (имя файла может быть полным):

[FName, PName] = uigetfile(Filter, 'Open File', 'input.txt')

Так можно отобразить содержимое любой папки, например корневого каталога диска D:

[FName, PName] = uigetfile(Filter, 'Open File', 'd:\')

Примечание
Если мы хотим открывать файлы MATLAB так, как предлагает uigetfile по умолчанию, но задать собственный заголовок окна (и папку или файл, предлагаемые по умолчанию в диалоговом окне открытия файлов), то первый входной аргумент - фильтр - пропускать нельзя. Он должен быть пустой строкой:

[FName, PName] = uigetfile('', 'Open File', 'd:\');

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

[FName, PName] = uigetfile('MultiSelect', 'on'); или
[FName, PName] = uigetfile('*.dat', 'MultiSelect', 'on') ; или
[FName, PName, FilterIndex] = uigetfile('*.dat', 'Open File', 'd:\', 'MultiSelect', 'on')

Если пользователь выбрал несколько файлов в диалоговом окне, то выходной аргумент FName является массивом ячеек из имен выбранных файлов (PName, разумеется, остается строкой, так как файлы выбирались в одной папке). Для получения массива ячеек с полными именами файлов подойдет следующий код (функция strcat умеет сцеплять строку с массивом ячеек из строк):

[FName, PName] = uigetfile('MultiSelect', 'on');
if ~isequal(FName, 0)
FullName = strcat(PName, FName);
end

Функции MATLAB для открытия файлов разных форматов

Поскольку речь идет об открытии файлов, то уместно привести основные функции MATLAB, предназначенные для работы с файлами разных форматов.

load - чтение данных из двоичного или текстового файла.

open - открытие файла. Способ открытия зависит от расширения:
  • расширение m - файл открывается в редакторе M-файлов;
  • расширение mdl - модель открывается в Simulink;
  • расширение mat - запись двоичных данных из файла в поля структуры, имена полей структуры совпадают с именами переменных, записанных в файле;
  • расширение fig - открывается графическое окно;
  • расширение p - если существует m-файл с тем же самым именем, то он открывается в редакторе M-файлов;
  • расширения htm, html - файл открывается в окне браузера справочной системы MATLAB;
  • расширение pdf - файл открывается в Adobe Acrobat (требуется установка открытия по ассоциации в Windows);
Для открытия файла с нестандартным расширением можно написать свою функцию, которая будет вызываться по умолчанию. Ее имя образуется из слова open и расширения, например для открытия файлов с расширением dtm следует написать функцию opendtm. Пример. Пусть надо открывать двоичные файлы с расширением dtm, содержащие значения двух переменных, имена которых могут быть разными. Значения этих переменных должны быть записаны в переменные time и data рабочей среды. Тогда пишем файл-функцию opendtm:

function opendtm(fname)
% считываем данные в структуру
S = load('-mat', fname);
% узнаем названия полей структуры (имена переменных)
F = fieldnames(S);
% Присваиваем значения переменным time и data рабочей среды
assignin('base', 'time', S.(F{1}))
assignin('base', 'data', S.(F{2}))

Вот как можно использовать функцию opendtm:

A = 1:10;
B = sqrt(A);
save('my.dtm', 'A', 'B') % запись A и B в файл в двоичном виде
open('my.dtm') % open вызывает opendtm и в рабочей среде создаются time и data

Примечание. Функция uiopen сочетает возможности uigetfile и open - она создает диалоговое окно открытия файла, а затем вызывает open для его открытия.

winopen - открытие файла в Windows тем приложением, которое ассоциировано с данным расширением, например:
winopen('art.doc') - открытие art.doc в MS Word;
winopen('my.txt') - открытие my.txt в блокноте;
winopen('all.htm') - открытие all.htm в браузере интернет-страниц.

notebook - открытие или создание M-книги в MS Word.

publish - выполнение M-файла, разбитого на ячейки, и сохранение результата в указанном формате: html, doc, ppt, xml, rpt, latex.

dos и system - выполнение команд (см. также !), запуск исполняемых файлов, например:

system('calc') - запуск калькулятора.

uiimport - открывает окно Import Wizard для импортирования данных из различных форматов.

importdata - импорт данных в зависимости от расширения файла, полезна также для чтения данных из текстового файла с разделителями.

csvread - чтение числовых данных из текстового файла с разделителем-запятой.

dlmread - чтение числовых данных из текстового файла с заданным разделителем.

textread, textscan - чтение данных из текстового файла, имеющего определенный формат.

xlsread - чтение данных из фалов MS Excel.

wavread - чтение звукового wav-файла.

aviread - чтение avi-файла.

imread - чтение графических файлов.

Кроме перечисленных функций имеются низкоуровневые функции для работы с файлами. Их имена начинаются с буквы f:

fclose - закрытие файла.

feof - проверка на достижение конца файла.

ferror - получение информации о последней ошибке при вводе-выводе.

fgetl - чтение строки из текстового файла без символа конца строки.

fgets - чтение строки из текстового файла с символом конца строки.

fopen - открытие файла.

fprintf - форматная запись в файл.

fread - чтение из двоичного файла.

frewind - переход к началу файла.

fscanf - форматное чтение из файла.

fseek - переход к заданной позиции в файле.

ftell - получение текущей позиции в файле.

fwrite - запись в двоичный файл.

Все функции для чтения данных приведены в разделе справочной системы: MATLAB: Functions -- Categorical List: File I/O.

Диалоговое окно сохранения файла - функция uiputfile

Использование uiputfile схоже с uigetfile, рассмотренной выше. Точно так же задаются фильтр расширений, заголовок окна, файл или путь по умолчанию. Отличие состоит в том, что в uiputfile нет опции 'MultiSelect' (она и не нужна при сохранении). Кроме того, если в диалоговом окне сохранения файла пользователь выберет имя существующего файла, то появится окно подтверждения. Выбор Yes приводит к завершению диалога сохранения файла, а No - к возврату в окно сохранения файла. Проверка действий пользователя и получение полного имени файла выполняется точно так же, как и в случае uigetfile.

Функции MATLAB для сохранения данных в файлах

Перечислим основные функции MATLAB, предназначенные для сохранения данных различных типов.

save - сохранение данных в текстовом и двоичном файлах

Примечание.
Функция uisave сочетает возможности uigetfile и save - она создает диалоговое окно сохранения файла, в котором будут сохранены все переменные рабочей среды..

csvwrite - запись числовых данных в текстовый файл через запятую.

dlmwrite - запись числовых данных в текстовый файл через заданный разделитель.

xlswrite - запись данных в формате MS Excel.

wavwrite - запись wav-файла.

avifile - создает avi-файл и возвращает идентификатор на него, который используется в других функциях: addframe, close.

movie2avi - создание avi-файла из матрицы, в каждом столбце которой хранится информация об одном фрейме (см. функции: movie, getframe, im2frame).

imwrite - запись графического файла.

Кроме перечисленных функций имеются низкоуровневые функции для работы с файлами, имена которых начинаются с буквы f (см. выше раздел "Функции MATLAB для открытия файлов разных форматов").

Диалоговое окно выбора каталога - функция uigetdir

Функция uigetdir открывает диалоговое окно выбора каталога Browse for folder и возвращает путь к выбранному каталогу, либо ноль, если пользователь не сделал выбор. Проверка, был ли выбран каталог, делается точно так же, как и в функции uigetfile для диалога открытия файла. Способы вызова uigetdir:

dname = uigetdir - открывает диалоговое окно выбора каталога, в котором выделен текущий каталог MATLAB.

dname = uigetdir('startpath') - открывает диалоговое окно выбора каталога, в котором выделен заданный каталог, например: dname = uigetdir('c:\').

dname = uigetdir('startpath', 'text') - открывает диалоговое окно выбора каталога, в котором выделен заданный каталог и помещает заданный текст над окном с иерархической структурой каталогов. Если нужно открыть диалоговое окно выбора каталога, в котором выделен текущий каталог MATLAB, то вместо первого входного аргумента следует указать пустую строку: dname = uigetdir('', 'text').

Функции MATLAB для работы с каталогами

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

cd - смена текущего каталога MATLAB

dir - отображение содержимого каталога в командном окне или запись информации о содержимом в массив структур.

path, rmpath - управление путями поиска MATLAB.

Примечания.
Функция pathtool отображает специальное диалоговое окно Set Path для управления путями поиска MATLAB.
Функция filebrowser отображает специальное диалоговое окно Current Directory с содержимым текущего каталога, возможностью выбора нового текущего каталога и открытия файлов в MATLAB.

Все функции для работы с каталогами в MATLAB приведены в справочной системе в разделе MATLAB: Functions -- Categorical List: Desktop Tools and Development Environment: Workspace, Search Path, and File Operations.

Диалоговое окно выбора шрифта - функция uisetfont

Функция uisetfont может использоваться в двух целях:
1) создание диалогового окна выбора шрифта и запись информации о выбранном шрифте (название, размер, начертание) в структуру;
2) создание диалогового окна выбора шрифта и изменение текстовых объектов, подписей осей или элементов управления в соответствии со сделанными в этом окне установками.

S = uisetfont - приводит к появлению диалогового окна выбора шрифта и, если выбор в нем был сделан, то возвращается структура S, поля которой имеют следующий смысл:

S.FontName - строка с названием шрифта;
S.FontUnits - единицы измерения ('points');
S.FontSize - размер;
S.FontWeight - жирность ('normal' или 'bold');
S.FontAngle - начертание ('normal' или 'italic').

Если пользователь не выбрал шрифт и закрыл окно, то S равно нулю.

S = uisetfont(S0) - приводит к появлению диалогового окна выбора шрифта, в котором по умолчанию выбран шрифт в соответствии со значениями полей структуры S0, например:

S0.FontName = 'Arial';
S0.FontUnits = 'points';
S0.FontSize = 20;
S0.FontWeight = 'bold';
S0.FontAngle = 'normal';
S = uisetfont(S0)

S = uisetfont('Заголовок окна') или S = uisetfont(S0, 'Заголовок окна') - то же самое, что и предыдущие варианты, только окно выбора шрифта имеет заданный заголовок.

uisetfont(h) - вызов диалогового окна выбора шрифта для текстового объекта, осей или элемента управления с указателем h.

uisetfont(h, 'Заголовок окна') - то же самое, что и uisetfont(h), только окно выбора шрифта имеет заданный заголовок.

S = uisetfont(h), S = uisetfont(h, 'Заголовок окна') - то же самое, что и два предыдущих варианта, только информация о выборе пользователя дополнительно возвращается в структуре S.

Пример изменения шрифта графических объектов

hA = axes; % создание осей
plot(rand(10)) % построение графика
hT = title('Random Graph') % добавление заголовка
% открытие диалогового окна для выбора шрифта разметки осей
uisetfont(hA, 'Set font for axes');
% открытие диалогового окна для выбора шрифта заголовка
uisetfont(hT, 'Set font for title'); Диалоговое окно выбора цвета - функция uisetcolor

Функция uisetcolor так же, как и uisetfont может использоваться в двух целях:
1) создание диалогового окна выбора цвета и запись выбранного цвета в вектор в формате RGB;
2) создание диалогового окна выбора цвета и изменение графических объектов, у которых есть свойство Color, в соответствии со сделанными в этом окне установками.

С = uisetcolor - создание диалогового окна выбора цвета (в нем по умолчанию текущим является белый цвет) и запись выбранного цвета в вектор С в формате RGB. Если пользователь не сделал выбор, то C равно нулю.

С = uisetcolor(С0) - то же самое, что и предыдущий вариант, только в диалоговом окне выбора цвета текущим является цвет, заданный вектором C0 в RGB. Если пользователь не сделал выбор, то C совпадает с C0.

С = uisetcolor('Заголовок окна'), С = uisetcolor(С0, 'Заголовок окна') - то же самое, что и предыдущий вариант, только диалоговое окно выбора цвета имеет заданный заголовок.

uisetcolor(h) - открытие диалогового окна выбора цвета для задания цвета графического объекта с указателем h (графический объект должен иметь свойство Color).

uisetcolor(h, 'Заголовок окна') - аналогично предыдущему, но диалоговое окно имеет заданный заголовок.

C = uisetcolor(h) или C = uisetcolor(h, 'Заголовок окна') - то же самое, что и два последних способа. Кроме изменения цвета объекта, выбранный цвет записывается в вектор C в формате RGB.

Пример изменения цвета графических объектов.

hA = axes; % создание осей
% построение графика
x = 0:0.1:10;
y = sin(x);
hL = plot(x,y)
hT = title('Random Graph') % добавление заголовка
% открытие диалогового окна для выбора цвета линии
uisetcolor(hL, 'Select line color')
% открытие диалогового окна для выбора цвета заголовка
uisetcolor(hT, 'Select title color')
% открытие диалогового окна для выбора цвета осей
uisetcolor(hA, 'Select axes color')

Окно с полосой прогресса - функция waitbar

Функция waitbar создает окно с полосой прогресса и позволяет обновлять ее.

h = waitbar(x, 'текст') - отображает окно с полосой прогресса и заданным текстом над полосой. Длина полосы прогресса пропорциональна значению x, которое должно быть от 0 до 1. Выходной аргумент h - указатель на графическое окно с полосой прогресса.

waitbar(x, h) - увеличивает длину полосы прогресса с указателем h в соответствии со значением x.

Пример

% создание окна с пустой полосой прогресса
h = waitbar(0, 'Solving eigenvalue problems...');
for i=1:100
A = rand(30);
L = eig(A);
waitbar(i/100) % обновление полосы прогресса
end
% удаление графического окна с полосой прогресса
close(h)

Цвет полосы можно менять, если учесть, что полоса - полигональный объект, потомок осей, которые в свою очередь являются потомком графического окна, создаваемого функцией waitbar. Пример:

% создание окна с пустой полосой прогресса
h = waitbar(0, 'Solving eigenvalue problems...');
% поиск указателя на полигональный объект
hP = findobj(h, 'Type', 'patch');
% задание цвета внутренности и границы полигонального объекта
set(hP, 'FaceColor', 'g', 'EdgeColor', 'g')
for i=1:1000
waitbar(i/1000, h)
end
close(h)

Свойства самого окна так же можно поменять, воспользовавшись как указателем на него, так и тем, что функция waitbar позволяет задавать свойства окна во входных аргументах, например:

h = waitbar(0, 'Simply white', 'Color', 'w', 'Name', 'program');

Создание диалогового окна с кнопками - функция menu

Функция menu создает окно с текстом и расположенными в столбик кнопками с заданными надписями. После нажатия пользователем на кнопку, ее номер возвращается в выходном аргументе функции menu.

button = menu('Select method', 'Newton', 'Gauss', 'Zeidel')

Если пользователь не сделал выбор, то button = 0.


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

Система Orphus

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