web-dev-qa-db-ja.com

MATLAB:GUIコンポーネント/フォントの自動サイズ変更

MATLAB GUIを作成しようとして問題が発生しました自動的にサイズ変更可能。 Webでヘルプと多くのテストを徹底的に検索した後、解決策を見つけることができませんでした。

私はラップトップ(画面サイズ/解像度= 1366x768)で簡単なGUI(MATLABを使用してGUIDEを使用せずに)を開発しています)。非常に単純化されたバージョンは次のようになります。

GUI displayed in the laptop

デスクトップコンピューターで同じGUIを実行すると(画面サイズ/解像度= 1920x108)、次のように表示されます。

GUI displayed in the desktop

GUIのサイズは、画面サイズを考慮して自動的に初期化されます(コードはこの投稿の下部にあります) 。ご覧のとおり(赤い矢印で強調表示されています)、コンポーネント間のフォント/間隔は自動的にサイズ変更されないため、ファイルをどこで実行しても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

これらの問題をどのように解決できるかについてのアイデアはありますか?

よろしくお願いします。

敬具、

ファビオ・ネリー

EDIT1:また、GUIのサイズを初期化するためのより良い方法と、さまざまなモニター/画面解像度でGUIを実行する際の問題を回避するための戦略についての提案を非常に受け入れています。

11
fnery

まず、GUIDEを使用しないことでよくできました-最初のテストに合格しました:)

Ben Tordoffの GUI Layout Toolbox を見て、使用することを強くお勧めします。 ResizeFcnプロパティを使用してこの種のことを行うことができますが、GUI Layout Toolboxを使用するとはるかに簡単であることがわかります。ただあなたのためにそのようなものの世話をします。

さまざまな(おそらく複数の)モニターでさまざまなサイズと解像度で実行される可能性のあるGUIを管理するのは面倒です。完全に一般的なものにするのではなく、サポートするサイズ/解像度の範囲を事前に指定し、それに固執することをお勧めします(アプリケーションがサポートされていないセットアップである場合でもエラーが発生します)。最小公分母の設定でもすべてを機能させる必要がある場合は、より通常の設定で私たちの使いやすさを犠牲にする必要があるかもしれません。

get(0, 'ScreenSize')moveguiコマンドを発見したようです。頭に浮かぶ他の便利なことは、get(0, 'MonitorPositions')get(0, 'ScreenPixelsPerInch')、および図のOuterPositionプロパティではなくPositionプロパティの使用です。

お役に立てば幸いです。

6
Sam Roberts

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を起動します。

0
anonymous

uipaneluicontrolの親として宣言することは、MATLABGUIフォントサイズを画面解像度に依存しないようにする1つの方法です。 fontunitsを設定する前に、normalizedfontsizeとして設定する必要があります。また、fontsizeを0から1までの小数値に設定します。

コード例は次のとおりです。

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

このアプローチの注意点は、fontsizeが親オブジェクトに合わせてスケーリングされることです。これは、アプリケーションウィンドウに合わせてスケーリングされる可能性があります。私のアプリケーションでは、この動作が望ましいものでした。

0
yellowjacket05

あなたが使用することができます:

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
0
sanhfari