2011-12-14 10 views
7

Actualmente tengo un gran dolor de cabeza para obtener una pequeña GUI que funciona bien, que no se está creando con el editor de GUI, sino mediante programación. Lo que tengo hasta ahora es algo como lo siguiente:Matlab: algo así como la posición "relativa" con uicontrol/eje; mantener los márgenes fijos al cambiar el tamaño de

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]); 

intenta cambiar el tamaño es: No lo hace 'aspecto' de la misma, lo que significa que las cajas uicontrol no se quedan en la misma posición relativa y la los márgenes desde el eje hasta la ventana de la figura se agrandan. Lo que quiero lograr es:

Tener una ventana de figura con una posición dada (x/y, ancho y alto) con una gráfica dentro. La trama tendrá un título y etiquetas para xey. Haga la gráfica como alto y ancho para tener el TightInset más un margen en cada dirección de un cierto tamaño de px (por ejemplo, TightInset + 10px) tan grande como la ventana de la figura; excepto dejar 150px de espacio libre a la izquierda para colocar algunos botones uicontrol, y mantenerlos en la misma posición: Esto sería lo mismo que poder dar la posición desde arriba/izquierda (arriba = 20, izquierda = 10) de abajo/izquierda.

¡Muchas gracias!

+0

¿hay realmente nadie que sabe la respuesta? ¡Eso es muy importante para mí y simplemente no puedo hacer que funcione correctamente! – tim

+0

Wtf, pero ¿por qué votar en este caso? No recibo a algunas personas, ya que es una pregunta legítima con una buena respuesta publicada por mí mismo. – tim

+0

Bueno, he buscado esto para la edad :-) Thx –

Respuesta

5

bien finalmente encontró una solución de trabajo que quería que fuera :-) Es de esperar que es atento para alguien interesado en él:

principal archivo de 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') 

Cambiar el tamaño de devolución de llamada Función:

% 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 

Puede pasar la función que desee llamar al cambiar el tamaño de la ventana de figura, por ejemplo para actualizar algo en la figura. En mi ejemplo es el myuiFunc(), que es la siguiente:

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 

me gusta :) Esperamos que usted también!

Editar: ¡No es necesario editar la función resizeCallback! Debería funcionar si le pasas los márgenes deseados y, si lo deseas, también un control de función con argumentos que se utilizarán para cada cambio de tamaño.

1

También puede usar unidades "Normalizadas".

+0

Por favor, dime cómo? ¡No quiero que los botones se cambien de tamaño en realidad! – tim

+0

En ese caso no puede usar. No me di cuenta por la publicación que no quieres que los botones se muevan. –

1

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

Cuestiones relacionadas