# Лекция 3. Разработка интерфесных программ

### Белошапкин В.В.

Copyright © Красноярский государственный университет 2003

### Содержание

###

###

###

    Функция uicontrol для разработки интерфейсных программ
    Как из функции на языке matlab приготовить код на языке Си и из него
    приготовить exe-файл

     Задачи

     Функция uicontrol для разработки интерфейсных программ

         Функция uicontrol является основной функцией для разработки интерфейсных программ.
    Она размещает в памяти и высвечивает на указанном графическом окне интерфейсные элементы.
    Следующие две строки открывают графическое окно и размещают на нем интерфейсный элемент.
    h1=figure;
    hu=uicontrol(h1);
    Тип интерфейсного элемента, его размеры, расположение в графическом окне, цвет и т.д.
    определяются значениями полей интерфейсного объекта. Посмотреть все возможные поля объекта
    и их значения по умолчанию можно командой set(hu). В следующей таблице приводятся некоторые
    поля интерфейсных объектов и их возможные значения. Значения по умолчанию выделеня в
    фигурные скобки.

        Поле
        Назначение

        BackgroundColor
        Определяет цвет объекта.

        FontUnits
        Единицы измерения размера шрифта. Возможные значения[ inches | centimeters | normalized | {points} | pixels ]

        FontName
        Имя шрифта.

        FontSize
        Размер шрифта.

        Units
        Единицы измерения для положения элемента в графическом окнеи его размеров. Начало системы координат всегда в левом нижнемуглу. Возможные значения [ inches | centimeters | normalized | points | {pixels} | characters ].  Обычно для поля Units используют значение normalized. При таком выборе в левом нижнем углу графического окна всегда расположена точка (0,0), а в правом  верхнем (1,1). Это позволяет создавать интерфейсы, независящие от разрешения монитора и фактического размера графического окна на дисплее.

        Position
        Определяет положение левого нижнего угла элемента и его ширину и высоту. Задается вектором из четырех элементов. Например, строка set(hu,'position',[0.1 0.1 0.4 0.5]); задает левый нижний угол в точке (0.1,0.1) , ширину 0.4 и высоту 0.5.

        Style
        Определяет тип интерфейсного элемента. Возможные значения [ {pushbutton} | togglebutton | radiobutton | checkbox | edit | text | slider | frame | listbox | popupmenu ].

        String
        Задает надпись на интерфейсном элементе.

        UiContextmenu
        Ссылка на всплывающее меню, связанное с обектом.

        Callback
         Определяет имя функции, которая вызывается , когда с объектом происходит событие ( например, щелчок мыши на объекте).

    Например, чтобы создать интерфейсный объект типа togglebutton (кнопка с двумя положениями
    - утопленная и отжатая)  и написать функцию для обработки нажатий нужно написать в матлабе
    global ht
    ht=uicontrol(h1,'style','togglebutton','callback','togl');.
    Для обработки нажатий на кнопку нужно написать функцию togl, которая может выглядеть примерно
    так
    function togl()
    global ht
    val=get(ht,'value');
    if val==0 % кнопка отжата
    .
    .
    .
    else    %кнопка утоплена
    .
    .
    .
    end
    Когда происходит нажатие на кнопку togl, вызывается функция togl. Эта функция получает
    указатель на объект ht через оператор global. Функция get считывает значение поля 'value'
    объекта ht. Это поле определяет состояние объекта togglebutton, 0 - кнопка отжата,
    1 - кнопка утоплена.

    Следующий пример размещает интерфейсный объект типа 'popup' и иписывает функцию mycall
    для обработки событий.
    global hpop
    hpop=uicontrol('style','popup','units','normalized','position',[0.1 0.1 0.4 0.05],...
    'string','hsv|hot|cool|jet','callback',mycall');
    Функция mycall выглядит примерно так:
    function mycall()
    global hpop
    val=get(hpop,'value');
    switch val      % выбираем высвеченную строку
    case 1          % высвечена первая строка
    .
    .
    .
    case 2          % высвечена вторая строка
    .
    .
    .
    otherwise
    .
    .
    .
    end

    Вид элемента popup показан на рис. 3.1.

    Рис. 3.1

    В качестве полного примера приведу программу для отрисовки графика заданной функции.
    Все необходимые интерфейсные элементы отрисовываются функцией graphic.m.

    function graphic()
    %#function myplot
    global x0 dx xend fun
    h1=figure;
    a1=axes('units','normalized','position',[0.1 0.1 0.8 0.5]);
    set(h1,'currentaxes',a1,'numbertitle','off','name','grafik f(t)');
    xlabel('t');
    ylabel('f');
    pos=[0.1 0.7 0.1 0.05];
    x0=uicontrol('style','edit','units','normalized','position',pos,'string','0');
    pos1=[0.1 0.77 0.1 0.05];
    dx=uicontrol('style','edit','units','normalized','position',pos1,'string','0.1');
    pos2=[0.1 0.84 0.1 0.05];
    xend=uicontrol('style','edit','units','normalized','position',pos2,'string','1');
    pos3=[0.01 0.7 0.07 0.05];
    uicontrol('style','text','units','normalized','position',pos3,'string','t0');
    pos4=[0.01 0.77 0.07 0.05];
    uicontrol('style','text','units','normalized','position',pos4,'string','dt');
    pos5=[0.01 0.84 0.07 0.05];
    uicontrol('style','text','units','normalized','position',pos5,'string','tend');
    pos6=[0.01 0.91 0.07 0.05];
    uicontrol('style','pushbutton','units','normalized','position',pos6,...
    'string','plot','backgroundcolor',[1 0 0],'callback','myplot');
    pos7=[0.3 0.91 0.5 0.05];
    fun=uicontrol('style','edit','units','normalized','position',pos7,'string',...
    'cos(2*pi*t).*exp(-t.^2)');
    pos8=[0.2 0.91 0.08 0.05];
    uicontrol('style','text','units','normalized','position',pos8,'string','f(t)=');

    Вот как выглядит результат работы этой функции на экране.

    При нажатии кнопки plot вызывается функция myplot из файла myplot.m,
    которая и отрисовывает график.

    function myplot()
    global x0 dx xend fun
    s1=get(x0,'string');
    s2=get(dx,'string');
    s3=get(xend,'string');
    s4=get(fun,'string');
    sx=strcat('[',s1,':',s2,':',s3,']');
    t=eval(sx); % выполняем строку sx, как команду матлаба и результат заносим в t.
    %next string for compilation to the standalone application only
    %you can to comment these string for work in matlab only
    str=strrep(s4,'t',sx); % замена в строке s4 символа t на строку sx
    f=eval(str); % строка str выполняется как команда матлаба, а результат заносится в f
    plot(t,f);

    Читателю предоставляется самостоятельно разобрать текст фугнкции myplot. Замечу лишь,
    что замена символа t в строке s4 на строку sx связана с тем, что в дальнейшем
    функция myplot будет компилироваться в Cи код. В матлаб запрещено компилировать в Си
    функции содержащие вызов функции eval со строкой, содержащей имена переменных из рабочего
    пространства матлаба.

     Как из функции на языке matlab приготовить код на языке Си и из него
    приготовить exe-файл

         Как производится компиляция программ, написанных на языке matlab, в код
    на языке Си и затем готовится независимое exe-приложение я покажу на примере
    функции graphic.m. Прежде всего необходимо заметить, что  компилируются только функции
    матлаба.  Компиляция осуществляется с помощью компилятора mcc.
    Перед компиляцией необходимо настроить компилятор с помощью команды mbuild -setup,
    которую можно вводить либо из командного окна matlab , либо из командной строки Windows.
    Вот как выглядит диалог в командном окне.

    После настройки компилятора можно приступать к компиляции с помощью команды.

    mcc -m -B sgl graphic.m

    После компиляции в вашем рабочем каталоге образуются файлы graphic.c и graphic.exe.
    Файл graphic.exe является независимым exe-файлом, который может выполняться независимо
    от матлаба. Однако, если в вашей системе не установлен matlab, то для выполнения exe-файлов
    необходимо инсталлировать dll библиотеки матдаба. Они хранятся в специальном
    самораспаковывающемся архиве mglinstaller.exe, который обычно хранится в
    %MATLAB%\extern\lib\win32.
         Обратите внимание на вторую строку файла graphic.m.
    %#function myplot
     Все callback функции должны быть обявлены подобным образом, если функция будет компилироваться
    в Си.

       Задачи

    1. Написать интерфейсную программу для вычисления определенных интегралов. Подинтегральная
    функция и пределы интегрирования должны вводиться с интерфейса.
    2. Используя интерфейсный элемент popup разработать интерфейс "научный калькулятор".
    Включить интерфейсы для отрисовки отрисовки графиков, вычисления определенных интегралов,
    вычисления неопределенных интегралов, дифференцирования заданной функции, разложения
    функции в ряд Тэйлора в окрестности заданной точки.