MATLAB: redimensionnement automatique des composants / polices de l'interface graphique
Je vais avoir des problèmes en essayant de faire de mon MATLAB Interfaces graphiques automatiquement redimensionnables.
Après de manière exhaustive la recherche sur le web pour obtenir de l'aide et beaucoup de tests, je ne pouvais pas trouver une solution.
J'ai été le développement d'une interface utilisateur graphique simple (avec MATLAB, sans l'aide de GUIDE) dans mon ordinateur portable (taille de l'Écran/résolution = 1366x768). Une version très simplifiée ressemble à ceci:
Quand je lance la même interface graphique de mon ordinateur de bureau (taille de l'Écran/résolution = 1920x1080), il montre de la manière suivante:
Les dimensions de l'interface utilisateur sont automatiquement initialisés en tenant compte de la screensize (le code est fourni en bas de ce post). Comme vous pouvez le voir (indiquée par les flèches rouges), les polices de caractères/espacement entre les composants ne sont pas redimensionner automatiquement, de sorte que l'interface graphique a le même aspect, peu importe où nous exécutez le fichier.
En outre, lorsque le GUI est redimensionné manuellement, un certain chevauchement des composants se produit:
Le code utilisé pour ce travail minimale exemple est le suivant:
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
Toutes les idées de comment je peut résoudre ces problèmes?
Merci beaucoup à l'avance.
Salutations,
Fábio Nery
EDIT1: ailleurs, je suis très ouvert aux suggestions pour améliorer les moyens d'initialiser l'interface graphique des dimensions et des stratégies pour éviter les problèmes lors de l'exécution de Gui dans les différents moniteurs/résolution de l'écran.
source d'informationauteur fnery
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, bien fait pour ne pas utiliser le GUIDE - vous avez passé le premier test 🙂
Je vous recommande fortement de prendre un coup d'oeil à, et l'utilisation, Ben Tordoff de Boîte à outils d'interface utilisateur. Bien que vous pouvez faire ce genre de chose à l'aide de la
ResizeFcn
bien, je peux vous dire que c'est loin plus facile avec une interface graphique Mise en page boîte à outils, qui prend soin de ce genre de choses pour vous.La gestion d'une interface graphique qui peut être exécuté sur différentes (peut-être plusieurs) de moniteurs de différentes tailles et résolutions est une douleur. J'avais recommandons de spécifier à l'avant d'une gamme de tailles/résolutions que vous allez à l'appui, et de s'y tenir (même erroring si l'application se trouve sur une non prise en charge de l'installation), plutôt que d'essayer d'être pleinement général. Si vous avez à faire tout le travail, même sur un plus petit dénominateur commun de l'installation, vous pourriez avoir à sacrifier la facilité d'entre nous sur un niveau plus normal de l'installation.
Vous semblez avoir découvert
get(0, 'ScreenSize')
et lamovegui
de commande. D'autres choses utiles qui viennent à l'esprit sontget(0, 'MonitorPositions')
get(0, 'ScreenPixelsPerInch')
et à l'aide de laOuterPosition
plutôt quePosition
propriété de chiffres.Espère que ça aide!
Avez-vous essayé d'utiliser le ResizeFcn commande? Vous pouvez l'utiliser pour avoir MATLAB redimensionner automatiquement vos composants radiobutton, panneaux, etc. de n'importe quelle taille vous avez besoin. Vous pouvez utiliser cette fonction pour faire la taille de vos boutons et des panneaux de fonction de l'interface graphique dimesnions.
Il y a beaucoup de documenetation en ligne sur la façon de l'utiliser. Par exemple, ce qui explique comment l'utiliser pour une uipanel: http://www.mathworks.com/help/matlab/creating_plots/using-panel-containers-in-figures--uipanels.html#f7-53231
Vous pouvez également taper:
dans votre fenêtre de commande pour lancer un exemple d'interface graphique dans laquelle ils utilisent la fonction de redimensionnement redimensionner des objets divers au sein de l'interface.
La déclaration d'une
uipanel
tant que parent d'unuicontrol
est une manière de faire de MATLAB GUI tailles de police indépendant de la résolution de l'écran. Vous devez définir lafontunits
commenormalized
avant le réglage de lafontsize
. Également définir lafontsize
à une valeur décimale entre 0 et 1.Un exemple de code est comme suit.
L'inconvénient de cette approche est que la
fontsize
de mise à l'échelle avec le parent de l'objet, ce qui a probablement échelles avec votre fenêtre d'application. Dans mes applications, ce comportement a été souhaitable.vous pouvez utiliser: