Почему поведение ResizeFcn изменилось?

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

ResizeFcn возвращает ошибку после запусков программы

Начиная в R2014b, ResizeFcn коллбэк может выполниться, прежде чем все переменные в программном файле присвоены. Когда это происходит, ResizeFcn коллбэк возвращает ошибку.

Например, эта программа имеет ResizeFcn коллбэк, который использует переменную, возвращенную createGUI функция.

function mygui
 
    hs = createGUI;
 
    function handles = createGUI
        % Create figure and its children
        f = figure('Tag','fig',...
                   'ResizeFcn',@doResizeFcn,...
                   'Visible','off');
        u = uicontrol('Parent',f,'Tag','ctrl');
        handles = guihandles(f);
        
        % make figure visible
        set(f,'Visible','on');
    end
 
    function doResizeFcn(varargin)
        length(hs)
    end
end
Выполнение этой программы в новой графической системе приводит к ошибке потому что hs не существует когда doResizeFcn коллбэк выполняется впервые (когда фигура становится видимой).
mygui
Undefined function or variable "hs".
Error in mygui/doResizeFcn (line 18)
        length(hs)

Error using mygui/createGUI (line 14)
Error while evaluating Figure SizeChangedFcn

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

function mygui
 
    hs = createGUI;
    % Make the figure visible
    set(hs.fig, 'Visible','on');
 
     function handles = createGUI
        % Create figure and its children
        f = figure('Tag','fig',...
                   'ResizeFcn',@doResizeFcn,...
                   'Visible','off');
        u = uicontrol('Parent',f,'Tag','ctrl');
        handles = guihandles(f);
 
    end
 
    function doResizeFcn(varargin)
        length(hs)
    end
end

ResizeFcn, неактивный для невидимых компонентов

Начиная в R2014b, изменяя размер невидимого контейнера, такого как фигура, панель, группа кнопок, не инициировала ResizeFcn коллбэк до контейнера становится видимым.

В предыдущих релизах MATLAB®, ResizeFcn коллбэк выполняется, когда размер контейнерных изменений, независимо от того, отображается ли это.

Можно управлять видимостью фигур и контейнеров с помощью Visible свойство:

  • Фигура отображается если его Visible свойство установлено в 'on'.

  • uipanel или uibuttongroup отображаются если его Visible свойство и тот из его предков, установлены в 'on'. Например, uibuttongroup, родительский элемент которого является uipanel, отображается когда 'Visible' свойство uibuttongroup, uipanel, и фигура все установлены в 'on'.

Неожиданное поведение, когда внешние границы или изменения области векторной и растровой графики

Запуск в R2014b, изменение внешних границ фигуры или контейнера не инициировали ResizeFcn 'callback'.

Например, этот рисунок ResizeFcn коллбэк не выполняется в новой графической системе, когда вы изменяете OuterPosition (путем удаления панели меню) на второй линии этого кода. Однако коллбэк действительно выполняется в предыдущих релизах MATLAB.

f = figure('ResizeFcn','display resized');
set(f,'Menubar','none');

Начиная в R2014b, ResizeFcn коллбэк выполняется только, когда область векторной и растровой графики контейнера (внутренняя область) изменяется. Предыдущие релизы MATLAB не могут выполнить ResizeFcn коллбэк, когда область векторной и растровой графики изменяется.

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

p = uipanel('ResizeFcn','display resized');
set(p,'BorderWidth',3);

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте