2011-12-14 10 views
7

Attualmente ho un gran mal di testa per far funzionare bene una piccola GUI che non viene creata con l'editor della GUI ma programmaticamente! Quello che ho finora è qualcosa di simile al seguente:Matlab: Qualcosa come la posizione "relativa" con uicontrollo/asse; mantenere i margini fissi durante il ridimensionamento

hFig = figure(); 
set(hFig, 'Position', [300 200 500 400]); 
plot((1:10).^2, '*-r'); 

% Größe des Plots so anpassen, dass links Platz für Buttons 
ap = get(gca, 'TightInset'); 
fp = get(gcf, 'Position'); 
set(gca, 'Position', [160/fp(3), 30/fp(4), (fp(3)-180)/fp(3), (fp(4)-60)/fp(4)]); 

uicontrol('Style', 'pushbutton', 'String', 'foo', 'Position', [15 fp(4)-60 110 30]); 
uicontrol('Style', 'pushbutton', 'String', 'bar', 'Position', [15 fp(4)-100 110 30]); 

tenta di ridimensionare esso: E non 'look' lo stesso, il che significa che le scatole Uicontrol non rimanere nella stessa posizione relativa e la i margini dall'asse alla finestra della figura diventano più grandi. Quello che voglio ottenere è:

Avere una finestra di figura con una posizione data (x/y, larghezza e altezza) con una trama all'interno. La trama avrà un titolo e le etichette per x e y. Crea il grafico come altezza e larghezza in modo che TightInset aggiunga un margine in ciascuna direzione di una determinata dimensione px (ad esempio TightInset + 10px) grande quanto la finestra della figura; eccetto lasciare 150px di spazio libero a sinistra per posizionare alcuni pulsanti di controllo e mantenerli nella stessa posizione: sarebbe lo stesso di essere in grado di dare la posizione dall'alto/a sinistra (in alto = 20, a sinistra = 10) di fondo/sinistra.

Grazie mille!

+0

c'è davvero nessuno che conosce una risposta? Questo è probabilmente importante per me e semplicemente non riesco a farlo funzionare correttamente! – tim

+0

Mi spiace, ma perché votare su questo? Non capisco alcune persone perché è una domanda legittima con una bella risposta pubblicata da me stesso. – tim

+0

Bello, ho cercato questo per età :-) Thx –

risposta

5

Va bene finalmente trovato una soluzione di lavoro ho voluto che fosse :-) Speriamo che sia utile per qualcuno interessato a esso:

principale file di script:

p = [300 300 1000 600]; 
fixedMargins = [250 0 0 0]; % [left, top, right, bottom] 
f = figure('Position', p, 'Color', [0.9 0.9 0.9]); 
plot(-10:10, (-10:10).^3, '*-r'); 
set(f, 'ResizeFcn', {@resizeCallback, gca, fixedMargins, {@myuiFunc, f, 40, 50}}); 

title('bla') 
xlabel('foooooooooo') 
ylabel('barrrrrrr') 

Ridimensiona Callback Funzione:

% Need to pass the handle of the axis to modify (hAx) AND to pass the 
% desired margins as second extra callback argument: 
% [left, top, right, bottom]! 
function resizeCallback(hFig, ~, hAx, fixedMargins, func)  
    % Disable automatic rezising 
    set(hAx, 'Units', 'pixels'); 

    % Figure-Size 
    fp = get(hFig, 'Position'); 

    % Calculate Position of the axis 
    margin = get(hAx, 'TightInset') * [-1 0 1 0; 0 -1 0 1; 0 0 1 0; 0 0 0 1]; 

    % Position to fill the figure minus the TightInset-Margin 
    newPos = [0 0 fp(3:4)] - margin; 

    % Change position based on margins 
    newPos(1) = newPos(1) + fixedMargins(1); 
    newPos(3) = newPos(3) - fixedMargins(1) - fixedMargins(3); 
    newPos(2) = newPos(2) + fixedMargins(4); 
    newPos(4) = newPos(4) - fixedMargins(2) - fixedMargins(4); 

    % Set new position 
    set(hAx, 'Position', newPos); 

    % Call UI-Func 
    if(nargin == 5) 
     f = func{1}; 
     args = func(2:end); 
     f(args{:}); 
    end 
end 

È possibile passare qualsiasi funzione che si desidera chiamare durante il ridimensionamento della finestra di figura, ad esempio per aggiornare qualcosa nella figura. Nel mio esempio è la myuiFunc(), che è la seguente:

function myuiFunc(hFig, left, top) 
    persistent handles; 

    if(~isempty(handles)) 
     delete(handles); 
     handles = []; 
    end 

    fp = get(hFig, 'Position'); 
    h1 = uicontrol('Style', 'pushbutton', 'String', 'Foo','Position', [left fp(4)-top 100 35]); 
    h2 = uicontrol('Style', 'pushbutton', 'String', 'Bar','Position', [left fp(4)-top-50 100 35]); 
    handles = [h1 h2]; 
end 

I like it :) Speriamo che anche voi!

Edit: Non c'è bisogno di modificare la funzione resizeCallback! Dovrebbe funzionare se si passano i margini desiderati e se lo si desidera, inoltre una funzione gestisce con argomenti che verranno chiamati per ogni ridimensionamento!

1

È inoltre possibile utilizzare unità "Normalizzate".

+0

Per favore dimmi come? Non voglio che i pulsanti vengano ridimensionati in realtà! – tim

+0

In tal caso non è possibile utilizzare. Dal post non mi sono reso conto che non vuoi che i pulsanti si muovano. –

1

uicontrol('Style', 'pushbutton', 'String', 'foo', 'Units','normalized','Position', [0.90 0.05 0.08 0.08]);

Problemi correlati