MATLAB: автоматическое изменение размера компонентов/шрифтов GUI

У меня возникают проблемы с попыткой сделать мои графические интерфейсы MATLAB автоматически resizeable. После исчерпывающего поиска в Интернете помощи и большого количества тестов я не смог найти решение.

Я развиваю простой графический интерфейс (с MATLAB, без использования GUIDE) на своем ноутбуке (Размер/разрешение экрана = 1366x768). Очень упрощенная версия выглядит так:

GUI displayed in the laptop

Когда я запускаю тот же графический интерфейс на своем настольном компьютере (Размер/разрешение экрана = 1920x1080), он отображается следующим образом:

GUI displayed in the desktop

Размеры GUI автоматически инициализируются с учетом экранов (код указан в нижней части этого сообщения). Как вы можете видеть (выделены красными стрелками), шрифты/интервалы между компонентами не изменяются автоматически, так что графический интерфейс имеет тот же аспект независимо от того, где мы запускаем файл.

Кроме того, когда GUI изменяется вручную, происходит некоторое перекрытие компонентов:

GUI displayed in the desktop - After manual resizing


Код, используемый для этого минимального рабочего примера, следующий:

function resizingGUIexample()

%% SET UP GUI
hdl.mainfig = figure(); 

% MANAGE FIGURE DIMENSIONS -------------------------------------------------------------------------------------
set(hdl.mainfig, 'Units', 'pixels');
dims              = get(0, 'ScreenSize');
screenHeight      = dims(4);
verticalMargins   = floor((0.2*screenHeight)/2);          % =10% of the screen height in each side
figureHeight      =       (0.8*screenHeight);
figureWidth       =       (0.8*screenHeight)*(4/3);       % 4/3 Aspect Ratio
set(hdl.mainfig, 'Position', [0, verticalMargins, ... 
                figureWidth, figureHeight]);

movegui(hdl.mainfig,'center')     % move GUI to center

color = get(hdl.mainfig,'Color'); % get background color to hide static texts, etc...

% AXES ---------------------------------------------------------------------------------------------------------
hdl.axes = axes('Parent',   hdl.mainfig,  ...
             'Units',   'Normalized', ...
          'Position',   [0.295 0.05 0.63 0.63*(4/3)]);

% PUSH BUTTONS -------------------------------------------------------------------------------------------------
hdl.donePB = uicontrol(hdl.mainfig,                          ...
                  'Position',   [0.85 0.91 0.075 0.075], ...
                    'String',   'Done',                  ...
                  'Fontsize',   16,                      ...
                     'Units',   'normalized',            ...
                'FontWeight',   'Bold');

% BUTTON GROUP and RADIO BUTTONS -------------------------------------------------------------------------------
hdl.buttonGroup = uibuttongroup('Parent',    hdl.mainfig,  ...
                          'FontSize',    16,           ...
                        'FontWeight',    'Bold',       ...
                   'BackgroundColor',    color,        ...
                             'Units',    'Normalized', ... 
                          'Position',    [0.05 0.69 0.2 0.2]);
titleBG = sprintf('Intensity\nNormalization');
set(hdl.buttonGroup, 'Title', titleBG);

hdl.VolumeRB = uicontrol(hdl.buttonGroup,                   ...
                             'Style',    'radiobutton', ...
                            'String',    'Volume',      ...
                          'FontSize',    14,            ...
                        'FontWeight',    'Bold',        ...
                             'Units',    'normalized',  ...
                   'BackgroundColor',    color,         ...
                          'Position',    [0.1 0.67 0.8 0.3]);

hdl.SliceRB = uicontrol(hdl.buttonGroup,                   ...
                            'Style',    'radiobutton', ...
                           'String',    'Slice',       ...
                         'FontSize',    14,            ...
                       'FontWeight',    'Bold',        ...
                            'Units',    'normalized',  ...
                  'BackgroundColor',    color,         ...
                         'Position',    [0.1 .25 0.8 0.3]);

end

Любые идеи о том, как я могу решить эти проблемы?

Большое спасибо заранее.

С уважением,

Fábio Nery

EDIT1: Я также очень открыт для предложений о лучших способах инициализации размеров и стратегий GUI для предотвращения проблем при запуске графических интерфейсов в разных мониторах/разрешениях экрана.

Ответ 1

Во-первых, хорошо сделано для того, чтобы не использовать GUIDE - вы прошли первый тест:)

Я настоятельно рекомендую вам взглянуть и использовать Ben Tordoff GUI Layout Toolbox. Хотя вы можете сделать это с помощью свойства ResizeFcn, я могу сказать вам, что это намного проще с помощью GUI Layout Toolbox, который просто позаботится об этом.

Управление графическим интерфейсом, который может выполняться на разных (возможно, нескольких) мониторах с разными размерами и разрешениями, является болью. Я бы рекомендовал указать перед собой диапазон размеров/разрешений, которые вы собираетесь поддерживать, и придерживаться этого (даже если ошибка окажется, если приложение окажется на неподдерживаемой настройке), вместо того, чтобы пытаться быть полностью общим. Если вам нужно заставить все работать даже на самой низкой общей установке знаменателя, вам, возможно, придется пожертвовать легкостью нас при более нормальной настройке.

Кажется, вы обнаружили get(0, 'ScreenSize') и команду movegui. Другие полезные вещи, которые приходят на ум, - это get(0, 'MonitorPositions'), get(0, 'ScreenPixelsPerInch') и использование свойства OuterPosition, а не Position фигур.

Надеюсь, что это поможет!

Ответ 2

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

В Интернете есть много документов о том, как их использовать. Например, это объясняет, как использовать его для uipanel: http://www.mathworks.com/help/matlab/creating_plots/using-panel-containers-in-figures--uipanels.html#f7-53231

Вы также можете ввести:

edit ([docroot '/techdoc/creation_plots/examples/doc_uipanel1']);

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

Ответ 3

Объявление uipanel в качестве родительского элемента uicontrol - это один из способов сделать размер шрифта MATLAB GUI независимым от разрешения экрана. Вам нужно установить fontunits как normalized до установки fontsize. Также установите fontsize в дробное значение от 0 до 1.

Пример кода выглядит следующим образом.

hp = uipanel(...);
uicontrol(hp,'text','fontunits','normalized','fontsize',0.5,...);

Предостережение этого подхода состоит в том, что fontsize будет масштабироваться с родительским объектом, который, вероятно, масштабируется с вашим окном приложения. В моих приложениях это поведение было желательным.

Ответ 4

вы можете использовать:

function yourfunction
scrsz = get(0,'ScreenSize');%Obtem o tamanho do monitor

hFigure = figure(...  %Insere Uma figura para construção da interface
    'NumberTitle','off',...
    'Menubar','none',...
    'Tag','Figure',...
    'Name','You Figure',...
    'Units','pixels',...
    'Resize','on',...
    'Position',[(scrsz(3)-300)/2 (scrsz(4)-600)/2 800 700]);

Button = uicontrol('parent',hFigure,...%Insere objeto do tipo Pushbutton!
    'Style','pushbutton',...
    'String','Processa',...
    'Units','normalized',... 
    'Position',[0.25 0.25 0.5 0.5],...
    'Callback',{@callbackButton}); 

function callbackButton(hObject,eventdata)
a = 1