MATLAB:自动调整GUI组件/字体的大小

fne*_*ery 11 matlab user-interface resize screen-resolution

我在尝试使我的MATLAB GUI 自动调整大小时遇到了问题.在彻底搜索网络寻求帮助和大量测试之后,我找不到解决方案.

我一直在笔记本电脑中开发一个简单的GUI(使用MATLAB,不使用GUIDE)(屏幕尺寸/分辨率= 1366x768).一个非常简化的版本如下所示:

GUI显示在笔记本电脑中

当我在台式计算机中运行相同的GUI(屏幕大小/分辨率= 1920x1080)时,它以下列方式显示:

GUI显示在桌面上

GUI的尺寸会在考虑屏幕尺寸的情况下自动初始化(代码在本文的底部提供).如您所见(红色箭头突出显示),组件之间的字体/间距不会自动调整大小,因此无论我们在何处运行文件,GUI都具有相同的方面.

此外,当手动调整GUI大小时,会出现一些组件重叠:

桌面上显示的GUI  - 手动调整大小后


用于此最小工作示例的代码如下:

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
Run Code Online (Sandbox Code Playgroud)

关于如何解决这些问题的任何想法?

非常感谢提前.

亲切的问候,

FábioNery

编辑1:我也非常乐意接受有关更好的方法来初始化GUI维度和策略的建议,以避免在不同的监视器/屏幕分辨率下运行GUI时出现问题.

Sam*_*rts 6

首先,不使用GUIDE做得好 - 你已经通过了第一次测试:)

我强烈建议您查看并使用Ben Tordoff的GUI Layout Toolbox.虽然你可以使用做这样的事情ResizeFcn的财产,我可以告诉你,这是迄今为止容易与GUI布局工具箱,刚刚照顾的那些东西给你.

管理可以在不同大小和分辨率的不同(可能是多个)监视器上运行的GUI是一件痛苦的事.我建议您预先指定一系列您将支持的大小/分辨率,并坚持这一点(即使应用程序发现自己处于不支持的设置时也会出错),而不是试图完全通用.如果你必须在一个最低的公分母设置上使一切工作,你可能不得不牺牲我们在更正常的设置.

你似乎已经发现get(0, 'ScreenSize')了这个movegui命令.我想到的其他有用的东西是get(0, 'MonitorPositions'),get(0, 'ScreenPixelsPerInch')使用数字OuterPosition而不是Position数字的属性.

希望有所帮助!


小智 0

您是否尝试过使用ResizeFcn命令?您可以使用它让 MATLAB 自动将单选按钮、面板等调整为您需要的任何大小。您可以使用此函数使按钮和面板的大小成为 GUI 尺寸的函数。

网上有很多关于如何使用它的文档。例如,这解释了如何将其用于 uipanel:http://www.mathworks.com/help/matlab/creating_plots/using-panel-containers-in-figures--uipanels.html#f7-53231

您还可以输入:

编辑([docroot'/techdoc/creating_plots/examples/doc_uipanel1']);

进入你的命令窗口来启动一个示例 GUI,其中他们使用调整大小函数来调整 GUI 中各种对象的大小。